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分词器实现更高效的模糊搜索
2852

被折叠的 条评论
为什么被折叠?



