gpt4 book ai didi

ruby-on-rails - 具有持久对象的Elasticsearch/tire嵌套查询

转载 作者:行者123 更新时间:2023-12-03 02:10:03 25 4
gpt4 key购买 nike

我正在尝试使用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的源代码时,似乎是根据传递给“property”方法的选项创建映射的,所以我认为我不需要在类中使用单独的“mapping”块。谁能看到我做错了吗?

更新

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

查询失败,并显示与以前相同的错误。添加新标签时,如何保留嵌套类型?

最佳答案

是的,确实,在持久性集成中传递了property声明中的映射配置。

在这种情况下,总是存在且也是唯一的第一个问题:实际的映射看起来如何?

因此,使用例如。 Thing.index.mapping方法或Elasticsearch的REST API:curl localhost:9200/things/_mapping看看。

您的索引很可能是根据您使用的JSON使用动态映射创建的,并且您稍后已更改了映射。在这种情况下,索引创建逻辑将被跳过,并且映射不是您所期望的。

打开了Tyre issue,用于在索引映射与模型中定义的映射不同时显示警告。

关于ruby-on-rails - 具有持久对象的Elasticsearch/tire嵌套查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14280353/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com