#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 находится не там, где она должна быть).