Java ES(Elasticsearch) 中的and 和 or 查询
zsq_fengchen 人气:0Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。充分利用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" //并且关系 } } } }
加载全部内容