【问题标题】:ElasticSearch: How do I search within a collectionElasticSearch:如何在集合中搜索
【发布时间】:2016-09-29 09:41:37
【问题描述】:

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

【问题讨论】:

  • 如果我理解正确,你应该不需要任何特别的东西 - 只需在 myObj.myCol.id 上使用多个 Must 子句的布尔查询 - lucene 中的集合被展平,所以你实际拥有的是有效地复制密钥,例如 myObj.myCol.id = 1 && myObj.myCol.id = 2 ...
  • 你能在 Elastic 中创建一个这个查询的例子吗?

标签: c# elasticsearch kibana nest sense


【解决方案1】:

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

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

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

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

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

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

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

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

【讨论】:

  • 不幸的是,这不起作用。查询成功执行并指定了一个标识符。但是当我添加另一个时 - 没有结果返回
  • @IlyaSchukin 奇怪 - 如果我索引您发布的文档并使用此查询,它会按预期工作。您没有发布的一些细节会影响查询结果吗?也许尝试将其剥离回本 Q&A 中的实际内容并从那里建立备份。
  • 你是对的。非常接近艰难。我必须创建一些“嵌套”查询,但每个查询中都有 bool 查询
  • @IlyaSchukin - 啊,你的映射中有嵌套对象?
猜你喜欢
  • 1970-01-01
  • 2020-12-12
  • 2012-10-26
  • 1970-01-01
  • 1970-01-01
  • 2019-03-10
  • 1970-01-01
  • 2017-10-21
  • 1970-01-01
相关资源
最近更新 更多