【问题标题】:How to filter data by two clauses in Elasticsearch?如何在 Elasticsearch 中按两个子句过滤数据?
【发布时间】:2019-09-06 17:52:49
【问题描述】:

我正在尝试根据两个条件过滤数据集。如果它满足条件 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"
      }
   }
}

有什么想法吗?

【问题讨论】:

    标签: json elasticsearch filtering kibana non-relational-database


    【解决方案1】:
    1. Wildcard queries 允许您在未分析的 (keyword) 字段上匹配部分字符串,例如:

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

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

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

    【讨论】:

    • 这成功了。非常感谢。您有很好的直觉,问题是围绕关系数据库建模的,因为我们在关系数据库上建模了整个项目,但是两个月后遇到了非关系数据库,而且没有人(包括我)对这些数据库有任何经验.我仍在尝试将我们的分析计划/sql 搜索转换为非关系数据库/Elasticsearch,并且在这样做时遇到了一些麻烦。 elastic.co 网站上的指南是学习 elasticsearch 的最佳指南,还是有其他好的学习工具可供研究?
    • docs 很好而且相当广泛。如果您想要精简版,还有 official trainings 尤其是适用于您的用例的工程 I 和 II。免责声明:我在 Elastic 工作,偶尔也会提供培训。
    • 谢谢,我去看看文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多