ES可以使用三种类型的高亮:
- the lucene highlighter
- fast-vector-highlighter
- postings-highlighte
高亮显示的前提要求:
1.高亮的字段是存储的,store set to true
2.如果前提1不满足,会从source中提取,但是必须保证 source set to enable
3._all 字段 比较特殊,不能从source中获得,也就是说如果要高亮_all字段内容 必须 保证 字段的属性 store set to true
the lucene highlighter
这是默认的标准高亮方式。不需要在索引的时候进行任何额外的配置。
也就是说如果在mapping的部分没有对字段进行额外的配置,默认进行的是标准高亮,而且也无法通过在高亮的时候进行配置而转化成其他的高亮方式。
优缺点:
1.无需额外配置
2.会高亮很多无用的词条,不匹配的内容也会被高亮。
fast-vector-highlighter
这种高亮方式基于词条向量,在mapping的时候需要 set term_vector to with_positions_offsets
优缺点:
1.对于超过1MB的字段 速度非常快
2. 会增大索引的大小
3. 可以对不同的匹配方式分配不同的权重
在mapping部分需要设置如下
{
"type_name" : {
"content" : {"term_vector" : "with_positions_offsets"}
}
}
当进行上面的配置之后,默认的高亮就会使用fast-vector-highlighter 这种方式,但是如果想要使用标准的高亮方式,可以进行高亮的时候如下配置:
{
"query" : {...},
"highlight" : {
"fields" : {
"content" : {"type" : "plain"}
}
}
}
postings-highlighter
这种高亮是基于偏移量的:需要在mapping的时候 set index_options to offset
1.因为不会二次分词文本内容,所以高亮速度比较快,文档越大效果越明显
2.需要更小的磁盘空间相对fast highlight
3.把文档当成一个完整的语料,使用的是BM25算法
4.使用该高亮方法 fragment_size 属性失效,输出的高亮片段会忽略长度(所以如果字段内容过多的话,可以使用term vector的高亮方式,将两种高亮方式结合使用)
mapping 部分需要配置如下:
{
"type_name" : {
"content" : {"index_options" : "offsets"}
}
}
注意哦!这种高亮 会忽略位置,比较适合简单的词条匹配。也就是说高亮的内容不一定是你匹配的地方。
如果你采用的是match_phase方式,虽然有些词条包含在里面但是没有匹配得分也会被高亮。
这种高亮也可以通过配置同上 来使用标准高亮的方式