Elasticsearch 中的精确搜索与模糊搜索
Elasticsearch 提供了强大的搜索功能,包括精确搜索和模糊搜索两种主要方式。
精确搜索 (Exact Match)
精确搜索用于查找与查询条件完全匹配的文档。
实现方式:
-
term 查询:
{"query": {"term": {"field_name": "exact_value"}} }
- 用于不分词的字段(keyword类型)
- 区分大小写
-
terms 查询(多值精确匹配):
{"query": {"terms": {"field_name": ["value1", "value2"]}} }
-
match_phrase 查询:
{"query": {"match_phrase": {"field_name": "exact phrase"}} }
- 用于分词字段但要求短语完全匹配
- 保持词序不变
模糊搜索 (Fuzzy Search)
模糊搜索用于查找近似匹配的文档,可以容忍拼写错误或轻微差异。
实现方式:
-
fuzzy 查询:
{"query": {"fuzzy": {"field_name": {"value": "search_term","fuzziness": "AUTO"}}} }
fuzziness
参数可以是:- 数字(0,1,2等):允许的最大编辑距离
- “AUTO”:根据词长自动确定
-
match 查询(带模糊选项):
{"query": {"match": {"field_name": {"query": "search term","fuzziness": 1}}} }
-
wildcard 查询(通配符搜索):
{"query": {"wildcard": {"field_name": {"value": "te?t*" // ?匹配单个字符,*匹配多个字符}}} }
-
regexp 查询(正则表达式):
{"query": {"regexp": {"field_name": {"value": "t[ae]st.*"}}} }
关键区别
特性 | 精确搜索 | 模糊搜索 |
---|---|---|
匹配方式 | 完全匹配 | 近似匹配 |
性能 | 更高 | 较低 |
使用场景 | 分类、标签、ID等需要精确匹配的场景 | 文本搜索、容忍拼写错误的场景 |
是否分析 | 通常不分析(keyword) | 通常分析(text) |
大小写敏感 | 是 | 通常不敏感(取决于分析器) |
最佳实践
- 对需要精确匹配的字段(如ID、状态码)使用
keyword
类型 - 对文本内容使用
text
类型并配合模糊搜索 - 谨慎使用模糊搜索,因为它会影响性能
- 合理设置
fuzziness
参数平衡召回率和精确度 - 考虑使用
n-gram
或edge-ngram
分词器实现更高效的模糊搜索