match 与 term 查询|Elasticsearch 七日笔记 07
学习目标
- 掌握 Elasticsearch 的基本搜索功能,包括简单查询(
match和term)和组合查询(bool),理解其原理和应用场景。 - 通过实践操作,在 Kibana 中执行多种搜索命令,验证结果并理解搜索的核心机制,为后续高级查询和聚合打下基础。
定义与作用
搜索是 Elasticsearch 的核心功能,简单查询是检索数据的基础方式。ES 提供两种主要查询类型:match 和 term,分别适用于不同的场景。
- 作用:
- 从索引中检索符合条件的文档。
- 支持全文搜索和精确匹配。
- REST API:
- 使用
GET /<index_name>/_search。
- 使用
match 查询
- 定义:
match查询用于全文搜索,适合模糊匹配场景。
- 特点:
- 对查询词和文档字段进行分词,匹配分词后的词元。
- 默认使用
OR逻辑,匹配任一词元即可。
- 示例:
GET /users/_search { "query": { "match": { "name": "Alice" } } }- 返回:所有
name字段包含“Alice”的文档。
- 返回:所有
- 机制:
- 查询词“Alice”被分词为
["alice"](小写)。 - 文档字段分词后,若包含
alice,则匹配。
- 查询词“Alice”被分词为
- 参数:
operator:"and"(必须全匹配)或"or"(默认)。"match": { "name": { "query": "Alice Smith", "operator": "and" } }minimum_should_match: 控制匹配词的最小数量。
term 查询
- 定义:
term查询用于精确匹配,适合结构化数据。
- 特点:
- 不对查询词分词,直接匹配字段的原始值。
- 常用于数值、日期或
keyword类型字段。
- 示例:
GET /users/_search { "query": { "term": { "age": 25 } } }- 返回:
age精确为 25 的文档。
- 返回:
- 机制:
- 查询值 25 与文档的
age字段直接比较。
- 查询值 25 与文档的
- 注意:
- 对
text字段无效(因分词),需用field.keyword。
- 对
match vs term
区别:
| 特性 | match | term |
|---|---|---|
| 分词 | 是 | 否 |
| 适用字段 | text | keyword、integer |
| 匹配方式 | 模糊匹配 | 精确匹配 |
| 场景 | 全文搜索 | 结构化查询 |
- 示例:
match:搜索“alice smith”匹配“Alice”或“Smith”。term:搜索 25 只匹配age为 25。
动手实践:准备数据
本系列第 3、4 天的搜索与聚合实践都使用这批数据,后续文章会直接引用它。
目标
- 确保
users索引有足够数据用于搜索测试。
步骤
- 检查现有数据:
- 运行:
GET /users/_search - 确认是否有第 2 天的数据(Alice、Bob 等)。
- 运行:
- 插入数据(若不足):
PUT /users/_doc/1 {"name": "Alice Smith", "age": 25} PUT /users/_doc/2 {"name": "Bob Jones", "age": 30} PUT /users/_doc/3 {"name": "Charlie Brown", "age": 28} PUT /users/_doc/4 {"name": "Alice Lee", "age": 22} - 验证:
- 运行:
GET /users/_search - 确认返回 4 条数据。
- 运行:
注意事项
- 确保索引
users存在(参考创建索引)。 - 数据插入后等待 1 秒,确保可查。
动手实践:简单查询
目标
- 使用
match和term执行搜索,验证结果。
步骤
match查询:- 运行:
GET /users/_search { "query": { "match": { "name": "Alice" } } } - 预期:返回 ID 为 1 和 4 的文档(Alice Smith 和 Alice Lee)。
- 运行:
term查询:- 运行:
GET /users/_search { "query": { "term": { "age": 30 } } } - 预期:返回 ID 为 2 的文档(Bob Jones)。
- 运行:
- 验证:
- 检查返回的
hits.hits数组,确认文档内容。
- 检查返回的
注意事项
match对大小写不敏感(默认分词小写)。term需精确匹配,确保字段类型正确。
关键点
matchvsterm:match分词,适合搜索;term不分词,适合精确筛选。
- 相关性得分:
match计算_score,filter不计算。
常见问题及解决方法
- 问题:查询无结果。
- 原因:字段名错误或数据未刷新。
- 解决:
- 检查字段名(
namevsName)。 - 强制刷新:
POST /users/_refresh。
- 检查字段名(
- 问题:
term查询text字段无效。- 原因:
term不分词,text已分词。 - 解决:
- 用
name.keyword或改用match。
- 用
- 原因:
学习建议
- 理解得分:
- 运行带
_score的查询,分析相关性排序。 - 加
explain: true查看得分计算:GET /users/_search { "explain": true, "query": {"match": {"name": "Alice"}} }
- 运行带
本文是《Elasticsearch 七日笔记》系列的第 7 篇,对应第 3 天的学习内容。
