Tire を使用して、永続化されたモデルでネストされたクエリを実行しようとしています。モデル(モノ)にはタグがあり、特定のタグでタグ付けされたすべてのものを探しています
class Thing
include Tire::Model::Callbacks
include Tire::Model::Persistence
index_name { "#{Rails.env}-thing" }
property :title, :type => :string
property :tags, :default => [], :analyzer => 'keyword', :class => [Tag], :type => :nested
end
ネストされたクエリは次のようになります
class Thing
def self.find_all_by_tag(tag_name, args)
self.search(args) do
query do
nested path: 'tags' do
query do
boolean do
must { match 'tags.name', tag_name }
end
end
end
end
end
end
end
クエリを実行すると、「ネストされた型ではありません」というエラーが表示されます
Parse Failure [Failed to parse source [{\"query\":{\"nested\":{\"query\":{\"bool\":{\"must\":[{\"match\":{\"tags.name\":{\"query\":\"TestTag\"}}}]}},\"path\":\"tags\"}},\"size\":10,\"from\":0,\"version\":true}]]]; nested: QueryParsingException[[test-thing] [nested] nested object under path [tags] is not of nested type]; }]","status":500}
Tire のソースを見ると、「プロパティ」メソッドに渡されたオプションからマッピングが作成されているように見えるので、クラスに別の「マッピング」ブロックは必要ないと思います。誰かが私が間違っていることを見ることができますか?
アップデート
以下の Karmi の回答に従って、インデックスを再作成し、マッピングが正しいことを確認しました。
thing: {
properties: {
tags: {
properties: {
name: {
type: string
}
type: nested
}
}
title: {
type: string
}
}
ただし、Thing に新しいタグを追加すると
thing = Thing.new
thing.title = "Title"
thing.tags << {:name => 'Tag'}
thing.save
マッピングは「動的」タイプに戻り、「ネスト」は失われます。
thing: {
properties: {
tags: {
properties: {
name: {
type: string
}
type: "dynamic"
}
}
title: {
type: string
}
}
クエリは、以前と同じエラーで失敗します。新しいタグを追加するときにネストされた型を保持するにはどうすればよいですか?