Elasticsearch 2.20 高亮显示

Elasticsearch中的高亮显示是来源于lucene的功能,他允许在一个或者多个字段上突出显示搜索内容, lucene支持三种高亮显示方式highlighter, fast-vector-highlighter, postings-highlighter,第一种是默认的标准类型。下面先看一个实例,在搜索前,先增加一条文档。

请求:PUT :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 :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进行修改,例如:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/bd7341035e2afe47743ff9c795a17664.html