天天看點

elasticsearch高亮搜尋highlight

概念

我們在浏覽器上搜尋文本時,發現我們輸入的關鍵字有高亮顯示,檢視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": {}
    }
  }
}      

三種高亮文法

有三種高亮的文法:

  1. plain highlight:使用standard Lucene highlighter,對簡單的查詢支援度非常好。
  2. unified highlight:預設的高亮文法,使用Lucene Unified Highlighter,将文本切分成句子,并對句子使用BM25計算詞條的score,支援精準查詢和模糊查詢。
  3. 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 }
        }
    }
}      

繼續閱讀