Searchkick Elastic Search, где условие как поведение

Используя Rails 4.2 с searchkick и elasticsearch, у нас есть некоторые условия для поиска пользователей:

where_data = {
  region: "North America"
}
results = Person.search( query, where: where_data )

Это работает, как ожидалось, и находит человека, когда Person.region - "Северная Америка".

Но бывают и другие ситуации, когда у человека есть несколько регионов, включая Северную Америку: «Африка; Северная Америка». В этих случаях человека не обнаруживают.

Как я могу настроить данные или вызовы where так, чтобы они работали как LIKE в sql, и находили любые совпадающие экземпляры полной строки?


person tmartin314    schedule 05.02.2016    source источник
comment
Можете ли вы вставить свои проиндексированные данные? Я думаю, вам нужно также проиндексировать все регионы   -  person Dias    schedule 11.02.2016


Ответы (3)


Чтобы найти человека, регион которого содержит "Северная Америка", сначала попробуйте:

Person.search "North America", fields: [:region]

Если это не сработает, попробуйте добавить это в модель человека:

class Person < ActiveRecord::Base
  searchkick word_middle: [:region]

А потом (после переиндексации)

Person.search "North America", fields: [:region], match: :word_middle

Если это все еще не сработает, я бы предложил сделать :region коллекцию в ES (сообщите мне, если вам интересно, я сделал это до использования searchkick, но не помню точный код. Я могу поднять его и опубликовать для вас позже)

person Jim Edelstein    schedule 05.02.2016
comment
Спасибо, Джим, я попытался добавить word_middle в searchkick, но это не сработало. Текст для поиска query уже задан, и теперь пытаемся отфильтровать результаты по выбранному региону. - person tmartin314; 06.02.2016

Вы можете передать вместо хеша массив. Итак, у вас может быть:

where_data = [
  "region LIKE North America"
]
results = Person.search( query, where: where_data )

Таким образом, предложение where будет использовать LIKE для поиска ваших результатов.

person Adrian Caffarelli    schedule 02.06.2017

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

option_string  = array_of_options.join(" ")

Используя синтаксис JSON с драгоценными камнями elasticsearch-rails, вы сможете добиться этого.

where_data = {
  region: option_string
}
results = Person.search( query, where: where_data )
person errata    schedule 05.02.2016
comment
Привет, спасибо за информацию. Я просто пытаюсь фильтровать одну строку. В столбце есть один или несколько вариантов. - person tmartin314; 05.02.2016