java多条件组合查询6_elasticsearch组合多条件查询实现restful api以及java代码实现
elasticsearch組合多條件查詢實現restful api以及java代碼實現
實際開發中,基本都是組合多條件查詢。
elasticsearch提供bool來實現這種需求;
主要參數:
must
文檔 必須 匹配這些條件才能被包含進來。
must_not
文檔 必須不 匹配這些條件才能被包含進來。
should
如果滿足這些語句中的任意語句,將增加 _score ,否則,無任何影響。它們主要用于修正每個文檔的相關性得分。
filter
必須 匹配,但它以不評分、過濾模式來進行。這些語句對評分沒有貢獻,只是根據過濾標準來排除或包含文檔。
OK我們這里多搞幾個實例讓大伙體驗下;
最簡單的 模糊查詢標題含有“戰”:
{
"query": {
"bool": {
"must":{"match":{"title":"戰"}}
}
}
}
多條件的話
{
"query": {
"bool": {
"must":[
{"match":{"title":"戰"}},
{"match":{"content":"星球"}}
]
}
}
}
就一條結果了;
java代碼實現:/**
*?多條件查詢
*?@throws?Exception
*/
@Test
public?void?searchMutil()throws?Exception{
SearchRequestBuilder?srb=client.prepareSearch("film").setTypes("dongzuo");
QueryBuilder?queryBuilder=QueryBuilders.matchPhraseQuery("title",?"戰");
QueryBuilder?queryBuilder2=QueryBuilders.matchPhraseQuery("content",?"星球");
SearchResponse?sr=srb.setQuery(QueryBuilders.boolQuery()
.must(queryBuilder)
.must(queryBuilder2))
.execute()
.actionGet();
SearchHits?hits=sr.getHits();
for(SearchHit?hit:hits){
System.out.println(hit.getSourceAsString());
}
}
運行結果:
ERROR StatusLogger Log4j2 could not find a logging implementation. Please add log4j-core to the classpath. Using SimpleLogger to log to the console...
{"title":"星球大戰8:最后的絕地武士","publishDate":"2018-01-05","content":"《星球大戰:最后的絕地武士》承接前作《星球大戰:原力覺醒》的劇情,講述第一軍團全面侵襲之下,蕾伊(黛西·雷德利 Daisy Ridley 飾)、芬恩(約翰·博耶加 John Boyega 飾)、波·達默龍(奧斯卡·伊薩克 Oscar Isaac 飾)三位年輕主角各自的抉 擇和冒險故事。前作中覺醒強大原力的蕾伊獨自尋訪隱居的絕地大師盧克·天行者(馬克·哈米爾 Mark Hamill 飾),在后者的指導下接受原力訓練。芬恩接受了一項幾乎不可能完成的任務,為此他不得不勇闖敵營,面對自己的過去。波·達默龍則要適應從戰士向領袖的角色轉換,這一過程中他也將接受一些血的教訓。","director":"萊恩·約翰遜","price":"55"}
must_not使用
內容里不含有“武士”
{
"query": {
"bool": {
"must":{"match":{"title":"戰"}},
"must_not":{"match":{"content":"武士"}}
}
}
}
結果:
java代碼實現:
/**
* 多條件查詢
* @throws Exception
*/
@Test
public void searchMutil2()throws Exception{
SearchRequestBuilder srb=client.prepareSearch("film").setTypes("dongzuo");
QueryBuilder queryBuilder=QueryBuilders.matchPhraseQuery("title", "戰");
QueryBuilder queryBuilder2=QueryBuilders.matchPhraseQuery("content", "武士");
SearchResponse sr=srb.setQuery(QueryBuilders.boolQuery()
.must(queryBuilder)
.mustNot(queryBuilder2))
.execute()
.actionGet();
SearchHits hits=sr.getHits();
for(SearchHit hit:hits){
System.out.println(hit.getSourceAsString());
}
}
結果一致;
should使用 提高得分;
前面:
{
"query": {
"bool": {
"must":[
{"match":{"title":"戰"}}
]
}
}
}
得分情況我們看下:
我們加下should
{
"query": {
"bool": {
"must":{"match":{"title":"戰"}},
"should":[
{"match":{"content":"星球"}},
{"range":{"publishDate":{"gte":"2018-01-01"}}}
]
}
}
}
執行下:
自己看得分 不解釋;
java代碼實現:/**
*?多條件查詢
*?@throws?Exception
*/
@Test
public?void?searchMutil3()throws?Exception{
SearchRequestBuilder?srb=client.prepareSearch("film").setTypes("dongzuo");
QueryBuilder?queryBuilder=QueryBuilders.matchPhraseQuery("title",?"戰");
QueryBuilder?queryBuilder2=QueryBuilders.matchPhraseQuery("content",?"星球");
QueryBuilder?queryBuilder3=QueryBuilders.rangeQuery("publishDate").gt("2018-01-01");
SearchResponse?sr=srb.setQuery(QueryBuilders.boolQuery()
.must(queryBuilder)
.should(queryBuilder2)
.should(queryBuilder3))
.execute()
.actionGet();
SearchHits?hits=sr.getHits();
for(SearchHit?hit:hits){
System.out.println(hit.getScore()+":"+hit.getSourceAsString());
}
}
執行:
省略
filter過濾;
票價必須少于40
{
"query": {
"bool": {
"must": {
"match": {"title": "戰"}
},
"filter": {
"range": {"price": {"lte":"40"}}
}
}
}
}
執行:
java代碼實現:/**
*?多條件查詢
*?@throws?Exception
*/
@Test
public?void?searchMutil4()throws?Exception{
SearchRequestBuilder?srb=client.prepareSearch("film").setTypes("dongzuo");
QueryBuilder?queryBuilder=QueryBuilders.matchPhraseQuery("title",?"戰");
QueryBuilder?queryBuilder2=QueryBuilders.rangeQuery("price").lte(40);
SearchResponse?sr=srb.setQuery(QueryBuilders.boolQuery()
.must(queryBuilder)
.filter(queryBuilder2))
.execute()
.actionGet();
SearchHits?hits=sr.getHits();
for(SearchHit?hit:hits){
System.out.println(hit.getSourceAsString());
}
}
運行結果一致;
總結
以上是生活随笔為你收集整理的java多条件组合查询6_elasticsearch组合多条件查询实现restful api以及java代码实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iPhone 13价格怎么样会超1500
- 下一篇: java selenium 日志_jav