文章目录
ElasticSearch检索你的数据(二)
高亮显示
高亮显示可以让你在检索的结果中获取高亮的代码片段,因此你能向用户展示查询匹配到的数据。当你请求高亮的时候,返回的响应为每一个检索记录包含额外的highlight
元素,其中包含高亮字段和高亮的片段。
高亮显示的字段必须有真实的值。如果未存储该字段,则加载_source
并从中提取相关字段。
例如,获取
curl -X GET "localhost:9200/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"match": { "content": "kimchy" }
},
"highlight": {
"fields": {
"content": {}
}
}
}
'
ElasticSearch支持三种高亮显示unified,plain, fvh
统一高亮
统一高亮使用 Lucene 统一高亮。这个高亮将文本分成句子,并使用 BM25 算法对单个句子进行评分,就好像它们是语料库中的文档一样。它还支持准确的短语和多术语(模糊、前缀、正则表达式)高亮显示。这是默认的高亮。
Plain
高亮
plain
高亮使用了标准的Lucene
高亮器。它试图从理解短语查询中的单词重要性和任何单词定位标准的角度反映查询匹配逻辑。
提示:普通高亮显示最适合突出显示单个字段中的简单查询匹配。为了准确地反映查询逻辑,它创建了一个很小的内存索引,并通过Lucene的查询执行计划器重新运行原始查询条件,以访问当前文档的低级匹配信息。这将对需要突出显示的每个字段和文档重复。如果你想用复杂的查询在很多文档中突出显示很多字段,我们建议在posts或term_vector字段上使用统一的突出显示。
Fast vector
高亮
fvh
高亮器使用了Lucene
的Fast Vector高亮器。这个高亮器可以使用在映射中term_vector
设置为with_positions_offsets
的字段上。
- 可以使用
boundary_scanner
进行定制。 - 需要将
term_vector
设置为with_positions_offsets
。这会增加索引的大小 - 可以将多个字段的匹配组合为一个结果。可以看
matched_fields
- 可以为不同位置的匹配分配不同的权重,
提示:fvh 高亮不支持跨度查询。如果您需要对跨度查询的支持,请尝试替代高亮,例如plain
高亮。
覆盖全局设置
你可以指定全局高亮设置并且可以有选择性的为单个字段覆盖它们。
curl -X GET "localhost:9200/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query" : {
"match": { "user.id": "kimchy" }
},
"highlight" : {
"number_of_fragments" : 3,
"fragment_size" : 150,
"fields" : {
"body" : { "pre_tags" : ["<em>"], "post_tags" : ["</em>"] },
"blog.title" : { "number_of_fragments" : 0 },
"blog.author" : { "number_of_fragments" : 0 },
"blog.comment" : { "number_of_fragments" : 5, "order" : "score" }
}
}
}
'
指定高亮查询
你可以在指定一个highlight_query
来添加额外的高亮信息。例如以下查询中highlight_query
中包含检索查询和重新评分查询两个查询。如果不使用highlight_query
,只会高亮检索查询。
curl -X GET "localhost:9200/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"match": {
"comment": {
"query": "foo bar"
}
}
},
"rescore": {
"window_size": 50,
"query": {
"rescore_query": {
"match_phrase": {
"comment": {
"query": "foo bar",
"slop": 1
}
}
},
"rescore_query_weight": 10
}
},
"_source": false,
"highlight": {
"order": "score",
"fields": {
"comment": {
"fragment_size": 150,
"number_of_fragments": 3,
"highlight_query": {
"bool": {
"must": {
"match": {
"comment": {
"query": "foo bar"
}
}
},
"should": {
"match_phrase": {
"comment": {
"query": "foo bar",
"slop": 1,
"boost": 10.0
}
}
},
"minimum_should_match": 0
}
}
}
}
}
}
'
设置高亮类型
type
字段运行强制指定一个字段的高亮类型。这个值可以设置为unified,plain ,fvh
。以下例子是一个强制使用plain
类型的高亮:
curl -X GET "localhost:9200/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"match": { "user.id": "kimchy" }
},
"highlight": {
"fields": {
"comment": { "type": "plain" }
}
}
}
'