我在ElasticSearch中有以下对象结构:
{
_id: 1,
myObj: {
myCol: [{id: 1, name:"1"}, {id: 2, name:"2"}, {id: 3, name:"3"}]
}
},
{
_id: 2,
myObj: {
myCol: [{id: 2, name:"2"}, {id: 3, name:"3"}, {id: 4, name:"4"}]
}
},
我正在使用C#NEST库来创建查询。我想使用标识符集来搜索 myCol 对象集合。
示例#1: 搜索请求:标识符[2,3] 结果:返回两个对象
示例#2: 搜索请求:标识符:[1] 结果:返回第一个对象
示例#3: 搜索请求:标识符:[1,2,3,4] 结果:未返回任何对象
我试图做的是查询"包含所有"。
请注意:
答案 0 :(得分:2)
您想要的是获取包含集合中某处的所有指定ID的文档。
当您在ElasticSearch中使用对象集合时,它们会被展平,因此实际索引的内容类似于以下内容。
myObj.myCol.id = [ 2, 3, 4 ]
myObj.myCol.name = [ "2", "3", "4" ]
在许多情况下,这是有问题的,因为您无法跟踪哪些ID /名称组合在一起(例如,您不能查询包含ID为x
且名称为{{{ 1}} - 如果集合在不同的对象中包含y
和x
,则会产生误报。
但是,在您的情况下,它实际上是有益的,因为您只需查询包含y
中所有ID的文档,例如:
myObj.myCol.id
这将仅返回{
"query": {
"bool": {
"must": [
{ "match": { "myObj.myCol.id": 1 }},
{ "match": { "myObj.myCol.id": 2 }}
]
}
}
}
包含ID为1和2的对象的文档。
有关集合如何在ES中工作的更多信息here。