概念

 

我们在浏览器上搜索文本时,发现我们输入的关键字有高亮显示,查看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 }
}
}
}


fragment_size: 设置要显示出来的fragment文本判断的长度,默认是100。

number_of_fragments:你可能你的高亮的fragment文本片段有多个片段,你可以指定就显示几个片段。