转载

每日一博 | Elasticsearch 2.20 高亮显示

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公众号进行关注

原文  http://my.oschina.net/secisland/blog/614991?fromerr=exRS5pAU
正文到此结束
Loading...