2013-08-17 3 views
0

Я делаю запрос mutli-index С Tire и rails 3, и я хочу отфильтровать объекты, которые утвердили => false, поэтому мне нужен какой-то комбо-фильтр.ElasticSearch Tire два поля условный фильтр

Вот запрос

query = params[:q] 
from = params.delete(:from) 
size = params[:size] || 25 
Tire.search(
    [Venue.index_name, 
    Performer.index_name, User.index_name], load: true) do |s| 
    s.query do 
     string(query, fields: [:_all, :name, :title], use_dis_max: true) 
    end 
    s.from from if from 
    s.size size if size 
    end.results.to_a 

Эта строка удаляет все исполнителям и пользователь, потому что они не имеют: утвержденное поле.

s.filter(:term, :approved => true) 

И эта линия, очевидно, удаляет все не-объекты, которые не подходят.

s.filter(:term, { :approved => true, :index_name => 'venues'}) 

Любые идеи, кроме добавления одобренного: истинного поля для всех пользователей и исполнителей? Я думаю, что-то вроде этого является то, что я хочу концептуально:

s.filter(:term, :approved => true, :if => {:index_name => 'venues'}) 

EDIT Благодаря Mallox я смог найти Если построить, но я до сих пор пытаюсь реализовать шины. Кажется, что приведенный ниже код должен работать, но он не возвращает никаких результатов по любому запросу. Я также удаляю «{: terms => {: index_name => [" исполнители "," users "]}}," чтобы убедиться, что это не мое использование имени индекса или нескольких строк запроса, которое было проблемой, и до сих пор не повезло. Может ли кто-нибудь пролить свет на то, как это сделать в Тире?

 s.filter(:bool, :should => [ 
     {:terms => { :index_name => ["performers", "users"]}}, 
     {:term => { :approved => true}}, 
     ]) 

ответ

3

Так я мало знаний о Ruby, и Тир, но запрос ElasticSearch, что вы хотите построить бы на основе BOOL фильтра, который содержит некоторые «должны» записи (которые будут переводить в включительно OR).

Так что в вашем случае что-то вдоль линий:

"filter" : { 
    "bool" : { 
     "should" : [ 
      { 
       "terms" : { "_type" : ["Performers","Users"] } 
      }, 
      { 
       "term" : { "approved" : true } 
      } 
     ] 
    } 
} 

Взгляните на документацию здесь, может быть, это поможет: : http://www.elasticsearch.org/guide/reference/query-dsl/bool-filter/

+0

Спасибо за ваш ответ. Я собираюсь продвинуть его, потому что он указал мне на конструкцию, которая определенно то, что мне нужно. Однако появляется (я надеюсь, что я ошибаюсь), что у Tire есть какая-то изворотливая поддержка множественных вложенных логических предложений. Надеюсь, кто-то может помочь мне заставить его работать с Тиром. – LennonR

Смежные вопросы