Elasticsearch實(shí)現(xiàn)復(fù)合查詢高亮結(jié)果功能
一.Es的配置
實(shí)現(xiàn)es的全文檢索功能的第一步,首先從與es進(jìn)行連接開始,這里我使用的是es的5.x java api語(yǔ)法.
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) //避免分頁(yè)之后相關(guān)性亂了 .highlighter(highlightBuilder) //配置高亮 .setFrom(from) //設(shè)置分頁(yè) .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é)語(yǔ)
這樣前端所獲取結(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實(shí)現(xiàn)仿中關(guān)村論壇評(píng)分后彈出提示效果的方法
這篇文章主要介紹了JS實(shí)現(xiàn)仿中關(guān)村論壇評(píng)分后彈出提示效果的方法,實(shí)例分析了javascript彈出特效的css與提示框的具體實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-02-02JavaScript實(shí)現(xiàn)隨機(jī)點(diǎn)名器
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)隨機(jī)點(diǎn)名器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03js對(duì)象轉(zhuǎn)json數(shù)組的簡(jiǎn)單實(shí)現(xiàn)案例
本篇文章主要是對(duì)js對(duì)象轉(zhuǎn)json數(shù)組的簡(jiǎn)單實(shí)現(xiàn)案例進(jìn)行了介紹,需要的朋友可以過來參考下,希望對(duì)大家有所幫助2014-02-02JavaScript常見繼承模式實(shí)例小結(jié)
這篇文章主要介紹了JavaScript常見繼承模式,結(jié)合實(shí)例形式總結(jié)分析了javascript原型鏈繼承、構(gòu)造函數(shù)繼承、組合繼承、原型式繼承、寄生式繼承等相關(guān)實(shí)現(xiàn)技巧與操作注意事項(xiàng),需要的朋友可以參考下2019-01-01js 連續(xù)賦值的簡(jiǎn)單實(shí)現(xiàn)
下面小編就為大家?guī)硪黄猨s 連續(xù)賦值的簡(jiǎn)單實(shí)現(xiàn)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-06-06原生javascript模仿win8等待提示圓圈進(jìn)度條
一直很中意win8等待提示圓圈進(jìn)度條,下面本文就使用原生javascript模仿win8等待進(jìn)度條,需要的朋友可以參考下2014-04-04