Java ES(Elasticsearch) 中的and 和 or 查詢
Elasticsearch 是一個(gè)分布式、高擴(kuò)展、高實(shí)時(shí)的搜索與數(shù)據(jù)分析引擎。它能很方便的使大量數(shù)據(jù)具有搜索、分析和探索的能力。充分利用Elasticsearch的水平伸縮性,能使數(shù)據(jù)在生產(chǎn)環(huán)境變得更有價(jià)值。Elasticsearch 的實(shí)現(xiàn)原理主要分為以下幾個(gè)步驟,首先用戶將數(shù)據(jù)提交到Elasticsearch 數(shù)據(jù)庫中,再通過分詞控制器去將對(duì)應(yīng)的語句分詞,將其權(quán)重和分詞結(jié)果一并存入數(shù)據(jù),當(dāng)用戶搜索數(shù)據(jù)時(shí)候,再根據(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 {
//搜索請(qǐng)求
SearchRequest request = new SearchRequest(index1,index2);
//請(qǐng)求條件構(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();
//時(shí)間范圍查詢
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);
//把查詢添加放入請(qǐng)求中
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;
}
將每一塊拆成一個(gè)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í),該參數(shù)用來控制應(yīng)該匹配的分詞的最少數(shù)量。
當(dāng)參數(shù)operator使用默認(rèn)值時(shí),參數(shù)minimum_should_match設(shè)置每個(gè)子查詢應(yīng)該匹配多少個(gè)分詞,默認(rèn)值是1,例如,設(shè)置minimum_should_match為1,那么搜索的字段中至少含有一個(gè)分詞。
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個(gè)分詞在內(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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java用20行代碼實(shí)現(xiàn)抖音小視頻批量轉(zhuǎn)換為gif動(dòng)態(tài)圖
這篇文章主要介紹了Java用20行代碼實(shí)現(xiàn)抖音小視頻批量轉(zhuǎn)換為gif動(dòng)態(tài)圖,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
如何使用Spring RestTemplate訪問restful服務(wù)
這篇文章主要介紹了如何使用Spring RestTemplate訪問restful服務(wù),詳細(xì)的介紹了什么是RestTemplate以及簡單實(shí)現(xiàn),非常具有實(shí)用價(jià)值,需要的朋友可以參考下2018-10-10
springboot多模塊項(xiàng)目mvn打包遇到存在依賴但卻無法發(fā)現(xiàn)符號(hào)問題
在SpringBoot多模塊項(xiàng)目中,如果遇到依賴存在但無法發(fā)現(xiàn)符號(hào)的問題,常見原因可能是pom.xml配置問題,例如,如果某個(gè)模塊僅作為依賴而不是啟動(dòng)工程,不應(yīng)在其pom中配置spring-boot-maven-plugin插件,因?yàn)檫@將影響jar包的生成方式2024-09-09
Spring系統(tǒng)屬性及spring.properties配置文件示例詳解
spring中有一個(gè)SpringProperties類,來保存spring的系統(tǒng)屬性,本文結(jié)合實(shí)例代碼對(duì)Spring系統(tǒng)屬性及spring.properties配置文件相關(guān)知識(shí)給大家介紹的非常詳細(xì),需要的朋友參考下吧2023-07-07

