Эластичный поиск мульти матч - PullRequest
0 голосов
/ 04 июня 2019

Я новичок в ElasticSearch. Теперь у меня есть требование вернуть все результаты, содержащие ключевое слово.

public Class People(){
    public string UserId {get; set;}
    public string FirstName {get; set;}
    public string LastName {get; set;}
}

Я хочу отфильтровать всех людей, если одно из трех полей содержит ключевое слово, подобное , например, "% keyword%" .

Например, у меня есть Люди

var people = new People() {
    UserId = "lastname.middlename.firstname",
    FirstName = "firstname",
    LastName = "lastname"
}

Как я мог получить этот Peoplle, выполнив поиск по ключевому слову ddl , Как настроить индекс и как сделать запрос.

Я пытался сделать запрос с помощью NEST, как показано ниже

  var keyword = "ddl"
  var result = await _client.SearchAsync<People>(s => 
      s.Query(q => q.MultiMatch(m => m.Fields(f => f.Field(ff => ff.UserId).Field(ff => ff.FirstName).Field(ff => ff.LastName)).Query(keyword)))
  );

Это не сработает. Это работает, только когда я изменил ключевое слово на имя или фамилия или lastname.middlename.firstname

Есть ли способ удовлетворить требование?

Ответы [ 2 ]

0 голосов
/ 04 июня 2019

Для поиска по частям ваших полей вы должны использовать ngram tokenizer в вашем отображении.

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

Это должно решить вашу проблему, но вам нужно позаботиться о нескольких моментах:

  • Вполне вероятно, что вы захотите использовать этот анализатор только во время индекса. Использование этого токенизатора как при индексации, так и при поиске может привести к LOT нерелевантных результатов.
  • Используйте минимальный размер окна (min_gram параметр), а не низкий. В вашем случае 3 будет работать.
  • Размер вашего индекса может существенно возрасти.

Другое решение, более простое в реализации, но обычно неэффективное, заключается в использовании запросов с подстановочными знаками в строке запроса. Это очень похоже на оператор LIKE в SQL.

0 голосов
/ 04 июня 2019

Короткий ответ: вам нужно настроить анализатор для каждого целевого поля, которое разбивает термины на триграммы, возможно, используя фильтр токенов ngram с min_gram и max_gram, установленными на 3Этот анализ сгенерирует токен ddl для middlename, который затем будет соответствовать вашему запросу.

Более длинный ответ заключается в том, что вы захотите прочитать о Анализ , икак написать и тестовые анализаторы с клиентом .NET.Возможно, вы захотите просмотреть пример репозитория, который создает поисковое приложение Nuget .Это довольно сложное прохождение, которое проходит через ряд концепций, включая анализ.

...