Elasticsearch: minimum_should_match не работает

#elasticsearch

#elasticsearch

Вопрос:

Я пытаюсь использовать триграммы для сложных слов в соответствии с официальными документами здесь: https://www.elastic.co/guide/en/elasticsearch/guide/current/ngrams-compound-words.html

Но, похоже, мой индекс полностью игнорирует minimum_should_match параметр.

Соответствующий бит index _settings:

 {
  "settings": {
    "index": {
      "analysis": {
        "filter": {
          "trigrams": {
            "type": "ngram",
            "min_gram": "3",
            "max_gram": "3"
          }
        }
      }
    }
  }
}
 

Соответствующий бит _mapping:

 {
  "myindex" : {
    "mappings" : {
      "story" : {
        "properties" : {
          "mediaObjects" : {
            "type" : "nested",
            "analyzer" : "standard",
            "title" : {
              "type" : "string",
              "fields" : {
                "trigram" : {
                  "type" : "string",
                  "analyzer" : "term_trigram"
                }
              }
            }
          }
        }
      }
    }
  }
}
 

Затем этот запрос:

 {
  "_source": ["mediaObjects.title"],
  "query": {
    "nested": {
      "path": "mediaObjects",
      "query": {
        "match": {
          "mediaObjects.title.trigram": {
            "query": "rute",
            "minimum_should_match": 2
          }
        }
      }
    }
  }
}
 

Теперь я понимаю, что это приведет к появлению триграмм «rut» и «ute», и что minimum_should_match параметр требует, чтобы оба совпадали (это упрощенный пример, иллюстрирующий рассматриваемую проблему). Результаты приведенного выше запроса:

 {
   "hits": {
      "hits": [
         {
            "_type": "story",
            "_id": "9c9cd49e-5ff0-4811-9cd4-9e5ff0d81167",
            "_score": 10.104477,
            "_source": {
               "mediaObjects": [
                  {"title": "Gullruten"}
               ]
            }
         },
         {
            "_type": "story",
            "_id": "7a4e6883-f532-49c5-8e68-83f532a9c554",
            "_score": 2.8516788,
            "_source": {
               "mediaObjects": [
                  {"title": "Ulovlig skuter"}
               ]
            }
         },
         {
            "_type": "story",
            "_id": "058ca4e5-4d41-4603-8ca4-e54d41e603b9",
            "_score": 2.5049565,
            "_source": {
               "mediaObjects": [
                  {"title": "zz-uten-typenavn-210716"}
               ]
            }
         }
      ]
   }
}
 

Насколько я понимаю, здесь действительно принадлежит только первое. Я проверил это , вручную создав bool запрос с двумя триграммами и a minimum_number_should_match . Что я делаю не так?

Объяснено:

 {
  "hits": {
    "total": 3,
    "max_score": 10.104477,
    "hits": [
      {
        "_shard": 0,
        "_node": "nxQQqSo7RcqtRMvIsavm4A",
        "_type": "story",
        "_id": "9c9cd49e-5ff0-4811-9cd4-9e5ff0d81167",
        "_score": 10.104477,
        "_source": {
          "mediaObjects": [
            {
              "title": "tittel"
            },
            {
              "title": "Gullruten"
            }
          ]
        },
        "_explanation": {
          "value": 10.104477,
          "description": "sum of:",
          "details": [
            {
              "value": 10.104477,
              "description": "Score based on child doc range from 0 to 1",
              "details": []
            },
            {
              "value": 0,
              "description": "match on required clause, product of:",
              "details": [
                {
                  "value": 0,
                  "description": "# clause",
                  "details": []
                },
                {
                  "value": 0.098966025,
                  "description": "#*:* -_type:__*, product of:",
                  "details": [
                    {
                      "value": 1,
                      "description": "boost",
                      "details": []
                    },
                    {
                      "value": 0.098966025,
                      "description": "queryNorm",
                      "details": []
                    }
                  ]
                }
              ]
            }
          ]
        }
      },
      {
        "_shard": 0,
        "_node": "nxQQqSo7RcqtRMvIsavm4A",
        "_type": "story",
        "_id": "7a4e6883-f532-49c5-8e68-83f532a9c554",
        "_score": 2.8516788,
        "_source": {
          "mediaObjects": [
            {
              "title": "Ulovlig skuter"
            },
            {
              "title": "Ulovlig skuter"
            }
          ]
        },
        "_explanation": {
          "value": 2.8516788,
          "description": "sum of:",
          "details": [
            {
              "value": 2.8516788,
              "description": "Score based on child doc range from 328 to 329",
              "details": []
            },
            {
              "value": 0,
              "description": "match on required clause, product of:",
              "details": [
                {
                  "value": 0,
                  "description": "# clause",
                  "details": []
                },
                {
                  "value": 0.098966025,
                  "description": "#*:* -_type:__*, product of:",
                  "details": [
                    {
                      "value": 1,
                      "description": "boost",
                      "details": []
                    },
                    {
                      "value": 0.098966025,
                      "description": "queryNorm",
                      "details": []
                    }
                  ]
                }
              ]
            }
          ]
        }
      },
      {
        "_shard": 3,
        "_node": "dKU8Zq1JQUq7PQiOrw9d5g",
        "_type": "story",
        "_id": "058ca4e5-4d41-4603-8ca4-e54d41e603b9",
        "_score": 2.5049565,
        "_source": {
          "mediaObjects": [
            {
              "title": "zz-uten-typenavn-210716"
            }
          ]
        },
        "_explanation": {
          "value": 2.5049565,
          "description": "sum of:",
          "details": [
            {
              "value": 2.5049565,
              "description": "Score based on child doc range from 712 to 712",
              "details": []
            },
            {
              "value": 0,
              "description": "match on required clause, product of:",
              "details": [
                {
                  "value": 0,
                  "description": "# clause",
                  "details": []
                },
                {
                  "value": 0.09091643,
                  "description": "#*:* -_type:__*, product of:",
                  "details": [
                    {
                      "value": 1,
                      "description": "boost",
                      "details": []
                    },
                    {
                      "value": 0.09091643,
                      "description": "queryNorm",
                      "details": []
                    }
                  ]
                }
              ]
            }
          ]
        }
      }
    ]
  }
}
 

Комментарии:

1. Выглядит правильно на первый взгляд. Можете ли вы выполнить свой запрос через explain api? Добавьте {«explain»:true} к запросу на верхнем уровне.

2. Конечно, я забыл. Это мне не очень помогает, может быть, кто-то еще может что-то прочитать из этого. Отредактировал сообщение, чтобы добавить его.

3. Использование конечной точки запроса validate для объяснения заставляет меня думать, что на самом деле это ошибка. Запрос неправильно расширяется в bool (подсказка minimum_shoul_match находится не там, где она должна быть).