ElasticSearch 复杂搜索例子:电商商品搜索、文档/文章检索 作者:马育民 • 2025-11-22 16:29 • 阅读:10002 # 电商商品搜索模板 电商搜索的核心需求是:**标题权重最高、支持模糊容错、短语匹配提升精准度**。 ### 设计思路 - **权重分配**:`title`(标题)权重最高(×5),`brand`(品牌)次之(×3),确保核心信息优先匹配。 - **多策略组合**:用 `bool should` 组合短语匹配(精准)、普通匹配(召回)、前缀匹配(联想),兼顾精准度和召回率。 - **容错机制**:开启 `fuzziness: "AUTO"` 允许输入错误(如“Mste60”匹配“Mate60”),`prefix_length: 2` 保证前2个字符精准,避免过度模糊。 ### 代码 ```json GET /products/_search { "query": { "bool": { "should": [ // 1. 短语匹配(高权重):提升精准短语的优先级 { "multi_match": { "query": "华为 Mate60 Pro", "fields": ["title^5", "brand^3", "keywords^2"], "type": "phrase", "slop": 1, "boost": 3 } }, // 2. 普通匹配(中权重):保证召回率 { "multi_match": { "query": "华为 Mate60 Pro", "fields": ["title^5", "brand^3", "description^2", "category"], "type": "best_fields", "operator": "AND", "fuzziness": "AUTO", "prefix_length": 2 } }, // 3. 前缀匹配(低权重):支持搜索框联想 { "multi_match": { "query": "华为 Mate60 Pro", "fields": ["title^5", "brand^3"], "type": "phrase_prefix", "max_expansions": 10, "boost": 0.5 } } ] } }, "highlight": { "fields": { "title": {}, "description": {} } } } ``` # 文档/文章检索例子 文档检索的核心需求是:**多字段互补匹配、支持跨字段短语、结果相关性优先**。 ### 设计思路 - **类型选择**:`cross_fields` 解决跨字段短语匹配(如“张三 作者”匹配 `author:张三` + `title:作者`);`most_fields` 让匹配字段更多的文档得分更高(标题+摘要+标签都匹配的文档更相关)。 - **过滤+排序**:通过 `bool must` 添加基础过滤条件,排序时结合相关性得分和发布时间,保证结果时效性。 ### 代码 ```json GET /documents/_search { "query": { "bool": { "must": [ // 基础条件过滤(如时间、分类) { "range": { "publish_time": { "gte": "2023-01-01" } } } ], "should": [ // 1. 跨字段短语匹配:适合人名、专有名词等跨字段场景 { "multi_match": { "query": "机器学习实战 读书笔记", "fields": ["title^4", "author^2", "tags^3", "content"], "type": "cross_fields", "operator": "AND", "boost": 2 } }, // 2. 多字段互补匹配:匹配字段越多,得分越高 { "multi_match": { "query": "机器学习实战 读书笔记", "fields": ["title^4", "abstract^3", "content", "tags^3"], "type": "most_fields", "boost": 1.5 } } ] } }, "sort": [ // 按相关性得分+发布时间排序 {"_score": {"order": "desc"}}, {"publish_time": {"order": "desc"}} ] } ``` # 通用优化建议 1. **字段权重调整**:根据业务数据特点调整 `^N` 权重值(如视频平台可提升 `video_title` 权重,降低 `description` 权重)。 2. **模糊匹配控制**:对品牌、型号等核心字段,可设置 `fuzziness: 0` 关闭模糊;对长文本字段开启 `AUTO` 模糊。 3. **性能优化**:避免在 `content` 等超大字段上使用 `phrase_prefix`,可改用 `edge_ngram` 分词提前构建前缀索引。 # 总结 1. **电商搜索**:优先使用 `phrase` 类型保证精准度,结合 `best_fields` 保证召回,用 `fuzziness` 容错输入错误。 2. **文档检索**:用 `cross_fields` 处理跨字段短语,用 `most_fields` 提升多字段匹配的相关性,结合过滤和排序优化结果。 3. **权重设计**:核心字段(标题、品牌)设置更高权重,确保关键信息对排序的主导作用。 原文出处:http://malaoshi.top/show_1GW2H25w59B6.html