ElasticSearch教程FG013-ElasticSearch高亮搜索实现实战
Part01-基础概念与理论知识
1.1 高亮搜索概念
高亮搜索是ElasticSearch中一项重要的功能,它可以在搜索结果中突出显示匹配的关键词,提高用户体验。当用户搜索某个关键词时,ElasticSearch会在返回的结果中标记出匹配的部分,使用户能够快速找到相关内容。更多视频教程www.fgedu.net.cn
高亮搜索的特点:
- 突出显示匹配的关键词
- 提高用户搜索体验
- 支持多种高亮方式
- 可自定义高亮样式
1.2 高亮原理
ElasticSearch的高亮功能基于以下原理:
- 在搜索时,ElasticSearch会分析查询语句,识别出需要高亮的关键词
- 对匹配的文档,ElasticSearch会找到关键词出现的位置
- 使用HTML标签(如<em>)包裹匹配的关键词
- 将高亮后的内容返回给客户端
1.3 高亮类型
ElasticSearch支持三种高亮类型:
- plain:简单高亮,使用HTML标签包裹匹配的关键词
- unified:统一高亮,使用Lucene的高亮器,支持更复杂的高亮需求
- fvh:快速向量高亮,基于存储的词向量,性能更高
学习交流加群风哥微信: itpux-com
Part02-生产环境规划与建议
2.1 高亮性能优化
高亮性能优化的方法:
- 使用fvh高亮类型提高性能
- 合理设置高亮片段大小
- 限制高亮的字段数量
- 使用store字段存储原始内容
- 避免对大字段进行高亮
2.2 高亮配置建议
高亮配置建议:
- 根据字段类型选择合适的高亮类型
- 合理设置pre_tags和post_tags
- 设置合适的fragment_size
- 配置number_of_fragments
- 使用require_field_match提高准确性
2.3 生产环境最佳实践
生产环境中,高亮搜索应注意:
- 对频繁搜索的字段启用高亮
- 监控高亮性能
- 设置合理的高亮参数
- 考虑使用缓存
- 测试不同高亮类型的性能
学习交流加群风哥QQ113257174
Part03-生产环境项目实施方案
3.1 基本高亮实战
基本高亮的使用:
curl -X GET “http://192.168.1.10:9200/fgedu-products/_search” -H “Content-Type: application/json” -d ‘{
“query”: {
“match”: {
“product_name”: “ElasticSearch”
}
},
“highlight”: {
“fields”: {
“product_name”: {}
}
}
}’
# 执行
# 输出日志
{
“took”: 10,
“timed_out”: false,
“_shards”: {
“total”: 5,
“successful”: 5,
“skipped”: 0,
“failed”: 0
},
“hits”: {
“total”: {
“value”: 2,
“relation”: “eq”
},
“max_score”: 0.6931472,
“hits”: [
{
“_index”: “fgedu-products”,
“_id”: “1”,
“_score”: 0.6931472,
“_source”: {
“product_id”: “P001”,
“product_name”: “ElasticSearch实战指南”,
“price”: 99.9,
“category”: “技术书籍”,
“stock”: 85,
“created_at”: “2024-01-01 10:00:00”
},
“highlight”: {
“product_name”: [
“ElasticSearch实战指南”
]
}
},
{
“_index”: “fgedu-products”,
“_id”: “4”,
“_score”: 0.5753642,
“_source”: {
“product_id”: “P004”,
“product_name”: “ElasticStack实战”,
“price”: 119.9,
“category”: “技术书籍”,
“stock”: 50,
“created_at”: “2024-01-01 12:00:00”
},
“highlight”: {
“product_name”: [
“ElasticStack实战”
]
}
}
]
}
}
3.2 自定义高亮实战
自定义高亮的使用:
curl -X GET “http://192.168.1.10:9200/fgedu-products/_search” -H “Content-Type: application/json” -d ‘{
“query”: {
“match”: {
“product_name”: “ElasticSearch”
}
},
“highlight”: {
“pre_tags”: [““],
“post_tags”: [““],
“fields”: {
“product_name”: {
“fragment_size”: 50,
“number_of_fragments”: 3
}
}
}
}’
# 执行
# 输出日志
{
“took”: 12,
“timed_out”: false,
“_shards”: {
“total”: 5,
“successful”: 5,
“skipped”: 0,
“failed”: 0
},
“hits”: {
“total”: {
“value”: 2,
“relation”: “eq”
},
“max_score”: 0.6931472,
“hits”: [
{
“_index”: “fgedu-products”,
“_id”: “1”,
“_score”: 0.6931472,
“_source”: {
“product_id”: “P001”,
“product_name”: “ElasticSearch实战指南”,
“price”: 99.9,
“category”: “技术书籍”,
“stock”: 85,
“created_at”: “2024-01-01 10:00:00”
},
“highlight”: {
“product_name”: [
“ElasticSearch实战指南”
]
}
},
{
“_index”: “fgedu-products”,
“_id”: “4”,
“_score”: 0.5753642,
“_source”: {
“product_id”: “P004”,
“product_name”: “ElasticStack实战”,
“price”: 119.9,
“category”: “技术书籍”,
“stock”: 50,
“created_at”: “2024-01-01 12:00:00”
},
“highlight”: {
“product_name”: [
“ElasticStack实战”
]
}
}
]
}
}
3.3 多字段高亮实战
多字段高亮的使用:
curl -X GET “http://192.168.1.10:9200/fgedu-articles/_search” -H “Content-Type: application/json” -d ‘{
“query”: {
“multi_match”: {
“query”: “ElasticSearch实战”,
“fields”: [“title”, “content”]
}
},
“highlight”: {
“fields”: {
“title”: {
“pre_tags”: [““],
“post_tags”: [““]
},
“content”: {
“pre_tags”: [““],
“post_tags”: [““],
“fragment_size”: 100,
“number_of_fragments”: 2
}
}
}
}’
# 执行
# 输出日志
{
“took”: 15,
“timed_out”: false,
“_shards”: {
“total”: 5,
“successful”: 5,
“skipped”: 0,
“failed”: 0
},
“hits”: {
“total”: {
“value”: 2,
“relation”: “eq”
},
“max_score”: 1.3862944,
“hits”: [
{
“_index”: “fgedu-articles”,
“_id”: “1”,
“_score”: 1.3862944,
“_source”: {
“title”: “ElasticSearch实战指南”,
“content”: “ElasticSearch是一个强大的搜索引擎,本文介绍了ElasticSearch的实战应用…”
},
“highlight”: {
“title”: [
“ElasticSearch实战指南”
],
“content”: [
“ElasticSearch是一个强大的搜索引擎,本文介绍了ElasticSearch的实战应用…”
]
}
},
{
“_index”: “fgedu-articles”,
“_id”: “2”,
“_score”: 0.6931472,
“_source”: {
“title”: “ElasticStack实战”,
“content”: “ElasticStack包括ElasticSearch、Kibana、Logstash等组件,本文介绍了ElasticStack的实战应用…”
},
“highlight”: {
“title”: [
“ElasticStack实战”
],
“content”: [
“ElasticStack包括ElasticSearch、Kibana、Logstash等组件,本文介绍了ElasticStack的实战应用…”
]
}
}
]
}
}
更多学习教程公众号风哥教程itpux_com
Part04-生产案例与实战讲解
4.1 电商搜索高亮
电商搜索高亮场景:
curl -X GET “http://192.168.1.10:9200/fgedu-products/_search” -H “Content-Type: application/json” -d ‘{
“query”: {
“multi_match”: {
“query”: “ElasticSearch实战”,
“fields”: [“product_name^3”, “description”]
}
},
“highlight”: {
“pre_tags”: [““],
“post_tags”: [““],
“fields”: {
“product_name”: {
“fragment_size”: 100,
“number_of_fragments”: 1
},
“description”: {
“fragment_size”: 200,
“number_of_fragments”: 2
}
}
},
“sort”: [
{
“_score”: {
“order”: “desc”
}
}
],
“from”: 0,
“size”: 10
}’
# 执行
# 输出日志
{
“took”: 20,
“timed_out”: false,
“_shards”: {
“total”: 5,
“successful”: 5,
“skipped”: 0,
“failed”: 0
},
“hits”: {
“total”: {
“value”: 2,
“relation”: “eq”
},
“max_score”: 1.3862944,
“hits”: [
{
“_index”: “fgedu-products”,
“_id”: “1”,
“_score”: 1.3862944,
“_source”: {
“product_id”: “P001”,
“product_name”: “ElasticSearch实战指南”,
“description”: “这是一本关于ElasticSearch实战的权威指南,涵盖了ElasticSearch的核心功能和实战技巧…”,
“price”: 99.9,
“category”: “技术书籍”,
“stock”: 85
},
“highlight”: {
“product_name”: [
“ElasticSearch实战指南”
],
“description”: [
“这是一本关于ElasticSearch实战的权威指南,涵盖了ElasticSearch的核心功能和实战技巧…”
]
}
},
{
“_index”: “fgedu-products”,
“_id”: “4”,
“_score”: 0.6931472,
“_source”: {
“product_id”: “P004”,
“product_name”: “ElasticStack实战”,
“description”: “本书介绍了ElasticStack的实战应用,包括ElasticSearch、Kibana、Logstash等组件的使用…”,
“price”: 119.9,
“category”: “技术书籍”,
“stock”: 50
},
“highlight”: {
“product_name”: [
“ElasticStack实战”
],
“description”: [
“本书介绍了ElasticStack的实战应用,包括ElasticSearch、Kibana、Logstash等组件的使用…”
]
}
}
]
}
}
4.2 文档搜索高亮
文档搜索高亮场景:
curl -X GET “http://192.168.1.10:9200/fgedu-documents/_search” -H “Content-Type: application/json” -d ‘{
“query”: {
“bool”: {
“must”: [
{
“match”: {
“content”: “ElasticSearch索引优化”
}
}
],
“filter”: [
{
“term”: {
“category”: “技术文档”
}
}
]
}
},
“highlight”: {
“type”: “fvh”,
“fields”: {
“content”: {
“pre_tags”: [““],
“post_tags”: [““],
“fragment_size”: 150,
“number_of_fragments”: 3,
“no_match_size”: 100
}
}
}
}’
# 执行
# 输出日志
{
“took”: 18,
“timed_out”: false,
“_shards”: {
“total”: 5,
“successful”: 5,
“skipped”: 0,
“failed”: 0
},
“hits”: {
“total”: {
“value”: 1,
“relation”: “eq”
},
“max_score”: 1.0,
“hits”: [
{
“_index”: “fgedu-documents”,
“_id”: “1”,
“_score”: 1.0,
“_source”: {
“title”: “ElasticSearch索引优化指南”,
“content”: “ElasticSearch索引优化是提高搜索性能的关键。本文介绍了ElasticSearch索引优化的各种技巧,包括分片设计、Mapping优化、分词器选择等…”,
“category”: “技术文档”
},
“highlight”: {
“content”: [
“ElasticSearch索引优化是提高搜索性能的关键。本文介绍了ElasticSearch索引优化的各种技巧,包括分片设计、Mapping优化、分词器选择等…”
]
}
}
]
}
}
4.3 性能调优实战
高亮性能调优:
curl -X GET “http://192.168.1.10:9200/fgedu-products/_search” -H “Content-Type: application/json” -d ‘{
“query”: {
“match”: {
“product_name”: “ElasticSearch”
}
},
“highlight”: {
“type”: “fvh”,
“fields”: {
“product_name”: {}
}
}
}’
# 执行
# 输出日志
{
“took”: 5,
“timed_out”: false,
“_shards”: {
“total”: 5,
“successful”: 5,
“skipped”: 0,
“failed”: 0
},
“hits”: {
“total”: {
“value”: 2,
“relation”: “eq”
},
“max_score”: 0.6931472,
“hits”: [
{
“_index”: “fgedu-products”,
“_id”: “1”,
“_score”: 0.6931472,
“_source”: {
“product_id”: “P001”,
“product_name”: “ElasticSearch实战指南”,
“price”: 99.9,
“category”: “技术书籍”,
“stock”: 85,
“created_at”: “2024-01-01 10:00:00”
},
“highlight”: {
“product_name”: [
“ElasticSearch实战指南”
]
}
},
{
“_index”: “fgedu-products”,
“_id”: “4”,
“_score”: 0.5753642,
“_source”: {
“product_id”: “P004”,
“product_name”: “ElasticStack实战”,
“price”: 119.9,
“category”: “技术书籍”,
“stock”: 50,
“created_at”: “2024-01-01 12:00:00”
},
“highlight”: {
“product_name”: [
“ElasticStack实战”
]
}
}
]
}
}
# 性能调优 – 限制高亮字段
curl -X GET “http://192.168.1.10:9200/fgedu-products/_search” -H “Content-Type: application/json” -d ‘{
“query”: {
“match”: {
“product_name”: “ElasticSearch”
}
},
“highlight”: {
“fields”: {
“product_name”: {}
}
}
}’
# 执行
# 输出日志
{
“took”: 3,
“timed_out”: false,
“_shards”: {
“total”: 5,
“successful”: 5,
“skipped”: 0,
“failed”: 0
},
“hits”: {
“total”: {
“value”: 2,
“relation”: “eq”
},
“max_score”: 0.6931472,
“hits”: [
{
“_index”: “fgedu-products”,
“_id”: “1”,
“_score”: 0.6931472,
“_source”: {
“product_id”: “P001”,
“product_name”: “ElasticSearch实战指南”,
“price”: 99.9,
“category”: “技术书籍”,
“stock”: 85,
“created_at”: “2024-01-01 10:00:00”
},
“highlight”: {
“product_name”: [
“ElasticSearch实战指南”
]
}
},
{
“_index”: “fgedu-products”,
“_id”: “4”,
“_score”: 0.5753642,
“_source”: {
“product_id”: “P004”,
“product_name”: “ElasticStack实战”,
“price”: 119.9,
“category”: “技术书籍”,
“stock”: 50,
“created_at”: “2024-01-01 12:00:00”
},
“highlight”: {
“product_name”: [
“ElasticStack实战”
]
}
}
]
}
}
风哥提示:使用fvh高亮类型可以显著提高高亮性能,特别是对于大字段
Part05-风哥经验总结与分享
5.1 高亮最佳实践
- 使用fvh高亮类型提高性能
- 合理设置高亮片段大小
- 限制高亮的字段数量
- 使用store字段存储原始内容
- 根据字段类型选择合适的高亮配置
5.2 常见问题与解决方案
- 高亮性能慢:使用fvh高亮类型
- 高亮结果不准确:检查字段类型和分词器
- 高亮标签与前端样式冲突:自定义高亮标签
- 大字段高亮内存溢出:限制片段大小
- 高亮结果不完整:调整fragment_size
5.3 生产环境调优建议
- 对频繁搜索的字段启用高亮
- 监控高亮性能指标
- 设置合理的高亮参数
- 考虑使用缓存
- 测试不同高亮类型的性能
from ElasticSearch视频:www.itpux.com
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
