Почему ElasticSearch не может выполнять поиск, когда доступны специальные символы? - PullRequest
0 голосов
/ 17 октября 2018

У меня есть индекс ElasticSearch с конфигурацией ниже:

{
  "my_ind": {
    "settings": {
      "index": {
        "mapping": {
          "total_fields": {
            "limit": "10000000"
          }
        },
        "number_of_shards": "3",
        "provided_name": "my_ind",
        "creation_date": "1539773409246",
        "analysis": {
          "analyzer": {
            "default": {
              "filter": [
                "lowercase"
              ],
              "type": "custom",
              "tokenizer": "whitespace"
            }
          }
        },
        "number_of_replicas": "1",
        "uuid": "3wC7i-E_Q9mSDjnTN2gxrg",
        "version": {
          "created": "5061299"
        }
      }
    }
  }
}

Я хочу выполнить поиск по содержанию ниже с помощью простого поиска:

DL-1234170386456

Это содержимое доступно в поле ниже:

DNumber

В этом поле показано следующее:

{
  "DNumber": {
    "type": "text",
    "fields": {
      "keyword": {
        "type": "keyword",
        "ignore_above": 256
      }
    }
  }
}

Я пытаюсь реализовать его на языке JAVA.Я столкнулся с анализаторами и токенизаторами ElasticSearch, поэтому использовал токенизатор " whitespace ".

Я пытаюсь выполнить поиск по следующему запросу:

{
  "query": {
    "multi_match": {
      "query": "DL-1234170386456",
      "fields": [
        "_all"
      ],
      "type": "best_fields",
      "operator": "OR",
      "analyzer": "default",
      "slop": 0,
      "prefix_length": 0,
      "max_expansions": 50,
      "lenient": false,
      "zero_terms_query": "NONE",
      "boost": 1
    }
  }
}

Что не такЯ делаю?

1 Ответ

0 голосов
/ 15 ноября 2018

После долгих исследований и проб и ошибок выяснил ответ!

Некоторые основные, но важные моменты:

  • Нам нужно указать анализаторыи токенизаторы при создании / индексации индекса / данных.
  • В указанной строке, т. е. «DL-1234170386456», доступен специальный символ (т. е. «-»), а ElasticSearch по умолчанию использует Стандартный анализатор .
  • Стандартный анализатор содержит Стандартный токенизатор , основанный на алгоритме сегментации текста Unicode.

Актуальная проблема:

ElasticSearch разделяет строку («DL-1234170386456») на две разные части, такие как «DL» и «1234170386456».

Решение:

  • Нам нужно указать Анализатор пробелов , который содержит Токенайзер пробелов .
  • Он будет разбивать слово всякий раз, когда встречается пробел.Таким образом, String ("DL-1234170386456") будет сохранен как есть в ElasticSearch, и мы сможем это выяснить.
...