Java ES(Elasticsearch) 中的and 和 or 查詢
Elasticsearch 是一個分布式、高擴(kuò)展、高實(shí)時的搜索與數(shù)據(jù)分析引擎。它能很方便的使大量數(shù)據(jù)具有搜索、分析和探索的能力。充分利用Elasticsearch的水平伸縮性,能使數(shù)據(jù)在生產(chǎn)環(huán)境變得更有價值。Elasticsearch 的實(shí)現(xiàn)原理主要分為以下幾個步驟,首先用戶將數(shù)據(jù)提交到Elasticsearch 數(shù)據(jù)庫中,再通過分詞控制器去將對應(yīng)的語句分詞,將其權(quán)重和分詞結(jié)果一并存入數(shù)據(jù),當(dāng)用戶搜索數(shù)據(jù)時候,再根據(jù)權(quán)重將結(jié)果排名,打分,再將返回結(jié)果呈現(xiàn)給用戶。
//跨索引查詢
SearchRequest request = new SearchRequest(index1,index2);
在es中想實(shí)現(xiàn)類似于下面的查詢,廢話不多說,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); //請求條件構(gòu)建器,這里和mybatis中的自定義查詢有點(diǎn)類型 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); //查詢數(shù)量 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("查詢結(jié)果:{}", hit.getSourceAsString()); } } catch (IOException e) { e.printStackTrace(); } return hitList; }
將每一塊拆成一個BoolQueryBuilder ,最后or用should()拼接起來
ElasticSearch(es) match or,and查詢
es中match查詢中,查詢字符串分詞后,默認(rèn)是or或者的關(guān)系。
語法
operator:用來控制match查詢匹配詞條的邏輯條件,默認(rèn)值是or,如果設(shè)置為and,表示查詢滿足所有條件
minimum_should_match:當(dāng)operator參數(shù)設(shè)置為or時,該參數(shù)用來控制應(yīng)該匹配的分詞的最少數(shù)量。
當(dāng)參數(shù)operator使用默認(rèn)值時,參數(shù)minimum_should_match設(shè)置每個子查詢應(yīng)該匹配多少個分詞,默認(rèn)值是1,例如,設(shè)置minimum_should_match為1,那么搜索的字段中至少含有一個分詞。
match or實(shí)例
GET /bank/_search { "from":1, "size":5, "query": { "match": { "smsContent": { "query": "java 學(xué)習(xí)", "operator": "or" //或者關(guān)系 "minimum_should_match": 2 } } } }
smsContent中包含java或者學(xué)習(xí)的內(nèi)容,minimum_should_match等于2表示這2個分詞在內(nèi)容中必須大于2次
match and實(shí)例
GET /bank/_search { "query": { "match": { "smsContent": { "query": "java 學(xué)習(xí)", "operator": "and" //并且關(guān)系 } } } }
到此這篇關(guān)于ES 中的and 和 or 查詢的文章就介紹到這了,更多相關(guān)ES 中的and 和 or 查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用jpa的時候set實(shí)體類屬性自動持久化的解決方案
這篇文章主要介紹了使用jpa的時候set實(shí)體類屬性自動持久化的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08java.lang.Void 與 void的比較及使用方法介紹
這篇文章主要介紹了java.lang.Void 與 void的比較及使用方法介紹,小編覺得挺不錯的,這里給大家分享一下,需要的朋友可以參考。2017-10-10