2012-06-05 2 views
0

tire-0.4.2를 사용하여 내 레일 어플리케이션의 elasticsearch와 상호 작용합니다 (mongdb 데이터베이스와 mongdb를 사용하여 mongdb와 상호 작용 함). 스팸 문서가 포함 된 게시 모델이 있습니다.elasticsearch의 누락 된 필드를 기준으로 결과를 필터링 할 수 없습니다.

post.rb

include Mongoid::Document 
include Mongoid::Timestamps 

.. 
embeds one :spam, as: :spammable 
... 

spam.rb는

include Mongoid::Document 
include Mongoid::Timestamps 
embedded_in :spammable, polymorphic: true 
field :needs_approval, type: Boolean, default: false 
field :is_spam, type: Time 

has_and_belongs_to_many :request_spam_by, :class_name => "User" 

field :request_spam, type: Boolean, default: false 

나는 더 스팸 문서가없는 모든 게시물을 얻으려면 : 여기에 생성 된 타이어 쿼리

Post.tire.search(:load => :true, page: self.page, per_page: Post::PER_PAGE) do |pf| 
    pf.query{ |query| query.string self.search_text } unless search_text.blank? 
    pf.filter(:missing, :field => 'spam') 
    pf.filter(:term, :college_id => self.college.id) 
    pf.filter(:term, :user_id => self.user.id) 
    pf.filter(:missing, :field => 'spam') 
    pf.filter(:terms, :user_type => self.user_type) unless self.user_type.blank? 
    pf.filter(:range, :created_at => {:gte => self.from_time}) unless self.from_time.blank? 
    pf.filter(:range, :created_at => {:lte => self.to_time}) unless self.to_time.blank? 
    pf.sort{|s| s.by :updated_at, self.sort_order} 
end 

입니다 탄성 검색 쿼리 :

curl -X GET "http://localhost:9200/development_posts/post/_search?  from=0&load=true&page=1&per_page=10&size=10&pretty=true" -d '{"sort":[{"updated_at":"desc"}],"filter":{"and":[{"missing":{"field":"spam"}},{"term":{"college_id":"4fb424a5addf32296f00013a"}},{"missing":{"field":"spam"}},{"range":{"created_at":{"gte":"2012-06-05T00:00:00+05:30"}}},{"range":{"created_at":{"lte":"2012-06-05T23:59:59+05:30"}}}]},"size":10,"from":0}' 

스팸 문서가 누락 된 문서 만 검색하는 경우에도 쿼리 결과로 나에게 스팸이있는 문서가 제공됩니다. 내가하는 실수가 뭔지 모르겠다. 아무도 올바른 방향으로 나를 가리킬 수 있습니까?

답변

4

missing은 색인 생성 된 실제 필드에서만 개체 수준에서 사용할 수 없습니다.

다음 꽤 좋은 것이 아니라 문서를 선택해야

pf.filter(:or, [ 
    {:missing => { :field => 'spam.needs_approval'}}, 
    {:term => {'spam.needs_approval' => false}}]) 

작동합니다 "spam.always_there"에 누락 된 필터를 설정할 수 있습니다 항상 스팸 객체에 존재하는 필드가있는 경우 해당 필드가 거짓이거나 누락 된 경우 (기본적으로 null로 기억하고 누락 된 항목은 동일한 것으로서 거기에주의하십시오)

+0

스팸 문서의 필드 '승인이 필요합니다'가 모두 거짓 인 모든 게시물 문서를 가져 오려면 좋음 스팸 문서가 전혀없는 게시 된 문서도 마찬가지입니다. 이 경우 내 쿼리는 어떻게되어야합니까? –

+0

답변이 업데이트되었습니다. –

관련 문제