前言

在Elasticsearch中Term query和Match query都可以用来对文档中的数据进行检索,但是在检索结果上会稍有不同,本文通过案例对两者的差异进行说明。

数据准备

建立一个索引,指定mapping结构,其中name是keyword类型,full_name是text类型。

PUT /my-index-01
{
  "mappings": {
    "properties": {
      "name":{
        "type": "keyword"
      },
      "full_name":{
        "type": "text"
      }
    }
  }
}

插入一条文档数据。

PUT /my-index-01/_doc/1
{
  "name":"zhang",
  "full_name":"zhang san"
}

查询测试

使用match进行如下查询,可以查到结果

GET /my-index-01/_search
{
  "query": {
    "match": {
      "full_name": "zhang san"
    }
  }
}

在这里插入图片描述

而如果换成term查询,则查不到

GET /my-index-01/_search
{
  "query": {
    "term": {
      "full_name": {
        "value": "zhang san"
      }
    }
  }
}

在这里插入图片描述

如果换成只查zhang或者san,则两者都可以查到

GET /my-index-01/_search
{
  "query": {
    "match": {
      "full_name": "zhang"
    }
  }
}

GET /my-index-01/_search
{
  "query": {
    "term": {
      "full_name": {
        "value": "zhang"
      }
    }
  }
}

同样如果换成查询name字段,则两者也都可以查到

GET /my-index-01/_search
{
  "query": {
    "match": {
      "name": "zhang"
    }
  }
}

GET /my-index-01/_search
{
  "query": {
    "term": {
      "name": {
        "value": "zhang"
      }
    }
  }
}

Term query

返回字段中包含确切 term 的文档,你可以通过term查询来进行精确匹配。

官方,建议不要对text类型的字段进行term查询,因为默认情况下text类型的字段会被进行分词,这样就让使用term查询变得困难,推荐对text字段进出查询,使用match query。

可以看出term query在查询时并不会进行分词,所以在上面案例中,由于标准分词器会对full_name字段进行分词,zhang san会被分成zhang和san。

查看在standard分词器下,zhang san的分词结果

POST _analyze
{
  "analyzer": "standard",
  "text": "zhang san"
}

在这里插入图片描述

因此当你通过term查询zhang或者san时,可以查询到数据,因为词项表中能找到对应的内容,而如果通过zhang san进行查询时,则查不到内容,因为zhang san并没有在词项表中。

Match query

match query是对查询内容进行分词,然后使用全文搜索的标准查询,所以很明显,如果你输入zhang san进行查询,会对zhang和san两个词项分别进行匹配,只要有一个匹配到了,就会返回其结果。

总结

term query:会直接按照查询内容进行精确匹配,如果分词表中能查到对应的结果则返回。
match query:会对查询的内容先进行分词,然后按照分词的结果与分词表进行匹配,只要有一个匹配到就算匹配成功。
可以这样理解,以分词为查询单位来看,term是精确匹配,而match是模糊匹配。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐