概念
我們在浏覽器上搜尋文本時,發現我們輸入的關鍵字有高亮顯示,檢視html源碼就知道,高亮的部分是加了
<em>
标簽的,ES也支援高亮搜尋這種操作的,并且在傳回的文檔中自動加了
<em>
标簽,相容html5頁面。
highlight基本文法
GET my_index/_search
{
"query": {
"match": {
"content": "happy"
}
},
"highlight": {
"fields": {
"content": {}
}
}
}
highlight裡面的參數即為高亮搜尋的文法,指定高亮的字段為content,我們可以看到命中的happy裡面帶了
<em>
高亮标簽,
<em></em>
表現在html上會變成紅色,是以說你的指定的field中,如果包含了那個搜尋詞的話,就會在那個field的文本中,對搜尋詞進行紅色的高亮顯示。
highlight下的字段可以指定多個,這樣就可以在多個字段命中的關鍵詞進行高亮顯示,例如:
GET my_index/_search
{
"query": {
"match": {
"content": "happy"
}
},
"highlight": {
"fields": {
"name":{},
"content": {}
}
}
}
三種高亮文法
有三種高亮的文法:
- plain highlight:使用standard Lucene highlighter,對簡單的查詢支援度非常好。
- unified highlight:預設的高亮文法,使用Lucene Unified Highlighter,将文本切分成句子,并對句子使用BM25計算詞條的score,支援精準查詢和模糊查詢。
- fast vector highlighter:使用Lucene Fast Vector highlighter,功能很強大,如果在mapping中對field開啟了term_vector,并設定了with_positions_offsets,就會使用該highlighter,對内容特别長的文本(大于1MB)有性能上的優勢。
一般情況下,用plain highlight也就足夠了,不需要做其他額外的設定 如果對高亮的性能要求很高,可以嘗試啟用unified highlight 如果field的值特别大,超過了1M,那麼可以用fast vector highlight
自定義高亮html标簽
我們知道高亮的預設标簽是
<em>
,這個标簽可以自己定義的,然後使用自己喜歡的樣式:
GET my_index/_search
{
"query": {
"match": {
"content": "happy"
}
},
"highlight": {
"pre_tags": ["<tag1>"],
"post_tags": ["</tag2>"],
"fields": {
"content": {
"type": "plain"
}
}
}
}
高亮片段fragment的設定
針對一些很長的文本,我們不可能在頁面上完整顯示的,我們需要隻顯示有關鍵詞的上下文即可,這裡設定fragment就行:
GET my_index/_search
{
"query" : {
"match": { "content": "happy" }
},
"highlight" : {
"fields" : {
"content" : {"fragment_size" : 150, "number_of_fragments" : 3, "no_match_size": 150 }
}
}
}