ElasticSearch 提供了强大的搜索功能,而其中的高亮显示(Highlighting)可以显著提升用户体验。通过高亮显示,用户能够快速识别出搜索结果中与查询相关的关键词部分。本文将详细介绍如何在 ElasticSearch 中使用 highlight
字段实现高亮显示,并结合实际代码示例进行说明。
高亮显示是指在搜索结果中,将与用户输入的查询条件匹配的部分用特定格式标记出来。例如,如果用户搜索“elasticsearch”,那么所有包含该词的结果都会被高亮显示。
ElasticSearch 的高亮显示由 highlight
参数控制,它可以指定以下内容:
首先,我们需要创建一个索引并插入一些测试数据。假设我们有一个名为 articles
的索引,存储文章标题和内容。
PUT /articles
{
"mappings": {
"properties": {
"title": { "type": "text" },
"content": { "type": "text" }
}
}
}
POST /articles/_doc/1
{
"title": "Introduction to Elasticsearch",
"content": "Elasticsearch is a distributed search and analytics engine."
}
POST /articles/_doc/2
{
"title": "Advanced Elasticsearch Features",
"content": "Learn about advanced features like aggregations, highlight, and more."
}
接下来,我们构建一个查询,要求返回包含关键词“elasticsearch”的文档,并对匹配的部分进行高亮显示。
GET /articles/_search
{
"query": {
"multi_match": {
"query": "elasticsearch",
"fields": ["title", "content"]
}
},
"highlight": {
"fields": {
"title": {},
"content": {}
}
}
}
执行上述查询后,返回的结果可能如下所示:
{
"hits": [
{
"_index": "articles",
"_id": "1",
"_score": 0.5753642,
"_source": {
"title": "Introduction to Elasticsearch",
"content": "Elasticsearch is a distributed search and analytics engine."
},
"highlight": {
"title": [
"Introduction to <em>Elasticsearch</em>"
],
"content": [
"<em>Elasticsearch</em> is a distributed search and analytics engine."
]
}
},
{
"_index": "articles",
"_id": "2",
"_score": 0.5753642,
"_source": {
"title": "Advanced Elasticsearch Features",
"content": "Learn about advanced features like aggregations, highlight, and more."
},
"highlight": {
"title": [
"Advanced <em>Elasticsearch</em> Features"
]
}
}
]
}
在结果中,highlight
字段包含了高亮显示的内容,默认使用 <em>
标签包裹匹配的关键词。
如果不想使用默认的 <em>
标签,可以通过 pre_tags
和 post_tags
参数自定义高亮标签。例如:
GET /articles/_search
{
"query": {
"multi_match": {
"query": "elasticsearch",
"fields": ["title", "content"]
}
},
"highlight": {
"pre_tags": ["<b>"],
"post_tags": ["</b>"],
"fields": {
"title": {},
"content": {}
}
}
}
此时,匹配的关键词会被 <b>
标签包裹。
可以通过 fragment_size
和 number_of_fragments
参数控制高亮片段的长度和数量。例如:
GET /articles/_search
{
"query": {
"multi_match": {
"query": "elasticsearch",
"fields": ["title", "content"]
}
},
"highlight": {
"fragment_size": 50,
"number_of_fragments": 2,
"fields": {
"content": {}
}
}
}
当查询涉及多个字段时,可以分别对每个字段配置高亮规则。例如:
GET /articles/_search
{
"query": {
"multi_match": {
"query": "elasticsearch",
"fields": ["title^2", "content"]
}
},
"highlight": {
"fields": {
"title": {
"fragment_size": 30
},
"content": {
"fragment_size": 50
}
}
}
}
对于较长的文本字段,可以启用 require_field_match
参数以确保仅对实际匹配的字段进行高亮:
GET /articles/_search
{
"query": {
"match": {
"content": "elasticsearch"
}
},
"highlight": {
"require_field_match": true,
"fields": {
"content": {}
}
}
}
fragment_size
和 number_of_fragments
,避免过大的片段影响性能。通过本文的介绍,我们可以看到 ElasticSearch 的高亮显示功能非常灵活且强大。无论是简单的单字段查询还是复杂的多字段查询,都可以通过 highlight
参数轻松实现高亮效果。此外,通过自定义标签、片段大小等参数,还可以进一步满足特定的业务需求。