Подтвердить что ты не робот

Соответствие elasticsearch vs term query

Я использую поиск по запросу для запроса "request.method": "GET":

    {
      "query": {
        "filtered": {
          "query": {
            "match": {
              "request.method": "GET"
            }
          },
          "filter": {
            "bool": {
              "must": [
...

Как и ожидалось, запрос соответствия может получить результаты, как показано ниже:

enter image description here

Но вопрос в том, когда вы используете запрос Term, результатов нет.

Обновите запрос, чтобы изменить "соответствие" на "term", и сохраните остальную часть:

{
  "query": {
    "filtered": {
      "query": {
        "term": {
          "request.method": "GET"
        }
      },
      "filter": {
        "bool": {
          "must": [
...

Я думаю, что запрос Term - это "не анализированная" версия запроса Match. Как показано на рисунке выше, существует по крайней мере одна запись имеет "request.method", равный "GET". Почему нет результатов для вышеупомянутого запроса Term? Спасибо.

enter image description here

4b9b3361

Ответ 1

Предполагая, что вы используете Standard Analyzer GET, становится GET при сохранении в индексе. В исходном документе все еще будет оригинал "GET".

Запрос match будет применять тот же стандартный анализатор к поисковому запросу и поэтому будет соответствовать тому, что хранится в индексе. В запросе term не применяются анализаторы к поисковому запросу, поэтому он будет искать только этот точный термин в инвертированном индексе.

Чтобы использовать термин query в вашем примере, измените верхний регистр "GET" на нижний регистр "get" или измените ваше сопоставление, чтобы поле request.method было установлено на not_analyzed.