什么是高亮显示?
高亮显示是指在搜索结果中,将用户搜索的关键字突出显示,使其更为醒目。以百度搜索为例,当用户搜索“JAVA”时,搜索结果中的标题或概述部分会将“JAVA”高亮显示,通常以红色标出,便于用户查看。
高亮显示的实现原理
高亮显示的实现原理可以分为两个步骤:
- 步骤一: 在页面中找到搜索结果中与搜索关键字相关的词条,并将这些词条包裹在 HTML 标签内(如
<em>
标签)。 - 步骤二: 在页面的 CSS 中指定这些标签的样式,比如设置颜色为红色,来达到高亮显示的效果。
前端与后端的角色
- 前端: 负责页面布局和样式的设计,但由于前端无法预知用户的搜索关键字,因此无法提前在页面中修改内容或添加标签。
- 后端: 在接收到用户的查询请求后,后端根据查询条件返回相关数据,并在返回的数据中为匹配的关键词添加标签,确保页面展示时能够正确地显示高亮效果。
倒排索引与高亮显示
Elasticsearch 使用倒排索引来存储数据,倒排索引不仅存储了关键词和文档的对应关系,还记录了关键词在文档中的具体位置。通过倒排索引,Elasticsearch 可以快速地查找关键词并确定其在文档中的位置,从而在搜索结果中自动为这些关键词添加高亮标签。
Elasticsearch 高亮显示的实现
在 Elasticsearch 中,高亮显示的配置非常简单,只需要在查询请求中添加 highlight
参数。
其语法结构如下:
GET /IndexName/_search
{"query": {"match": {"field": "text"}},"highlight": {"fields": { // 指定要高亮的字段"field": { // 可省略下面两个参数,默认会在高亮的前后添加<em></em>标签"pre_tags": "<em>", // 高亮的前置标签"post_tags": "</em>" // 高亮的后置标签}}}
}
高亮显示标签
- 预置标签: 默认情况下,Elasticsearch 使用
<em>
标签来高亮显示关键词。 - 自定义标签: 可以通过
pre_tags
和post_tags
参数来自定义高亮标签。例如,将标签更改为<font>
标签:
{"highlight": {"fields": {"name": {"pre_tags": "<font color='red'>","post_tags": "</font>"}}}
}
示例:
GET /items/_search
{"query": {"match": {"name": "脱脂牛奶"}},"highlight": {"fields": {"name": {}}}
}
query
: 表示查询条件,使用match
查询来搜索商品名称中包含“脱脂牛奶”的文档。highlight
: 配置高亮显示。fields
: 指定要高亮的字段,如商品名称name
。
通过这个配置,Elasticsearch 会自动在搜索结果中找到“脱脂牛奶”出现的地方,并为其加上标签。
返回结果:
注意事项
- source 与 highlight 的区别: Elasticsearch 在返回查询结果时,会包含两个部分:
- source: 原始文档内容,不会受到高亮标签的影响。
- highlight: 高亮后的查询结果,包含加上标签的字段值。
- 所以,如果需要访问高亮的结果,应该访问
highlight
部分,而不是source
部分。
高亮显示的应用场景
高亮显示在商品搜索、文章检索、知识库查询等应用场景中非常常见,用户能够通过高亮标出关键词,更容易找到与其查询相关的信息。
总结
在 Elasticsearch 中实现高亮显示主要依赖于倒排索引和定位关键词位置的能力,通过指定需要高亮的字段和标签,Elasticsearch 可以自动为匹配的关键词加上标签。在前端的展示中,通过指定 CSS 样式来实现高亮效果,确保搜索结果更易于用户浏览。