1. 首页 > ElasticSearch教程 > 正文

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 性能调优实战

高亮性能调优:

# 性能调优 – 使用fvh高亮类型
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

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息