2012-06-05 118 views
0

我正在使用tyre-0.4.2與我的rails應用程序(使用mongodb數據庫和mongoid與mongdb進行交互)中的elasticsearch交互。我有一個帖子模型,裏面嵌入了垃圾文件。無法根據elasticsearch中的「missing」字段篩選出結果

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 

elasticsearch查詢:

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只有獲得索引的實際字段。

如果有一個領域,總是出現在垃圾郵件的對象,那麼你可以設置過濾器丟失的「spam.always_there」,這是不是很不錯,但應該工作

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

應選擇的文件該字段或者是虛假的或者缺失(如果我沒有記錯,默認情況下是空的,缺少的是相同的東西,所以請留意)

+0

好的,如果我想獲取所有郵件文檔的垃圾郵件文檔字段'需要批准'爲false以及根本沒有垃圾郵件文件的郵件文件。在這種情況下,我的查詢應該是什麼樣子? –

+0

更新了答案。 –

相關問題