ElasticSearch - match和term有什么区别
match 和 term 查询是两种常用的查询方式,在用途和行为上有着显著的差异:
1. match 查询【实际底层就是多个term查询的结果给汇合在一起】
全文搜索:match 查询用于全文搜索场景。它在查询之前对字段值和查询字符串进行分词(tokenization)处理。
分析器(Analyzer)应用:match 查询会应用字段指定的分析器(如果有的话)来处理查询字符串。这意味着它会处理文本数据的大小写、同义词、停用词等。
应用场景:适合用于文本字段,如文章内容、产品描述等。
示例:
GET /_search
{
"query": {
"match": {
"description": "quick brown fox"
}
}
}
此例,如果description 字段包含了 “quick”、“brown”、“fox” 中的任何一个或全部词汇,文档就会被匹配。
2. term 查询【查询效率更高】
精确值匹配:term 查询用于精确值匹配单个字段或者单个字段的多值(相当于sql中的in语句)。它不会对字段值或查询字符串进行分词处理。
不使用分析器:term 查询不会应用字段的分析器,它直接在倒排索引中查找准确的术语。
应用场景:适合用于关键字(keyword)、数字、日期等精确值字段。
示例:
GET /_search
{
"query": {
"term": {
"status": "active"
}
}
}
此例,只有当status字段的值完全是 “active”(区分大小写)时,文档才会被匹配。
GET /idx_name/_search
{
"query": {
"terms": {
"fieldname": [ # 单值对应多值的时候使用[],每个值之间使用`,`连接
"termid1",
"termid2",
"termid3"
]
}
}
}
# 搜索idx_name索引中fieldname字段,只要包含"termid1","termid2","termid3"其中一个值的文档,sql语句为:
select * from idx_name where fieldname in ("termid1", "termid2", "termid3")
使用terms语句,一个字段包含给定数组中的任意一个值就匹配,相当于sql中的in语句。
关键区别
- 分词处理:match 查询会对查询条件进行分词处理,而 term 查询不会。
- 用途:match 通常用于全文搜索,能处理文本中的同义词、变体等;而 term 用于精确匹配,如过滤、分类标签匹配。
- 灵活性:match 查询更适合处理人类语言中的复杂性和不确定性,而 term 查询更适合技术性和精确性较高。
总结
了解这两种查询类型的区别,对于有效利用 Elasticsearch 进行数据检索至关重要。根据实际的数据特性和查询需求,选择适当的查询类型能显著提高搜索的准确性和效率。