ElasticSearch:如何在集合中进行搜索

时间:2016-09-29 09:41:38

标签: c# elasticsearch kibana nest sense

我在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] 结果:未返回任何对象

我试图做的是查询"包含所有"。

请注意:

  1. C#NEST MultiMatchQuery类型不支持整数数组(只有字符串。太差了)。所以请不要让我使用这种类型的查询
  2. 我使用的是Object Initializer查询语法
  3. ElasticSearch语法中的正确查询就足够了。

1 个答案:

答案 0 :(得分:2)

您想要的是获取包含集合中某处的所有指定ID的文档。

当您在ElasticSearch中使用对象集合时,它们会被展平,因此实际索引的内容类似于以下内容。

myObj.myCol.id = [ 2, 3, 4 ]
myObj.myCol.name = [ "2", "3", "4" ]

在许多情况下,这是有问题的,因为您无法跟踪哪些ID /名称组合在一起(例如,您不能查询包含ID为x且名称为{{{ 1}} - 如果集合在不同的对象中包含yx,则会产生误报。

但是,在您的情况下,它实际上是有益的,因为您只需查询包含y中所有ID的文档,例如:

myObj.myCol.id

这将仅返回{ "query": { "bool": { "must": [ { "match": { "myObj.myCol.id": 1 }}, { "match": { "myObj.myCol.id": 2 }} ] } } } 包含ID为1和2的对象的文档。

有关集合如何在ES中工作的更多信息here