使用 elasticsearch 時,有一個很常見的需求是,能在頁面上將搜索出的結(jié)果中屬于關(guān)鍵字的文字,進(jìn)行高亮顯示。
elasticsearch 對這個做了一定的支持,它能查詢結(jié)果的基礎(chǔ)上,額外返回需要高亮顯示關(guān)鍵字的整個文本,至于具體你想怎么用它,需要根據(jù)業(yè)務(wù)自行實現(xiàn)。
http 請求體方式
使用 kibana,直接編寫 http 請求體發(fā)送查詢請求。
在查詢的時候,增加參數(shù)?highlight,?pre_tags,?post_tags。highlight 中添加需要進(jìn)行高亮展示關(guān)鍵字的字段。
GET /data_collect/_search
{
? "query": {
? ? "bool": {
? ? ? "should": [
? ? ? ? {
? ? ? ? ? "multi_match": {
? ? ? ? ? ? "query": "車輛",
? ? ? ? ? ? "fields": ["requirement", "tag"]
? ? ? ? ? }
? ? ? ? }
? ? ? ],
? ? ? "minimum_should_match": 1
? ? }
? },
? "highlight": {
? ? "fields": {
? ? ? "tag": {},
? ? ? "requirement": {}
? ? },
? ? "pre_tags": "<span style=\"color: red\">",
? ? "post_tags": "</span>"
? }
}
查詢結(jié)果中會額外返回高亮列表:?
java 編程方式
HighlightBuilder highlightBuilder = new HighlightBuilder();
highlightBuilder.field("requirement").field("tag");
highlightBuilder.preTags("<span style=\"color: red\">");
highlightBuilder.postTags("</span>");
然后把 HighlightBuilder 設(shè)置到 SearchSourceBuilder 中就行了。
查詢成功后,在 SearchHit 中會返回一個 map (Map<String, HighlightField> highlightFields),里面存儲了包含高亮關(guān)鍵字的字段以及對應(yīng)的值。
值中的關(guān)鍵字用我們定義的 html 標(biāo)簽(span)包起來了,這個跟 http 請求體方式是一樣的。?
我這里由于需要先從數(shù)據(jù)庫中數(shù)據(jù)明細(xì),所以先把 HighlightField 緩存了起來。之后根據(jù)id,找到對應(yīng)的包含高亮關(guān)鍵字的值,通過反射方式,把包含高亮關(guān)鍵字的值,設(shè)置到vo中,返回到前端。
這里用反射是因為返回的 Highlight 列表中,字段是不確定的,只有匹配的字段才會返回。如果字段一多,一個個判斷有沒有值,是挺麻煩的,所以用了反射。
返回給前端的結(jié)果中,包含了 html?標(biāo)簽:
前端展示
前端展示(這里使用vue)的時候,使用 v-html 指令來渲染文本就行,它可以渲染富文本。比如:
效果如下(這個是支持同義詞的,比如這里我把"車輛"和"機動車"設(shè)置成了同義詞):文章來源:http://www.zghlxwxcb.cn/news/detail-403103.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-403103.html
到了這里,關(guān)于elasticsearch搜索關(guān)鍵字高亮顯示的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!