0

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
    }
   }

クエリは、以前と同じエラーで失敗します。新しいタグを追加するときにネストされた型を保持するにはどうすればよいですか?

4

1 に答える 1

1

はい、確かに、property宣言のマッピング構成は持続性統合で渡されます。

このような状況では、最初の唯一の質問が常にあります:マッピングは実際にはどのように見えますか?

したがって、たとえば使用します。メソッドまたは ElasticsearchのThing.index.mappingREST API:curl localhost:9200/things/_mapping見てみましょう。

おそらく、使用した JSON に基づいて動的マッピングを使用してインデックスが作成され、後でマッピングを変更した可能性があります。この場合、インデックス作成ロジックはスキップされ、マッピングは予期したものではありません。


インデックス マッピングがモデルで定義されたマッピングと異なる場合に警告を表示することについて、Tireの 問題が未解決です。

于 2013-01-11T16:59:32.103 に答える