почему elasticsearch подсчитывает оценку для срочных запросов?
Я хочу сделать простой запрос, основанный на знании уникального значения поля с помощью запроса термина. Например:
{
"query": {
"term": {
"products.product_id": {
"value": "Ubsdf-234kjasdf"
}
}
}
}
Что касается term queries
, В документации Elasticsearch указано:
Возвращает документы, содержащие точный термин в указанном поле. Вы можете использовать запрос термина для поиска документов на основе точного значения, такого как цена, идентификатор продукта или имя пользователя.
С другой стороны, документация также предполагает, что _score
вычисляется для запросов, в которых имеет значение релевантность (и не относится к контексту фильтра, который предполагает точное соответствие).
Я нахожу это немного запутанным. Почему Elasticsearch вычисляет_score
для термических запросов, которые должны касаться точного соответствия, а не релевантности?
2 ответа
Термические запросы не анализируются, следовательно, они не проходят фазу анализа, поэтому используются для точного совпадения, но их оценка по-прежнему вычисляется при использовании в контексте запроса.
Когда вы используете термические запросы в контексте фильтра, это означает, что вы не выполняете поиск по ним, а, скорее, выполняете фильтрацию по ним, поэтому для них не рассчитывается оценка.
Дополнительная информация о контексте запроса и фильтра в официальном документе ES.
Оба примера запроса термина в фильтре и контексте запроса показаны в моем нижеприведенном примере
Срок запроса в контексте запроса
{
"query": {
"bool": {
"must": [
{
"term": {
"title": "c"
}
}
]
}
},
"size": 10
}
И результат со счетом
"hits": [
{
"_index": "cpp",
"_type": "_doc",
"_id": "4",
"_score": 0.2876821, --> notice score is calculated
"_source": {
"title": "c"
}
}
]
Срок запроса в контексте фильтра
{
"query": {
"bool": {
"filter": [ --> prev cluase replaced by `filter`
{
"term": {
"title": "c"
}
}
]
}
},
"size": 10
}
И результат поиска с контекстом фильтра
"hits": [
{
"_index": "cpp",
"_type": "_doc",
"_id": "4",
"_score": 0.0, --> notice score is 0.
"_source": {
"title": "c"
}
}
]
Контекст фильтра означает, что вам нужно обернуть запрос термина внутриbool/filter
запрос, например:
{
"query": {
"bool": {
"filter": {
"term": {
"products.product_id": {
"value": "Ubsdf-234kjasdf"
}
}
}
}
}
}
Вышеупомянутый запрос не будет вычислять оценки.