首页 > 解决方案 > 如何在 Elasticsearch 中按两个子句过滤数据?

问题描述

我正在尝试根据两个条件过滤数据集。如果满足条件 1(其中记录包含 A 和 B)或条件 2(其中记录包含 A 和 C),我希望我的结果返回包含通配符的记录。

例如,如果我在这里有这个表(并且 Z 只是一个随机填充字符):

TABLE 1
AZZZ ZBZ
ZZZZ ZAZ
ZZAZ ZZB
CZZZ ZZA
AZZZ ZCZ
ZZZZ ZZZ
ZZCZ ZZZ

我希望我的返回结果是这样的:

TABLE 1 (Returned)
AZZZ ZBZ
ZZAZ ZZB
CZZZ ZZA
AZZZ ZCZ

我一直在尝试这些代码,但似乎无法获得预期的结果:

{  
   "query":{  
      "query_string":{  
         "analyze_wildcard":true,
         "default filter":"*",
         "query":"A B"
      }
   }
}

有什么想法吗?

标签: jsonelasticsearchfilteringkibananon-relational-database

解决方案


  1. 通配符查询允许您匹配未分析 ( keyword) 字段上的部分字符串,例如:

    POST my_index/_search
    {
        "query": {
            "wildcard" : { "my_field" : "*A*" }
        }
    }
    
  2. 布尔查询是您组合事物的朋友。我认为将其重组为以下应该等效的内容会更容易:

    POST my_index/_search
    {
      "query": {
        "bool" : {
          "must" : {
            "wildcard" : { "my_field" : "*A*" }
          },
          "should" : [
            { "wildcard" : { "my_field" : "*B*" } },
            { "wildcard" : { "my_field" : "*C*" } }
          ],
          "minimum_should_match" : 1
        }
      }
    }
    

但这不会非常高效。抽象出你在那里拥有什么样的数据以及你想要实现什么有点困难,但也许有更好的方法来实现这一目标?这个问题在很大程度上是围绕关系数据库的特性建模的,而搜索引擎有更多的选择。


推荐阅读