Elasticsearch学习---Term query和Match query
前言在Elasticsearch中Term query和Match query都可以用来对文档中的数据进行检索,但是在检索结果上会稍有不同,本文通过案例对两者的差异进行说明。数据准备建立一个索引,指定mapping结构,其中name是keyword类型,full_name是text类型。PUT /my-index-01{"mappings": {"properties": {"name":{"ty
前言
在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是模糊匹配。
更多推荐
所有评论(0)