fuzzy 与 wildcard 高级查询|Elasticsearch 七日笔记 12
学习目标
- 掌握高级查询功能,包括模糊查询(
fuzzy)和通配符查询(wildcard),提升搜索的灵活性和容错性。
本文继续沿用第 7 篇准备的 users 数据。
模糊查询(fuzzy)
- 定义:
fuzzy查询容忍拼写错误,基于编辑距离匹配。
- 特点:
- 适用于
text字段。 - 编辑距离(Levenshtein Distance):插入、删除或替换字符的次数。
- 适用于
- 示例:
GET /users/_search { "query": { "fuzzy": { "name": { "value": "Alce", "fuzziness": "AUTO" } } } }- 返回:匹配“Alice”(编辑距离 1)。
- 参数:
fuzziness:AUTO:词长 ≤ 2(0),3-5(1),>5(2)。1或2:固定编辑距离。
max_expansions:最大扩展词,默认 50。
- 机制:
- “Alce”扩展为“Alice”等候选词,逐一匹配。
通配符查询(wildcard)
- 定义:
wildcard查询使用通配符(*和?)匹配模式。
- 特点:
- 适用于
keyword字段。 *:任意字符,?:单个字符。
- 适用于
- 示例:
GET /users/_search { "query": { "wildcard": { "name.keyword": "A*" } } }- 返回:匹配“Alice”、“Alex”等。
- 注意:
- 对
text字段需用.keyword子字段。
- 对
- 性能:
- 比
fuzzy慢,适合小数据集。
- 比
高级查询特性
fuzzy:拼写容错,性能较慢。wildcard:模式匹配,需精确字段。
动手实践:高级查询
目标
- 测试
fuzzy和wildcard查询。
步骤
fuzzy查询:- 运行:
GET /users/_search { "query": { "fuzzy": { "name": { "value": "Alce", "fuzziness": "AUTO" } } } } - 预期:匹配“Alice Smith”和“Alice Lee”。
- 运行:
wildcard查询:- 运行:
GET /users/_search { "query": { "wildcard": { "name.keyword": "A*" } } } - 预期:匹配以“A”开头的所有名字。
- 运行:
- 验证:
- 检查返回的
hits.hits。
- 检查返回的
注意事项
fuzzy需text字段。wildcard用.keyword。
关键点
fuzzy:- 容错拼写,
fuzziness控制范围。
- 容错拼写,
wildcard:- 通配符匹配,适用于
keyword。
- 通配符匹配,适用于
- 性能:
- 高级查询较慢,慎用大数据。
常见问题及解决方法
- 问题:
fuzzy匹配过多。- 原因:
fuzziness过大。 - 解决:设为
1或2。
- 原因:
- 问题:
wildcard无结果。- 原因:字段类型不匹配。
- 解决:用
.keyword。
学习建议
- 动手实践:
- 测试多种
fuzziness值。
- 测试多种
- 优化查询:
- 结合
bool和高级查询,缩小范围。
- 结合
- 性能测试:
- 比较
fuzzy和wildcard的响应时间。
- 比较
总结
第四天通过理论学习,你掌握了聚合(terms 和 avg)、分析器和高级查询(fuzzy 和 wildcard);通过实践操作,你在 Kibana 中执行了统计和复杂搜索,理解了数据分析和容错机制。这是 ES 高级功能的起点,为明天的 Java 集成铺平道路。准备好用代码操作 ES 吧!
本文是《Elasticsearch 七日笔记》系列的第 12 篇,对应第 4 天的学习内容。
