ElasticSearch 中 match、match_phrase、query_string 和 term 的区别
一、text字段和keyword字段的区别
在了解这些查询之前的区别之前,先了解一下text字段和keyword字段的区别:
- 创建索引和类型,引入keyword字段
PUT my_index
{
"mappings": {
"properties": {
"name":{
"type": "keyword"
}
}
}
}
GET /my_index
可以看到已经创建好了,字段的类型是keyword
默认的索引类型就是_doc
添加一条数据
POST /my_index/_doc/1
{
"name":"first test"
}
然后查询
GET /my_index/_search
{
"query": {
"term": {
"name":"first"
}
}
}
GET /my_index/_search
{
"query": {
"term": {
"name":"test"
}
}
}
可以看到没有查到任何数据
然后查询
GET /my_index/_search
{
"query": {
"term": {
"name": "first test"
}
}
}
可以看到匹配到了数据
所以将字段设置为keyword,查询的时候已有的值不会被分词
- 现在添加一个text类型的字段
PUT /my_index/_mapping
{
"properties":{
"tag":{
"type":"text"
}
}
}
GET /my_index
往之前已经创建的doc之中添加tag的数据:
POST /my_index/_doc/1
{
"name":"first test",
"tag":"second test"
}
或者使用
(推荐)
POST /my_index/_doc/1/_update
{
"doc":{
"tag":"second test"
}
}
可以看到数据已经进去了
然后对tag字段进行查询:
POST /my_index/_search
{
"query": {
"term": {
"tag": "second"
}
}
}
POST /my_index/_search
{
"query": {
"term": {
"tag": "test"
}
}
}
现在输入全部的查询:
POST /my_index/_search
{
"query": {
"term": {
"tag": "second test"
}
}
}
说明text类型的字段会被分词,查询的时候如果使用拆开查可以查到,但是要直接使用全部查询,就查不到。
注意:”1, 2”会被拆分为[1,2],但是”1,2”是不会被拆分的,因为之间少了个空格。
二、match和term的区别
1、term
1)、term查询keyword字段
term不会分词,而keyword字段也不分词。需要完全匹配才可以
但是如果分词查询,会无法匹配到对应的数据
2)、term查询keyword字段
因为text字段会分词,而term不会分词,所以term查询条件必须是text字段分词后的某一个
如果是输入全部查询:
或者部分输入
查询失败,因为现在的tag已经被分词了,存储是[listen,to,music]
2、match查询text字段
match分词,text也分词,只要match的分词结果和text的分词结果有相同就匹配
成功。如果都不相同就失败了。
3、match_phrase
1)、match_phrase匹配keyword字段
match_phrase会被分词,而keyword不会被分词,match_phrase的需要和keyword完全匹配才可以
只有这种情况才是成功的
2)match_phrase匹配text字段
match_phrase是分词的,text也是分词的。match_phrase的分词结果必须再text字段分词中都包含,而且顺序必须相同,而且必须都是连续的
如果不是连续的,就会失败
4、query_string
1)query_string查询key类型的字段,必须是全部匹配
2)query_string查询text类型的字段
和match_phrase区别的是,query_string查询text类型字段,不需要连续,顺序还可以调换
本作品采用 《CC 协议》,转载必须注明作者和本文链接
推荐文章: