Почему Эластик не выводит документы, в которых другой падеж

У меня на интересующие поля привязан плагин русской морфологии. Маппинги на индекс выглядят следующим образом:

PUT  reg-document
{
    "settings" : {
      "index" : {
        "analysis" : {
          "filter" : {
            "ru_stopwords" : {
              "type" : "stop",
              "stopwords" : "а,без,более,бы,был,была,были,было,быть,в,вам,вас,весь,во,вот,все,всего,всех,вы,где,да,даже,для,до,его,ее,если,есть,еще,же,за,здесь,и,из,или,им,их,к,как,ко,когда,кто,ли,либо,мне,может,мы,на,надо,наш,не,него,нее,нет,ни,них,но,ну,о,об,однако,он,она,они,оно,от,очень,по,под,при,с,со,так,также,такой,там,те,тем,то,того,тоже,той,только,том,ты,у,уже,хотя,чего,чей,чем,что,чтобы,чье,чья,эта,эти,это,я,a,an,and,are,as,at,be,but,by,for,if,in,into,is,it,no,not,of,on,or,such,that,the,their,then,there,these,they,this,to,was,will,with,материть"
            },
            "search_synonym" : {
              "type" : "synonym",
              "synonyms" : [
                "снилс, страховой номер индивидуального лицевого счета",
              ]
            }
          },
          "analyzer" : {
            "ru_search_analyzer" : {
              "char_filter": [
                "html_strip"
              ],
              "filter" : [
                "lowercase",
                "search_synonym",
                "russian_morphology",
                "english_morphology",
                "ru_stopwords"
              ],
              "type" : "custom",
              "tokenizer" : "standard"
            },
             "suggest_analyzer": {
                 "type": "custom",
                 "tokenizer": "standard",
                 "filter": [
                     "lowercase",
                     "search_synonym"
                 ]
             }
          }
        }
      }
    },
    "mappings" : {
      "properties" : {
        "uuid" : {
          "type" : "text"
        },
        "similar_questions" : {
          "type" : "text",
          "analyzer" : "ru_search_analyzer"
        },
        "keywords" : {
          "type" : "keyword"
        },
        "content_suggest": {
            "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          },
          "analyzer" : "ru_search_analyzer"
        },
        "name_suggest": {
          "type": "text",
          "analyzer" : "suggest_analyzer"
        }
      }
    }
}

А также есть поисковый запрос, который ищет по интересующим нас полям:

POST reg-document/_search
{
  "from": 0,
  "size": 10,
  "query": {
    "bool": {
      "filter": [
        {
          "terms": {
            "entity": [
              "nsi"
            ],
            "boost": 1
          }
        }
      ],
      "should": [
        {
          "dis_max": {
            "tie_breaker": 0.7,
            "queries": [
              {
                "match": {
                  "content_suggest": {
                    "query": "севастополь",
                    "operator": "OR",
                    "prefix_length": 0,
                    "max_expansions": 50,
                    "minimum_should_match": "2<75%",
                    "fuzzy_transpositions": true,
                    "lenient": false,
                    "zero_terms_query": "NONE",
                    "auto_generate_synonyms_phrase_query": true,
                    "boost": 0.4
                  }
                }
              },
              {
                "match_phrase": {
                  "content_suggest": {
                    "query": "севастополь",
                    "slop": 4,
                    "zero_terms_query": "NONE",
                    "boost": 0.6
                  }
                }
              }
            ],
            "boost": 0.3
          }
        },
        {
          "dis_max": {
            "tie_breaker": 0.7,
            "queries": [
              {
                "match": {
                  "name_suggest": {
                    "query": "севастополь",
                    "operator": "OR",
                    "prefix_length": 0,
                    "max_expansions": 50,
                    "minimum_should_match": "2<75%",
                    "fuzzy_transpositions": true,
                    "lenient": false,
                    "zero_terms_query": "NONE",
                    "auto_generate_synonyms_phrase_query": true,
                    "boost": 0.4
                  }
                }
              },
              {
                "match_phrase": {
                  "name_suggest": {
                    "query": "севастополь",
                    "slop": 2,
                    "zero_terms_query": "NONE",
                    "boost": 0.6
                  }
                }
              }
            ],
            "boost": 0.3
          }
        },
        {
          "dis_max": {
            "tie_breaker": 0.7,
            "queries": [
              {
                "match": {
                  "similar_questions": {
                    "query": "севастополь",
                    "operator": "OR",
                    "prefix_length": 0,
                    "max_expansions": 50,
                    "minimum_should_match": "2<75%",
                    "fuzzy_transpositions": true,
                    "lenient": false,
                    "zero_terms_query": "NONE",
                    "auto_generate_synonyms_phrase_query": true,
                    "boost": 0.4
                  }
                }
              },
              {
                "match_phrase": {
                  "similar_questions": {
                    "query": "севастополь",
                    "slop": 2,
                    "zero_terms_query": "NONE",
                    "boost": 0.6
                  }
                }
              }
            ],
            "boost": 0.2
          }
        },
        {
          "match_phrase": {
            "keywords": {
              "query": "севастополь",
              "slop": 1,
              "zero_terms_query": "NONE",
              "boost": 0.2
            }
          }
        }
      ],
      "adjust_pure_negative": true,
      "minimum_should_match": "1",
      "boost": 1
    }
  }
}

Пользователи начали замечать, что некоторые слова учитываются при поиске, только если менять склонение. Например:

При поиске Севастополь находит 5 документов:

И при поиске Севастополю уже 6:

Анализатор приводит все к одному и тому же токену:

GET reg-document/_analyze
{
  "analyzer" : "russian_morphology",
  "text" : "Севастополя"
}

Response:
{
  "tokens" : [
    {
      "token" : "севастополь",
      "start_offset" : 0,
      "end_offset" : 11,
      "type" : "<ALPHANUM>",
      "position" : 0
    }
  ]
}


GET reg-document/_analyze
{
  "analyzer" : "russian_morphology",
  "text" : "Севастополь"
}

Response:
{
  "tokens" : [
    {
      "token" : "севастополь",
      "start_offset" : 0,
      "end_offset" : 11,
      "type" : "<ALPHANUM>",
      "position" : 0
    }
  ]
}

Где я мог свернуть не туда при написании запроса?

Вы ищите по двум полям, но только одно из них использует плагин морфологии.

1 Like

Спасибо. Моя невнимательность - это просто ужас...