gpt4 book ai didi

elasticsearch - ElasticSearch查询嵌套对象无法按预期工作

转载 作者:行者123 更新时间:2023-12-03 01:00:29 28 4
gpt4 key购买 nike

因此,我试图在ElasticSearch中搜索嵌套对象,但未正确执行操作,因为未得到结果。

我运行以下命令:

创建索引和映射

PUT /demo
{
"mappings": {
"person": {
"properties": {
"children": {
"type": "nested",
"properties": {
"fullName": {
"type": "string"
},
"gender": {
"type": "string",
"index": "not_analyzed"
}
}
}
}
}
}
}

添加人员文档
POST /demo/person/1
{
"children": [{
"fullName" : "Bob Smith",
"gender": "M"
}]
}

这些都按预期执行。但是,当我按照 documentation中的说明搜索它们时,没有任何结果。

查询
POST /demo/person/_search
{
"query": {
"bool": {
"must": [{
"match_all": {}
},
{
"nested": {
"path": "children",
"query": {
"bool": {
"must": [{
"match": {
"fullName": "Bob Smith"
}
}]
}
}
}
}]
}
}
}

我做错了什么?

最佳答案

只是为了记录答案,问题在于所有查询和过滤器都需要完整的字段名称。在上面的示例中,文档的索引为:

{
"children": [
{
"fullName" : "Bob Smith",
"gender": "M"
}
]
}

要查询 gender,必须将其作为 children.gender进行访问,而要查询 fullName,则必须将其作为 children.fullName进行查询。

Lucene有效地平整了所有JSON数据结构,这实际上就是 nested类型甚至存在的全部原因,因此:
{
"children": [
{
"fullName" : "Bob Smith",
"gender": "M"
},
{
"fullName" : "Jane Smith",
"gender": "F"
}
]
}

变成 object类型(默认):
"children.fullName": [ "Bob Smith", "Jane Smith" ]
"children.gender": [ "M", "F" ]

使用 nested类型,它变为:
{
"children.fullName": [ "Bob Smith" ]
"children.gender": [ "M" ]
}
{
"children.fullName": [ "Jane Smith" ]
"children.gender": [ "F" ]
}
{}用作嵌套文档边界(它们实际上并不存在,但从逻辑上讲它们是存在的)。

这样,无论您是否使用嵌套文档,都需要提供字段名称的完整路径,即使最后一部分(例如 gender)对于索引而言是唯一的。

相关的兴趣:当数组中只有一个对象时,切勿使用 nested类型。仅在将其实际用作数组时才有用。如果不是数组,则平面版本将以更少的开销提供完全相同的功能。如果某些文档只有一个,但是有些文档有多个,那么使用 nested也很有意义。

关于elasticsearch - ElasticSearch查询嵌套对象无法按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38545779/

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