Elasticsearch實(shí)現(xiàn)復(fù)合查詢高亮結(jié)果功能
一.Es的配置
實(shí)現(xiàn)es的全文檢索功能的第一步,首先從與es進(jìn)行連接開始,這里我使用的是es的5.x java api語法.
public TransportClient esClient() throws UnknownHostException{
Settings settings = Settings.builder()
.put("cluster.name", "my-application") //節(jié)點(diǎn)的名字
.put("client.transport.sniff", true)
.build();
InetSocketTransportAddress iAddress = new InetSocketTransportAddress( //連接es的ip地址和端口號(hào)
InetAddress.getByName("127.0.0.1"),9300
);
//根據(jù)先前的配置生成client,后面的操作基本都是基于這個(gè)
TransportClient client = new PreBuiltTransportClient(settings)
.addTransportAddress(iAddress);
return client;
}
二.功能的實(shí)現(xiàn)
以下是全文檢索的核心代碼,包括我遇到的錯(cuò)誤以及解決,包括如何對(duì)高亮失效,高亮不全等的解決.
1.查詢條件
TransportClient esClient = esClient(); //獲取先前生成的client
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery(); //生成復(fù)合查詢構(gòu)造器
boolQuery.mustNot(
QueryBuilders.matchQuery("",) //字段必須不包含啥
);
boolQuery.should(
QueryBuilders.matchQuery(, ) //字段可以包含啥,相當(dāng)于或者
);
boolQuery.must(
QueryBuilders.matchQuery(,) //字段必須包含啥
);
2.高亮條件
//配置標(biāo)題高亮顯示
HighlightBuilder highlightBuilder = new HighlightBuilder(); //生成高亮查詢器
highlightBuilder.field(title); //高亮查詢字段
highlightBuilder.field(content); //高亮查詢字段
highlightBuilder.requireFieldMatch(false); //如果要多個(gè)字段高亮,這項(xiàng)要為false
highlightBuilder.preTags("<span style=\"color:red\">"); //高亮設(shè)置
highlightBuilder.postTags("</span>");
//下面這兩項(xiàng),如果你要高亮如文字內(nèi)容等有很多字的字段,必須配置,不然會(huì)導(dǎo)致高亮不全,文章內(nèi)容缺失等
highlightBuilder.fragmentSize(800000); //最大高亮分片數(shù)
highlightBuilder.numOfFragments(0); //從第一個(gè)分片獲取高亮片段
3.查詢配置
// 根據(jù)字段進(jìn)行排序,這里我根據(jù)時(shí)間進(jìn)行倒排
FieldSortBuilder timeSort = SortBuilders.fieldSort("time").order(SortOrder.DESC);
//查詢請(qǐng)求生成
SearchRequestBuilder requestBuilder = esClient.prepareSearch(indexname)//索引名字
.setTypes(indextype) //索引類型
.setQuery(boolQuery) //配置查詢條件
.addSort(new ScoreSortBuilder()) //根據(jù)查詢相關(guān)度進(jìn)行排序
.addSort(timeSort) //再根據(jù)時(shí)間進(jìn)行排序
.setTrackScores(true) //避免分頁之后相關(guān)性亂了
.highlighter(highlightBuilder) //配置高亮
.setFrom(from) //設(shè)置分頁
.setSize();
4.獲取查詢結(jié)果對(duì)其高亮
//獲取查詢結(jié)果
SearchResponse searchResponse = requestBuilder.get();
List<Map<String, Object>> course = new ArrayList<>();
if(searchResponse.status() != RestStatus.OK){
return course;
}
for(SearchHit hit:searchResponse.getHits()){
//獲取高亮字段
Map<String, HighlightField> highlightFields = hit.getHighlightFields();
HighlightField titleField = highlightFields.get("");
HighlightField contentField = highlightFields.get("");
Map<String, Object> source = hit.getSource();
//千萬記得要記得判斷是不是為空,不然你匹配的第一個(gè)結(jié)果沒有高亮內(nèi)容,那么就會(huì)報(bào)空指針異常,這個(gè)錯(cuò)誤一開始真的搞了很久
if(titleField!=null){
Text[] fragments = titleField.fragments();
String name = "";
for (Text text : fragments) {
name+=text;
}
source.put("", name); //高亮字段替換掉原本的內(nèi)容
}
course.add(source);
}
esClient.close(); //用完記得關(guān)閉
return course;
三.結(jié)語
這樣前端所獲取結(jié)果的搜索內(nèi)容將會(huì)被<span style="color:red;"></span>所包含,比如我前端是微信小程序,所以直接獲取內(nèi)容進(jìn)行渲染的話,就是一堆字符串,所以用的是小程序的富文本標(biāo)簽<rich-text>.
總結(jié)
以上所述是小編給大家介紹的Elasticsearch實(shí)現(xiàn)復(fù)合查詢高亮結(jié)果功能,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!
相關(guān)文章
js如何構(gòu)造elementUI樹狀菜單的數(shù)據(jù)結(jié)構(gòu)詳解
由于業(yè)務(wù)需要,要求實(shí)現(xiàn)樹形菜單,且菜單數(shù)據(jù)由后臺(tái)返回,下面這篇文章主要給大家介紹了關(guān)于js如何構(gòu)造elementUI樹狀菜單的數(shù)據(jù)結(jié)構(gòu)的相關(guān)資料,需要的朋友可以參考下2021-05-05
模仿JQuery.extend函數(shù)擴(kuò)展自己對(duì)象的js代碼
最近打算寫個(gè)自己的js工具集合,把自己平常經(jīng)常使用的方法很好的封裝起來,其中模仿了jq的結(jié)構(gòu)。2009-12-12
詳解Js 根據(jù)文件夾目錄獲取Json數(shù)據(jù)輸出demo
這篇文章主要為大家介紹了Js 根據(jù)文件夾目錄獲取Json數(shù)據(jù)輸出示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
基于Cesium實(shí)現(xiàn)拖拽3D模型的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何利用Cesium實(shí)現(xiàn)在地圖上添加一個(gè)3D模型,并且可以實(shí)現(xiàn)拖拽效果。文中的示例代碼講解詳細(xì),感興趣的可以了解一下2022-06-06
從階乘函數(shù)對(duì)比Javascript和C#的異同
今天學(xué)習(xí)Javascript函數(shù),發(fā)現(xiàn)這完全是一個(gè)神奇的東西。跟我們平常所見強(qiáng)類型語言中的函數(shù)有好多不同。下面我們就從C#和JavaScript的兩個(gè)計(jì)算階乘的函數(shù)中比較兩者的異同2012-05-05
淺談js圖片前端預(yù)覽之filereader和window.URL.createObjectURL
下面小編就為大家?guī)硪黄獪\談js圖片前端預(yù)覽之filereader和window.URL.createObjectURL。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-06-06
js實(shí)現(xiàn)會(huì)跳動(dòng)的日歷效果(完整實(shí)例)
下面小編就為大家?guī)硪黄猨s實(shí)現(xiàn)會(huì)跳動(dòng)的日歷效果(完整實(shí)例)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-10-10
js多個(gè)物體運(yùn)動(dòng)功能實(shí)例分析
這篇文章主要介紹了js多個(gè)物體運(yùn)動(dòng)功能,結(jié)合實(shí)例形式分析了js實(shí)現(xiàn)多物體運(yùn)動(dòng)功能的原理、實(shí)現(xiàn)技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下2016-12-12
原生JS實(shí)現(xiàn)圖片懶加載(lazyload)實(shí)例
圖片懶加載也是比較常見的一種性能優(yōu)化的方法,本篇文章主要介紹了原生JS實(shí)現(xiàn)圖片懶加載(lazyload)實(shí)例,這里整理了詳細(xì)的代碼,有需要的小伙伴可以參考下2017-06-06

