1

我在 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 语法中的正确查询就足够了。
4

1 回答 1

3

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

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

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

在许多情况下,这是有问题的,因为您忘记了哪些 ID/Name 对在一起(例如,您不能查询包含具有 IDx和名称的对象的文档y- 如果集合包含x不同y的对象)。

但是,在您的情况下,它实际上是有益的,因为您可以只查询包含 中所有 ID 的文档myObj.myCol.id,例如:

{
  "query": {
    "bool": {
      "must": [
        { "match": { "myObj.myCol.id": 1 }},
        { "match": { "myObj.myCol.id": 2 }}
      ]
    }
  }
}

这只会返回myObj.myCol包含 ID 为 1 和 2 的对象的文档。

更多关于集合如何在 ES 中工作的信息可以在这里找到。

于 2016-09-29T10:02:12.183 回答