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 进行数据检索至关重要。根据实际的数据特性和查询需求,选择适当的查询类型能显著提高搜索的准确性和效率。

posted @ 2024-07-21 23:15  李若盛开  阅读(791)  评论(0)    收藏  举报