почему 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"
          }
        }
      }
    }
  }
}

Вышеупомянутый запрос не будет вычислять оценки.

Другие вопросы по тегам