本系列博客ES版本如下:
7.17.X
4.4.X
Elasticsearch下载地址
Spring Data Elasticsearch 下载地址
term
查询判断某个字段是否包含
某一个确定的值。一般都是用在keyword、int,long、ip、date
等类型上。text
类型上,在text
上应该用match
匹配查询。注意:term
为是否包含的意思!
PUT /pigg_test/_doc/1
{ "name": "亚瑟王","age": 30,"sex": "男","tag":["战士", "坦克"] }
PUT /pigg_test/_doc/2
{ "name": "程咬金","age": 40,"sex": "男","tag":["战士", "打野"] }
PUT /pigg_test/_doc/3
{ "name": "安琪拉","age": 15,"sex": "女","tag":["法师"],"date": "2019-01-01","friend": "" }
text
类型上用term
查询先在name
字段上做term
查询,发现查询不到文档
GET pigg_test/_search
{
"query": {
"term": {
"name": "亚瑟王"
}
}
}
上面语句查询不到文档,是因为name
默认是text
类型,“亚瑟王”被拆成"亚"、“瑟”、“王”这3个汉字索引的,用Term vectors API
查询下name字段来验证下。
GET /pigg_test/_termvectors/1?fields=name
返回如下:“亚瑟王”被拆成"亚"、“瑟”、“王”这3个汉字
"terms" : {
"亚" : {
"term_freq" : 1,
"tokens" : [
{
"position" : 0,
"start_offset" : 0,
"end_offset" : 1
}
]
},
"王" : {
"term_freq" : 1,
"tokens" : [
{
"position" : 2,
"start_offset" : 2,
"end_offset" : 3
}
]
},
"瑟" : {
"term_freq" : 1,
"tokens" : [
{
"position" : 1,
"start_offset" : 1,
"end_offset" : 2
}
]
}
}
在keyword
类型上进行term查询
GET pigg_test/_search
{
"query": {
"term": {
"name.keyword": "亚瑟王"
}
}
}
在long
类型上进行term查询
GET pigg_test/_search
{
"query": {
"term": {
"age": 30
}
}
}
在date
类型上进行term查询
GET pigg_test/_search
{
"query": {
"term": {
"date": "2019-01-01"
}
}
}
GET pigg_test/_search
{
"query": {
"term": {
"tag.keyword": "战士"
}
}
}
上面查询语句返回了“亚瑟王”和“程咬金”这2个文档,因为他们的tag
数组都包含
了“战士”。
terms
查询和term
查询类似,它判断某个字段是否包含某一个或多个确定的值(value)。terms
查询的value是一个数组,里面包含多个你想要查询的值,只要有一个值命中就算符合。查询tag.keyword
包含"战士"或"坦克",返回“亚瑟王”和“程咬金”这2个文档。
用SQL描述类似 tag in (“战士”, “坦克”)
GET pigg_test/_search
{
"query": {
"terms": {
"tag.keyword": ["战士", "坦克"]
}
}
}
terms_set
查询和terms
类似,但它定义了一个最小命中数。比如value数组里有3个值,最小命中数定义为2,说明字段里的值至少命中数组里的2个,才算这个文档符合。下面语句设置最小匹配数为2,所以只返回“亚瑟王”这1个文档。
GET pigg_test/_search
{
"query":{
"terms_set":{
"tag.keyword":{
"terms":["战士","坦克"],
"minimum_should_match_script":{
"source":"2"
}
}
}
}
}