Elasticsearch 2.20 高亮顯示
來自: http://my.oschina.net/secisland/blog/614991
Elasticsearch中的高亮顯示是來源于lucene的功能,他允許在一個或者多個字段上突出顯示搜索內容, lucene支持三種高亮顯示方式highlighter, fast-vector-highlighter, postings-highlighter,第一種是默認的標準類型。下面先看一個實例,在搜索前,先增加一條文檔。
請求:PUT http://localhost:9200/secilog/log/10?pretty
參數:
{
"type":"file",
"message":"secilog is a log real-time analyse software,it's full text search is based on Elasticsearch "
}
文檔創建好后,我們在進行高亮搜索:
請求:POST http://localhost:9200/secilog/log/_search?pretty
參數:
{
"query": {
"term": {
"message": "analyse"
}
},
"highlight": {
"fields": {
"message": { }
}
}
}
返回結果如下:
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"failed" : 0
},
"hits" : {
"total" : 1,
"max_score" : 0.4232868,
"hits" : [ {
"_index" : "secilog",
"_type" : "log",
"_id" : "10",
"_score" : 0.4232868,
"_source" : {
"type" : "file",
"message" : "secilog is a log real-time analyse software,it's full text search is based on Elasticsearch "
},
"highlight" : {
"message" : [ "secilog is a log real-time <em>analyse</em> software,it's full text search is based on Elasticsearch " ]
}
} ]
}
}
從結果中可以看出,有高亮顯示的內容,<em>analyse</em>。為了執行高亮顯示,該字段必須有實際的內容。并且這個字段必須進程存儲,就是在字段映射中store的值必須為ture,不能只在內存中。否則系統會自動加載_source字段并匹配相關的列。字段名稱支持通配符符號,例如可以用"message*": { }參數匹配所有message開頭的字段。
fast-vector-highlighter
前面的高亮顯示是普通的高亮顯示,lucene還支持fast-vector-highlighter高亮顯示,fast-vector-highlighter高亮顯示具有如下特點:
快,特別是內容別大的字段,比如大于1M。
可定制的boundary_chars,boundary_max_scan,和fragment_offset。
需要設置term_vector的值為with_positions_offsets,增加索引的大小。
可以將多個字段的匹配組合成一個結果。
可以分配不同的權重匹配在不同的位置上,
Elasticsearch中需要在建立索引的時候映射字段類型,才可以實現postings-highlighter高亮顯示,例如對content字段采用fast-vector高亮類型:
{
"type_name" : {
"content" : {"type":"string","term_vector" : "with_positions_offsets"}
}
}
postings-highlighter
lucene還支持postings-highlighter高亮顯示,postings-highlighter高亮顯示具有如下特點:
快,因為它不需要重新分析文檔:尤其是對大文件對性能的提高更為明顯。
占用更少的磁盤空間。
把高亮顯示和句子分開,這個更有利于人類的閱讀。
使用BM25算法,使搜索的時候像是整篇文檔。
Elasticsearch中需要在建立索引的時候映射字段類型,才可以實現postings-highlighter高亮顯示,例如對content字段采用postings高亮類型:
{
"type_name" : {
"content" : {"type":"string","index_options" : "offsets"}
}
}
備注:高亮查詢不支持復雜的查詢,比如查詢類型設置為match_phrase_prefix的查詢。
對于后兩種特殊的類型,都會增加索引的大小,但對于高亮顯示查詢的執行時間會減少。
使用type字段可以強制使用特定的高亮類型,當設置了term_vectors高亮類型的時候,想用普通高亮顯示的時候非常有用。這個只有三中類型,plain, postings , fvh分別對應高亮顯示的三種類型,例如:
{
"query" : {...},
"highlight" : {
"fields" : {
"content" : {"type" : "plain"}
}
}}
默認高亮顯示html標記
默認情況下,高亮顯示的文本在<em>和</em>中。這可以通過設置pre_tags和post_tags進行修改,例如:
{
"query" : {...},
"highlight" : {
"pre_tags" : ["<b>"],
"post_tags" : ["</b>"],
"fields" : {
"_all" : {}
}
}}
使用快速矢量記號可以有多個標簽,按照“重要性”進行排序,例如:
{
"query" : {...},
"highlight" : {
"pre_tags" : ["<tag1>", "<tag2>"],
"post_tags" : ["</tag1>", "</tag2>"],
"fields" : {
"_all" : {}
}
}
}
系統對于這種情況有默認的多個pre_tags,需要設置tags_schema為styled,默認post_tags為</em>,默認多個pre_tags標簽為:
<em class="hlt1">, <em class="hlt2">, <em class="hlt3">,<em class="hlt4">, <em class="hlt5">, <em class="hlt6">,<em class="hlt7">, <em class="hlt8">, <em class="hlt9">,<em class="hlt10">
當我們需要設置默認多個標簽的時候的例子如下:
{
"query" : {...},
"highlight" : {
"tags_schema" : "styled",
"fields" : {
"content" : {}
}
}
}
每個字段都可以設置高亮顯示的字符片fragment_size段大小(默認為100),以及返回的最大片段數number_of_fragments(默認為5),如果number_of_fragments值設置為0則片段產生,當order設置為score時候可以按照評分進行排序。例如:
{
"query" : {...},
"highlight" : {
"order" : "score",
"fields" : {
"content" : {"fragment_size" : 150, "number_of_fragments" : 3}
}
}
}
賽克藍德(secisland)后續會逐步對Elasticsearch的最新版本的各項功能進行分析,近請期待。也歡迎加入secisland公眾號進行關注。