0

Railsアプリケーションでelasticsearchとやり取りするためにtire-0.4.2を使用しています(mongodbとやり取りするためにmongodbデータベースとmongoidを使用しています)。スパムドキュメントが埋め込まれた投稿モデルがあります。

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

1 に答える 1

4

missingオブジェクトレベルでは、インデックスが作成される実際のフィールドのみを使用することはできません。

スパムオブジェクトに常に存在するフィールドがある場合は、「spam.always_there」に欠落しているフィルターを設定できます。これはそれほど良くはありませんが、機能するはずです。

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

そのフィールドがfalseまたは欠落しているドキュメントを選択する必要があります(デフォルトでnullと欠落が同じことを正しく覚えている場合は、注意してください)

于 2012-06-05T09:05:00.000 に答える