我正在尝试使用Tire对持久化模型执行嵌套查询。模型(Thing)有标签,我希望找到所有用某个标签标记的东西
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
当我执行查询时,我得到“not of nested type”错误
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的源代码,似乎映射是从传递给“property”方法的选项创建的,所以我认为我不需要在类中单独的“映射”块。谁能看到我做错了什么?
更新
按照下面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
}
}
查询失败,出现与以前相同的错误。添加新标签时如何保留嵌套类型?
答案 0 :(得分:1)
是的,确实,property
声明中的映射配置在Persistence集成中传递。
在这种情况下,始终存在并且唯一的第一个问题:映射如何真实?
所以,请使用eg。 Thing.index.mapping
方法或Elasticsearch的REST API:curl localhost:9200/things/_mapping
来查看。
根据您使用的JSON,您的索引是使用动态映射创建的,并且您稍后更改了映射。在这种情况下,将跳过索引创建逻辑,并且映射不是您所期望的。
当索引映射与模型中定义的映射不同时,有一个关于显示警告的 Tire issue。