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

软件发布|下载排行|最新软件

当前位置:首页IT学院IT技术

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

zsq_fengchen   2022-11-09 我要评论

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" //并且关系
      }
    }
  }
}

Copyright 2022 版权所有 软件发布 访问手机版

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 联系我们