【问题标题】:Elasticsearch filtering with input array where使用输入数组进行 Elasticsearch 过滤,其中
【发布时间】:2020-01-20 22:54:34
【问题描述】:

我们的要求是通过向 elasticsearch 提供输入数组来按数据的数组字段过滤对象。任何组合输入数组元素都与 mentions 数组匹配。

小例子

data:[
  {"name": "xxxx", "mentions": ["X", "Y"]},
  {"name": "yyyy", "mentions": ["K", "L", "M"]},
  {"name": "zzz", "mentions": ["X", "L"]},
]  
Input: [X, Y, K, L]
Output:[
  {"name": "xxxx", "mentions": ["X", "Y"]},
  {"name": "zzz", "mentions": ["X", "L"]}
]

必须根据mentions字段过滤对象,其中mentions数组的每个成员必须在给定的输入数组中,如果有任何不一致,则忽略该对象。 Terms 查询或带有 must 字段的 bool 不能解决我们的问题。

【问题讨论】:

  • 你能分享你的映射吗?如果您可以分享您尝试过的查询,那就太好了。据我了解,您想要在提及字段中包含X Y K L 的所有文档,对吗?
  • @OpsterESNinja-Kamal 'X Y K L' 不是强制性的,但是,在提及数组(例如 X Y 或 X L)中,X Y K L 的任何组合都可以,如输出所示。映射与数据数组相同。

标签: elasticsearch elastic-stack


【解决方案1】:

一个非常简单的解决方案是在Regex Query 中使用Regex Expression

以下是您的查询方式:

POST <your_index_name>/_search
{
  "query": {
    "bool": {
      "must_not": [                    <---- Note this.
        {
          "regexp": {
            "mentions": "[^XYKL]"      <---- Note this. 
          }
        }
      ]
    }
  }
}

方括号[...] 表示匹配存在的字符之一。

我所做的只是在括号内使用 Negate Character ^ 并将该正则表达式逻辑包装在 Bool Querymust_not 子句中,它应该可以为您提供所需的内容。

查询只会返回值为X Y K L 值的文档。除此以外的任何其他值都不会返回这些文档。

请注意,我假设字段 mentions 的类型为 keyword

【讨论】:

  • mentions 不是关键字,而是关键字数组
  • 是的,以上应该可以。如果没有,请分享我你的映射。我只在数组上测试过。
猜你喜欢
  • 1970-01-01
  • 2014-09-18
  • 2019-04-25
  • 1970-01-01
  • 2016-12-30
  • 1970-01-01
  • 2021-04-17
  • 1970-01-01
相关资源
最近更新 更多