Анализатор синонимов эластичного поиска дает 0 результатов - PullRequest
0 голосов
/ 13 апреля 2019

Я использую elasticsearch 7.0.0.

Я пытаюсь работать на synonyms с этой конфигурацией при создании index.

{
  "settings": {
    "index": {
      "analysis": {
        "analyzer": {
          "synonym": {
            "tokenizer": "whitespace",
            "filter": [
              "synonym"
            ]
          }
        },
        "filter": {
          "synonym": {
            "type": "synonym",
            "synonyms_path": "synonyms.txt"
          }
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "address.state": {
        "type": "text",
        "analyzer": "synonym"
      },
      "location": {
        "type": "geo_point"
      }
    }
  }
}

Вот документ, вставленный в указатель:

{
  "name": "Berry's Burritos",
  "description": "Best burritos in New York",
  "address": {
    "street": "230 W 4th St",
    "city": "New York",
    "state": "NY",
    "zip": "10014"
  },
  "location": [
    40.7543385,
    -73.976313
  ],
  "tags": [
    "mexican",
    "tacos",
    "burritos"
  ],
  "rating": "4.3"
}

Также содержание в synonyms.txt:

ny, new york, big apple

Когда я пытался что-то искать в свойстве address.state, я получал empty результат.

Вот запрос:

{
  "query": {
    "bool": {
      "filter": {
        "range": {
          "rating": {
            "gte": 4
          }
        }
      },
      "must": {
        "match": {
          "address.state": "ny"
        }
      }
    }
  }
}

Даже с ny (как есть: без синонима) в запросе, результат пуст.

Раньше, когда я создавал индекс без mappings, запрос использовался для получения результата, кроме синонимов.

Но теперь с mappings результат пустой, хотя термин присутствует.

Этот запрос работает, хотя: { "запрос": { "Строка запроса": { "запрос": "тако", "поля": [ «метка» ] } } }

Я посмотрел и исследовал множество статей / учебных пособий и дошел до этого.

Что мне здесь не хватает сейчас?

1 Ответ

3 голосов
/ 13 апреля 2019

При индексации вы передаете значение как "state":"NY". Обратите внимание на случай NY. Анализатор synonym определяют в настройках только один фильтр, т.е. synonym. NY не соответствует ни одному набору синонимов, определенных в synonym.txt из-за регистра. Обратите внимание, что NY не равно ny. Чтобы решить эту проблему (или мы можем назвать ее без учета регистра), добавьте фильтр lowercase перед фильтром synonym в анализатор synonym. Это будет гарантировать, что любой входной текст будет в нижнем регистре, а затем будет применен фильтр синонимов. То же самое произойдет, когда вы будете искать в этом поле, используя полнотекстовые поисковые запросы.

Так что ваши настройки будут такими, как показано ниже:

  "settings": {
    "index": {
      "analysis": {
        "analyzer": {
          "synonym": {
            "tokenizer": "whitespace",
            "filter": [
              "lowercase",
              "synonym"
            ]
          }
        },
        "filter": {
          "synonym": {
            "type": "synonym",
            "synonyms_path": "synonyms.txt"
          }
        }
      }
    }
  }

Никаких изменений в отображении не требуется.

Почему это изначально работало?

Ответ на этот вопрос заключается в том, что, когда вы не определили какое-либо отображение, упругое отображение будет address.state как text поле без явного анализатора, определенного для поля. В этом случае эластичный поиск по умолчанию использует стандартный анализатор , который использует фильтр токенов в нижнем регистре в качестве одного из фильтров. и, следовательно, запрос соответствует документу.

...