2016-06-23 8 views
0

Я пытаюсь создать приложение для рельсов, как один here на сборках elasticsearch. Я обновил его для работы с текущим опытом elasticsearch 2.3. Javascript работает хорошо, но фильтр ничего не возвращает, когда я выбираю еще один флажок. Код отличается от приложения here, который не обрабатывает флажки. Что мне не хватает?elasticsearch фасетная навигация

фильтр выглядит следующим образом:

__set_filters = lambda do |key, f| 
    @search_definition[:post_filter][:and] ||= [] 
    @search_definition[:post_filter][:and] |= [f] 

    @search_definition[:aggregations][key.to_sym][:filter][:bool][:must] ||= [] 
    @search_definition[:aggregations][key.to_sym][:filter][:bool][:must] |= [f] 
    end 

if options[:category] 
    f = { term: { "categories,name" => options[:category] } } 
    __set_filters.(:location, f) 
end 

if options[:location] 
    f = { term: { "location,name" => options[:location] } } 
    __set_filters.(:categories, f) 
end 
+0

Приведите пример названия категории. Их пространства? Вы использовали стандартный анализатор? – bkunzi01

ответ

1

Использование фильтров может вызвать головную боль, когда новое эластичным Поиск, потому что он ищет точное соответствие вашего входа для конкретного поля, однако, когда он сначала индексирует вещи (особенно строки используя стандартный анализатор, если вы не указали другой), он разделит поля на несколько строк, которые их документы обозначают как токены. Например, индексирование города под названием «Oyster Bay» без указания анализатора фактически разломит поле на два токена «Oyster» и «Bay». Если вы затем попытаетесь использовать фильтр в этом поле и поместите в «Oyster Bay», он не увидит его как точное совпадение и не вернет его. Я бы рекомендовал, если вы планируете использовать фильтры по запросам, чтобы добавить индексирование «not_analyzed» в соответствующие поля в вашем сопоставлении, чтобы избежать этой проблемы.

+1

Очень полезно Спасибо –