1. 官网描述
官方文档中的描述:返回包含一个或者多个terms提供属性字段
的文档,terms的用法和term相同,可以匹配到多个相似的值。
term关键字相当于:select * from index where 属性='';
terms关键字相当于:select * from index where 属性= '' or 属性='';
语法:
GET test_terms/_search
{
"query": {
"terms": {
"FIELD": [
"VALUE1",
"VALUE2"
],
"boost":1.0
}
}
}
:terms提供数组的每一个值都可以去找到对应的文档,但注意terms提供的值必须和文档的倒排索引字段完全匹配,包括空格和大写字母。默认情况下,Elasticsearch将 terms
查询限制为最多65,536个词。您可以使用index.max_terms_count设置更改此限制。boost:权重,默认1.0。
注意:terms搜索的字段类型不推荐为text类型。您可以将terms看做多个term的or操作。
2. 实战分析
2.1 数据准备
# 创建索引
PUT test_terms
#创建映射
PUT test_terms/_mapping
{
"properties":{
"aid":{
"type":"keyword",
"index":true
},
"name":{
"type":"text",
"index":true
},"tag":{
"type":"keyword",
"index":true
}
}
}
#查看映射
GET test_terms/_mapping
# 批量生成数据
POST _bulk
{"create":{"_index":"test_terms","_type":"_doc"}}
{"aid":"1001","name":"JAVA book","tag":["JAVA","book"]}
{"create":{"_index":"test_terms","_type":"_doc"}}
{"aid":"1002","name":"PHP dic page","tag":["PHP","page","learning"]}
{"create":{"_index":"test_terms","_type":"_doc"}}
{"aid":"1003","name":"JAVA hadoop","tag":["hadoop","JAVA"]}
{"create":{"_index":"test_terms","_type":"_doc"}}
{"aid":"1004","name":"hadoop","tag":["hadoop"]}
# 单条插入数据
POST test_terms/_doc
{
"aid":"1005",
"name":"JAVA ES hadoop",
"tag":["JAVA","JAVA","ES"]
}
2.2 terms相当于多个term操作
es(4)—查询条件match和term文中指出,term不推荐查询text类型,所以terms也不推荐去查询text类型。
上面的语句等效于
GET test_terms/_search
{
"query": {
"bool": {
"should": [
{"term": {
"aid": {
"value": "1001",
"boost": 1
}
}},
{
"term": {
"aid": {
"value": "1002",
"boost": 1
}
}
}
]
}
}
}
2.3 terms查询数组类型
es的复杂数据结构。es(4)—查询条件match和term,可能包含数组结构,项目中的标签属性。
例如上文中的tag属性。例如
{
"aid":"1005",
"name":"JAVA ES hadoop",
"tag":["JAVA","JAVA","ES"]
}
tag在倒排索引中存储的便是JAVA
和ES
。
在使用terms搜索tag字段时,若terms中的任一元素可以查看到tag的倒排索引,那么便会将搜索出对应的文档。
推荐阅读
ES 7.x官方文档