繁体   English   中英

如何在Elasticsearch中按文档数组中的多个对象字段进行查询?

[英]How to query by multiple fields of object in array of a document in Elasticsearch?

大家好,我是 Elasticsearch 的新手。 我想通过其字段(类型:数组)的值来查询文档。 像这样的例子:

docx=people:[
{id:1,role:admin},
{id:2,role:other}
]
docy=people:[
{id:1,role:other},
{id:2,role:admin}
]

我的查询是people.id:1 AND people.role:admin 我的预期结果只是 docx,但 ES 也返回 docy。 我知道这是错误的,但我怎么能在 ES 中做到这一点。 那么查询字符串如何才能仅过滤像 docx 这样的文档。 谢谢!

您需要在您的情况下使用嵌套数据类型,因为对象数据类型被展平并单独处理,这导致两个文档都匹配结果,将添加一个工作示例。

但是请注意,当您拥有大型数据集和大量并发查询时,嵌套数据类型会变得昂贵,如go-jek 的中型博客中所述。

请关注博客,其中详细介绍了您的问题。

具有正确映射的工作示例

索引映射

{
    "mappings": {
        "properties": {
            "name" : {
             "type" :   "text"
            },
            "people": {
                "type": "nested"
            }
        }
    }
}

索引示例文档

{
    "name": "bar",
    "people": 
    [
        {
            "id": 1,
            "role": "other"
        },
        {
            "id": 2,
            "role": "admin"
        }
    ]
}

和第二个示例文档

{
    "name": "foo",
    "people": 
    [
        {
            "id": 1,
            "role": "admin"
        },
        {
            "id": 2,
            "role": "other"
        }
    ]
}

搜索查询

{
    "query": {
        "nested": {
            "path": "people",
            "query": {
                "bool": {
                    "must": [
                        {
                            "match": {
                                "people.id": 1
                            }
                        },
                        {
                            "match": {
                                "people.role": "admin"
                            }
                        }
                    ]
                }
            }
        }
    }
}

和预期的搜索结果

"hits": [
            {
                "_index": "matchphrase",
                "_type": "_doc",
                "_id": "1",
                "_score": 1.6931472,
                "_source": {
                    "name": "foo",
                    "people": [
                        {
                            "id": 1,
                            "role": "admin"
                        },
                        {
                            "id": 2,
                            "role": "other"
                        }
                    ]
                }
            }
        ]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM