Elasticsearch: поиск с помощью специальных символов, открывающих и закрывающих круглые скобки.

Привет, я пытаюсь найти слово, в котором есть эти символы '(', ')' в эластичном поиске. Я не могу получить ожидаемый результат.

Это запрос, который я использую

{
"query": {
    "query_string" : {
        "default_field" : "name",
        "query" : "\\(Pas\\)ta\""
    }
}}

В результате я получаю записи с "ПАСТОРЫ", "ПРОШЛОЕ", "ПАСКАЛЬ", "СТРАСТЬ" в первую очередь. Я хочу, чтобы название "Pizza & (Pas)ta" было первой записью в результатах поиска, так как оно лучше всего подходит.

Вот анализатор поля имени в схеме

"analysis": {
  "filter": {
    "autocomplete_filter": {
      "type": "edge_ngram",
      "min_gram": "1",
      "max_gram": "20"
    }
  },
  "analyzer": {
    "autocomplete": {
      "type": "custom",
      "tokenizer": "standard",
      "filter": [
        "lowercase",
        "autocomplete_filter"
      ]
    }
  }

 "name": {
        "analyzer": "autocomplete",
        "search_analyzer": "standard",
        "type": "string"
   },

Пожалуйста, помогите мне исправить это, спасибо


person Ramesh    schedule 02.08.2019    source источник


Ответы (1)


Вы использовали токенизатор standard, который удаляет ( и ) из сгенерированных токенов. Вместо получения токена (pas)ta одним из сгенерированных токенов является pasta, и, следовательно, вы не получаете совпадение для (pas)ta.

Вместо использования токенизатора standard вы можете использовать токенизатор whitespace, который сохранит все специальные символы в имени. Измените определение анализатора на следующее:

  "analyzer": {
    "autocomplete": {
      "type": "custom",
      "tokenizer": "whitespace",
      "filter": [
        "lowercase",
        "autocomplete_filter"
      ]
    }
  }
person Nishant    schedule 02.08.2019
comment
Спасибо! @Nishant Saini Есть ли какие-либо другие побочные эффекты, если я изменю токенизатор на пробел со стандартного? Есть ли способ передать анализатор в запросе без изменения схемы? - person Ramesh; 02.08.2019
comment
Оба являются разными whitespace tokenize на основе пространства, тогда как standard tokenize обеспечивает токенизацию на основе грамматики. Вы можете передать анализатор в запрос, но это не поможет, так как он будет применен к входной строке запроса. - person Nishant; 02.08.2019
comment
Я изменил токенизатор на пробел, это из-за search_analyzer: standard , если да, то как это исправить - person Ramesh; 13.08.2019