zoukankan      html  css  js  c++  java
  • elasticsearch中must和should组合查询

    引言

      之前在使用es must和should混合使用的时候,发现should不起作用了。

      es版本5.6

    参考

      https://segmentfault.com/q/1010000008089977?_ea=1544390

      https://blog.csdn.net/u012116196/article/details/51789253

    问题

    例如在a=1且b=2的数据中,找出c=1或者d=2的数据
    {"query": {
       "bool": {
      "must": [
         {"match": {
          "a": "1",
          "b": "2"
      }}
      ],
       "should": [
          {"match": {
           "c": "1"
         },
        {"match": {
        "d": "2"
        }}
      ]
    }}}
    这样写的时候should是没有用的,这是新手可能犯的错误之一。
    在编写查询条件的时候,不能用口头上的逻辑进行编写,而是要换成数学逻辑才能进行执行(数据库同理)。

    如上例,数学逻辑应该是 (a==1&&b==2&&c==1)||(a==1&&b==2&&d==2)(java and c语言版),这样的结构去查询。

    解决

    {"query": {
       "bool": {
        "should": [
          {"match": {
               "a": "1",
               "b": "2",
               "c": "1"
            }}
        ],
        "should": [
          {"match": {
              "a": "1",
              "b": "2",
              "d": "2"
        }}
        ]
    }}}        

    JAVA API

    QueryBuilder query = QueryBuilders.boolQuery()
                        .should(QueryBuilders.boolQuery()
                                .filter(QueryBuilders.termQuery("a", 1))
                                .filter(QueryBuilders.termQuery("b", 2))
                                .filter(QueryBuilders.termQuery("c", 1))
                        .should(QueryBuilders.boolQuery()
                                .filter(QueryBuilders.termQuery("a", 1))
                                .filter(QueryBuilders.termQuery("b", 2))
                                .filter(QueryBuilders.termQuery("d", 2));
  • 相关阅读:
    Mybatis基本用法--下
    Mybatis基本用法--中
    Mybatis基本用法--上
    Java规范推荐
    jquery、js获取页面高度宽度等
    linux ssh -l 命令运用
    div的onblur事件
    js获取url中的参数方法
    div内部元素居中
    oracle排序
  • 原文地址:https://www.cnblogs.com/end-emptiness/p/10267989.html
Copyright © 2011-2022 走看看