java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > ES 中的and 和 or 查询

Java ES(Elasticsearch) 中的and 和 or 查询

作者:zsq_fengchen

Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎,es中match查询中,查询字符串分词后,默认是or或者的关系,这篇文章主要介绍了ES 中的and 和 or 查询,需要的朋友可以参考下

Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。充分利用Elasticsearch的水平伸缩性,能使数据在生产环境变得更有价值。Elasticsearch 的实现原理主要分为以下几个步骤,首先用户将数据提交到Elasticsearch 数据库中,再通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据,当用户搜索数据时候,再根据权重将结果排名,打分,再将返回结果呈现给用户。

//跨索引查询

SearchRequest request = new SearchRequest(index1,index2);

在es中想实现类似于下面的查询,废话不多说,es的should查询代替的是or,但是必须搭配must来使用

select * from table where (a != 1 and b != 1) or (startTime> “2022-05-20” and (a == 1 or b == 1)) 

直接上代码

@Autowired
    private RestHighLevelClient client;
 public List<Map<String,Object>> searchList(String index1,String index2,Map<String,Object> paramMap
            ,String time,int page,int size) {
        List<Map<String,Object>> hitList = new ArrayList();
        try {
            //搜索请求
            SearchRequest request = new SearchRequest(index1,index2);
            //请求条件构建器,这里和mybatis中的自定义查询有点类型
            SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
            BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();

            //等于条件(其他的一些条件)
            if (paramMap != null && !paramMap.isEmpty()) {
                paramMap.forEach((k, v) -> {
                    boolQueryBuilder.must(QueryBuilders.termsQuery(k + KEYWORD, v));
                });
            }
                BoolQueryBuilder query1 = QueryBuilders.boolQuery();
                query1.mustNot(QueryBuilders.termsQuery("a" + ".keyword", "1"));
                query1.mustNot(QueryBuilders.termsQuery("b" + ".keyword", "1"));

                BoolQueryBuilder query2 = QueryBuilders.boolQuery();
                //时间范围查询
                if (StringUtils.isNotBlank(time)) {
                    query2.must(QueryBuilders.rangeQuery("startTime"+KEYWORD).from(time));
                }

                BoolQueryBuilder shouldQuery = QueryBuilders.boolQuery();
                shouldQuery.should(QueryBuilders.wildcardQuery("a" , "1"));
                shouldQuery.should(QueryBuilders.wildcardQuery("b" , "1"));
                query2.must(shouldQuery);

                BoolQueryBuilder query3 = QueryBuilders.boolQuery();
                query3.should(query1);
                query3.should(query2);
                boolQueryBuilder.must(query3);

            //把查询添加放入请求中
            sourceBuilder.query(boolQueryBuilder);
            request.source(sourceBuilder);
            //起始位置
            sourceBuilder.from((page - 1) * size);
            //查询数量
            sourceBuilder.size(size);
            sourceBuilder.trackTotalHits(true);
            //建立SearchResponse
            SearchResponse response;

            response = client.search(request, RequestOptions.DEFAULT);
            //封装查询的信息
            for (SearchHit hit : response.getHits().getHits()) {
                hitList.add(hit.getSourceAsMap());
                log.debug("查询结果:{}", hit.getSourceAsString());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return hitList;
    }

将每一块拆成一个BoolQueryBuilder ,最后or用should()拼接起来

ElasticSearch(es) match or,and查询

es中match查询中,查询字符串分词后,默认是or或者的关系。

语法

operator:用来控制match查询匹配词条的逻辑条件,默认值是or,如果设置为and,表示查询满足所有条件

minimum_should_match:当operator参数设置为or时,该参数用来控制应该匹配的分词的最少数量。

当参数operator使用默认值时,参数minimum_should_match设置每个子查询应该匹配多少个分词,默认值是1,例如,设置minimum_should_match为1,那么搜索的字段中至少含有一个分词。

match or实例

GET /bank/_search
{
  "from":1,
  "size":5,
  "query": {
    "match": {
      "smsContent": {
        "query": "java 学习",
        "operator": "or" //或者关系
        "minimum_should_match": 2
      }
    }
  }
}

smsContent中包含java或者学习的内容,minimum_should_match等于2表示这2个分词在内容中必须大于2次

match and实例

GET /bank/_search
{
  "query": {
    "match": {
      "smsContent": {
        "query": "java 学习",
        "operator": "and" //并且关系
      }
    }
  }
}

到此这篇关于ES 中的and 和 or 查询的文章就介绍到这了,更多相关ES 中的and 和 or 查询内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文