本文共 1857 字,大约阅读时间需要 6 分钟。
在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 的文档,你可以通过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是对查询内容进行分词,然后使用全文搜索的标准查询,所以很明显,如果你输入zhang san进行查询,会对zhang和san两个词项分别进行匹配,只要有一个匹配到了,就会返回其结果。
term query:会直接按照查询内容进行精确匹配,如果分词表中能查到对应的结果则返回。
match query:会对查询的内容先进行分词,然后按照分词的结果与分词表进行匹配,只要有一个匹配到就算匹配成功。 可以这样理解,以分词为查询单位来看,term是精确匹配,而match是模糊匹配。转载地址:http://ielrb.baihongyu.com/