
Elasticsearch的高亮(highlight)功能可以在搜索结果中突出显示与查询条件匹配的文本片段。这使得用户可以快速识别文档中与搜索词相关的部分。以下是一些关于Elasticsearch高亮查询的基本操作和参数配置:
高亮参数:Elasticsearch提供了多个高亮参数,包括fields(指定高亮字段)、pre_tags和post_tags(定义用于高亮文本的HTML标签,默认为<em></em>)、fragment_size(高亮片段大小,默认为100字符)、number_of_fragments(返回片段的最大数量,默认为5)等。
自定义高亮片段:通过在高亮属性中为需要高亮的字段设置pre_tags和post_tags,可以使用自定义HTML标签来高亮关键词。例如,可以使用<strong>标签将关键词高亮显示为加粗。
多字段高亮:如果希望在搜索一个字段时,其他字段中的匹配项也能被高亮显示,可以设置require_field_match属性为false。这样,即使查询不直接针对某个字段,该字段中的匹配项也会被高亮。
高亮器类型:Elasticsearch提供了三种高亮器,包括默认的unified高亮器、posting高亮器和fvh(fast-vector-highlighter)高亮器。posting高亮器不需要二次分析,但需要在字段映射中设置index_options为offsets来保存关键词的偏移量,而fvh高亮器使用词向量位置信息快速定位词条片段,但需要额外的索引空间。
高亮查询示例:在搜索请求中,可以在query部分定义搜索条件,在highlight部分配置高亮选项。例如,使用match查询并指定要高亮的字段,同时设置前置和后置标签来自定义高亮样式。
高亮性能分析:在选择高亮器时,需要考虑性能和存储空间。默认的高亮器虽然速度较慢,但不需要额外存储空间。postings高亮器速度较快,但需要在索引时保存偏移量。fvh高亮器虽然性能最高,但需要更多的索引空间和内存。
通过这些高亮功能,可以增强用户的搜索体验,帮助他们更快地找到所需信息。
在Elasticsearch中,使用高亮显示搜索结果的关键词,可以让用户直观地看到匹配的部分。以下是一个使用Elasticsearch高亮功能的查询示例:
假设我们有一个名为my_index的索引,里面有一个content字段,我们想要搜索这个字段中包含”Elasticsearch”这个词的文档,并且希望将匹配的部分用<strong>标签高亮显示。
GET /my_index/_search{"query": {"match": {"content": "Elasticsearch"}},"highlight": {"pre_tags": ["<strong>"],"post_tags": ["</strong>"],"fields": {"content": {}}}}
GET /my_index/_search:这是发起一个GET请求到my_index索引的搜索API。query:定义了搜索的查询条件,这里使用的是match查询,它会在content字段中查找包含”Elasticsearch”的文档。highlight:定义了高亮的配置。pre_tags和post_tags:定义了高亮的开始和结束标签,这里设置为<strong>和</strong>,意味着匹配的文本会被这两个标签包围,从而在浏览器中显示为加粗。fields:指定了需要高亮的字段,这里设置为content,即在content字段中匹配的文本会被高亮。Elasticsearch会返回一个JSON对象,其中包含了搜索结果和高亮信息。例如:
{"took": 1,"timed_out": false,"_shards": {"total": 5,"successful": 5,"skipped": 0,"failed": 0},"hits": {"total": {"value": 3,"relation": "eq"},"max_score": 2.8894475,"hits": [{"_index": "my_index","_id": "1","_score": 2.8894475,"_source": {"content": "Elasticsearch是一个基于Lucene的搜索引擎。"},"highlight": {"content": ["<strong>Elasticsearch</strong>是一个基于Lucene的搜索引擎。"]}},...]}}
在这个返回结果中,hits数组包含了所有匹配的文档。每个文档对象中,_source字段包含了原始文档内容,而highlight字段包含了高亮后的文本片段。这样用户就可以看到文档中哪些部分与他们的搜索词匹配。
GET test/_search{"query" : { "term" : { "content" : "中国" }},"highlight" : {"pre_tags" : ["<tag1>", "<tag2>"],"post_tags" : ["</tag1>", "</tag2>"],"fields" : {"content" : {}}}}