![](/img/trans.png)
[英]Elasticsearch Query on multiple object fields of an Array of Objects
[英]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.