ElasticSearch:如何在集合中搜索

ElasticSearch: How do I search within a collection

我在 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] 结果:没有返回对象


我正在尝试做的是查询 "Contains all"。

请注意:

  1. C# NEST MultiMatchQuery 类型不支持整数数组(仅支持字符串。太糟糕了)。所以请不要让我使用这种类型的查询
  2. 我正在使用对象初始化程序查询语法
  3. 使用 ElasticSearch 语法进行正确的查询就足够了。

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

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

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

在许多情况下,这是有问题的,因为您忘记了哪对 ID/Name 在一起(因此您不能,例如,查询包含 ID 为 x 的对象的文档和名称 y - 如果集合在 不同的 对象中包含 xy,它将产生误报。

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

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

这只会 return 文档,其中 myObj.myCol 包含 ID 为 1 和 2 的对象。

可以找到有关 ES 中集合如何工作的更多信息here