ElasticSearch 6.x 学习笔记:19.搜索高亮
ElasticSearch 6.x 学习笔记:19.搜索高亮
原文:https://blog.csdn.net/chengyuqiang/article/details/79104020
19.1 高亮概述
高亮使您能够从搜索结果中的一个或者多个字段中获取突出显示的片段,以便向用户显示所匹配的位置。当我们请求高亮显示时,响应体包含每个搜索匹配的附加突出显示元素,包括突出显示的字段和突出显示的片段。
高亮显示需要一个字段的实际内容,如果该字段没有被存储(映射mapping没有将存储设置为true),则加载实际的_source,并从_source中提取相关的字段。
注意:_all 字段不能从_source中提取,因此只能用于高亮显示是否明确存储
19.2 默认高亮
例子:使用默认高亮显示来获取每个搜索命中title字段的高亮显示,指定title字段的查询请求中包含高亮显示对象
GET website/_search
{
"query" : {
"match": { "title": "yum" }
},
"highlight" : {
"fields" : {
"title" : {}
}
}
}
查询结果
{
"took": 27,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0.9227539,
"hits": [
{
"_index": "website",
"_type": "blog",
"_id": "6",
"_score": 0.9227539,
"_source": {
"title": "CentOS更换国内yum源",
"author": "程裕强",
"postdate": "2016-12-30",
"abstract": "CentOS更换国内yum源",
"url": "http://url/53946911"
},
"highlight": {
"title": [
"CentOS更换国内<em>yum</em>源"
]
}
}
]
}
}
19.3 自定义高亮标签
自定义高亮可以通过pre_tags 和post_tags设置
GET website/_search
{
"query" : {
"match": { "title": "yum" }
},
"highlight" : {
"fields" : {
"title" : {
"pre_tags":["<mark>"],
"post_tags":["</mark>"]
}
}
}
}
{
"took": 6,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0.9227539,
"hits": [
{
"_index": "website",
"_type": "blog",
"_id": "6",
"_score": 0.9227539,
"_source": {
"title": "CentOS更换国内yum源",
"author": "程裕强",
"postdate": "2016-12-30",
"abstract": "CentOS更换国内yum源",
"url": "http://url/53946911"
},
"highlight": {
"title": [
"CentOS更换国内<mark>yum</mark>源"
]
}
}
]
}
}
19.4 多字段高亮
我们希望搜索title字段的时候,除了title字段中匹配关键字高亮,摘要abstract 字段对应的关键字也要高亮,这需要对require_field_match属性来进行设置。
默认情况下,只有包含查询匹配的阻断才会突出显示。因为默认require_field_match值为true,可以设置为false以突出显示所有字段。
GET website/_search
{
"query" : {
"match": { "title": "yum" }
},
"highlight" : {
"require_field_match":false,
"fields" : {
"title" : {},
"abstract" : {}
}
}
}
{
"took": 4,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0.9227539,
"hits": [
{
"_index": "website",
"_type": "blog",
"_id": "6",
"_score": 0.9227539,
"_source": {
"title": "CentOS更换国内yum源",
"author": "程裕强",
"postdate": "2016-12-30",
"abstract": "CentOS更换国内yum源",
"url": "http://url/53946911"
},
"highlight": {
"abstract": [
"CentOS更换国内<em>yum</em>源"
],
"title": [
"CentOS更换国内<em>yum</em>源"
]
}
}
]
}
}
19.5 高亮性能分析
ElasticSearch 中支持三个高亮器:unified,plain 和 fvh(快速向量高亮器)。您可以指定要为每个字段使用的高亮器类型。
(1)unified 高亮器
unigied 高亮器使用Lucene 统一高亮器。这个高亮器将文本分解句子,并使用 BM25 算法对单个句子进行评分,就好像它们是文集中的文档一样。它还支持准确的短语和多项(模糊,前缀,正则表达式)突出显示。这是默认的高亮器。
(2)plain 高亮器
plain高亮器使用标准的Lucene高亮器。它试图在短语查询中理解单词重要性和任何单词定位标准来反映查询匹配逻辑。
(3)fvh 高亮器
fvh 高亮器使用Lucene Fast Vector 高亮器。刺高亮器可用于在映射中将term_vector 设置为 with_positions_offsets的字段。
快速向量高亮器:
- 可以使用boundary_scanner进行自定义
- 需要将term_vector设置为with_postitions_offsets,这会增加索引的大小
- 可以将来自多个字段的匹配组合成一个结果
- 可以为不同位置上的匹配分配不同的权重,从而允许在突出显示提高词条term匹配
例子 设置高亮类型
type字段允许强制设定的高亮器类型。允许的值是:unified,plain和fvh。下面是一个强制使用plain高亮器的例子
GET website/_search
{
"query" : {
"match": { "title": "yum" }
},
"highlight" : {
"fields" : {
"title" : {"type" : "plain"}
}
}
}
{
"took": 48,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0.9227539,
"hits": [
{
"_index": "website",
"_type": "blog",
"_id": "6",
"_score": 0.9227539,
"_source": {
"title": "CentOS更换国内yum源",
"author": "程裕强",
"postdate": "2016-12-30",
"abstract": "CentOS更换国内yum源",
"url": "http://url.cn/53946911"
},
"highlight": {
"title": [
"CentOS更换国内<em>yum</em>源"
]
}
}
]
}
}
例子:这是一个设置title字段使用fvh高亮器的例子,通过term_vector进行设置,这会导致索引变大。
PUT /example
{
"mappings": {
"doc" : {
"properties": {
"title" : {
"type": "text",
"term_vector" : "with_positions_offsets"
}
}
}
}
}