Содержит запрос или частичное совпадение в Elasticsearch - PullRequest
0 голосов
/ 27 сентября 2018

Я ищу слово «изменить», которое может присутствовать в данных как «изменение», «изменение» или даже «изменение».Какой лучший способ поиска слов, подобных этим?Я знаю, что подстановочный знак может достичь этого, но я ограничен в том, чтобы не использовать его из-за моей другой части кода.Каковы различные способы, которые обеспечивают лучшую производительность поиска?

Ответы [ 3 ]

0 голосов
/ 27 сентября 2018

Существует несколько способов:

Поскольку вы упоминаете, что вы не можете использовать подстановочный знак, тогда перейдите к query_string

{  
   "query":{  
      "query_string":{  
         "default_field":"text",
         "query":"*amend"
      }
   }
}

Во-вторых, вы можете использовать токенайзер n-граммы.Вы можете проверить здесь https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-ngram-tokenizer.html

Это сломает ваше значение, «изменяя» такие слова, как [«ame», «men», «end» ... и т.д.]

Как только вы закончитес применением n-граммового токена, начните индексировать ваши данные.

Вы можете запросить, как показано ниже:

{"query":{"term":{"text":"amend"}}}

Вы получите свой выходной результат.

0 голосов
/ 27 сентября 2018

То, что вы описываете с помощью терминов «поправка», «поправка» и «изменение», называется ключевым словом stemming.Вы можете добавить маркерный фильтр в настройки эластичного индекса.

Например:

PUT /my_index
{
    "settings": {
        "analysis" : {
            "analyzer" : {
                "my_analyzer" : {
                    "tokenizer" : "standard",
                    "filter" : ["standard", "lowercase", "my_stemmer"]
                }
            },
            "filter" : {
                "my_stemmer" : {
                    "type" : "stemmer",
                    "name" : "english"
                }
            }
        }
    }
}

При использовании этого стемера будут индексироваться термины [amend, amending, amendment] как [amend, amend, amend].

Затем вы можете выполнить запрос match идолжен вернуть то, что вы хотите.

0 голосов
/ 27 сентября 2018

Вы можете реализовать это, используя query_string функциюasticsearch.Предполагая, что вы используете значение по умолчанию standard analyzer.

{  
   "query":{  
      "query_string":{  
         "default_field":"Customer",
         "query":"*Jo*"
      }
   }
} 

Вы можете добавить несколько полей, как показано в следующем запросе

{  
   "query":{  
      "query_string":{  
         "fields":[  
            "Customer",
            "Name"
         ],
         "query":"*Jo*"
      }
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...