文章目录
- terms概述
- 准备数据
- 小例子
- 搜索articleID为KDKE-B-9947-#kL5或QQPX-R-3956-#aD8的帖子
- 搜索tag中包含java的帖子
- 优化搜索结果,仅仅搜索tag只包含java的帖子
terms概述
继续跟中华石杉老师学习ES,第三篇
课程地址: https://www.roncoo.com/view/55
https://www.elastic.co/guide/en/elasticsearch/reference/6.4/query-dsl-terms-filter.html
6.4版本对应的 terms query https://www.elastic.co/guide/en/elasticsearch/reference/6.4/query-dsl-terms-query.html
7.0 版本对应的 terms query https://www.elastic.co/guide/en/elasticsearch/reference/7.0/query-dsl-terms-query.html
前面的实例中,我们都是使用的term,只能将一个字段,从一个value中取搜索
代码语言:javascript复制 term: {"field": "value"}
比如
代码语言:javascript复制{
"term": {
"articcleID": "XHDK-A-1293-#fJ3"
}
}
terms 呢? terms可以实现将一个字段,从多个value中检索的效果
代码语言:javascript复制 terms: {"field": ["value1", "value2"]}
类似于SQL中的in
代码语言:javascript复制select * from table where col in ("value1","value2"......)
准备数据
为了演示terms, 我们再新增个tag字段吧
代码语言:javascript复制POST /forum/article/_bulk
{"update":{"_id":"1"}}
{"doc":{"tag":["java","hadoop"]}}
{"update":{"_id":"2"}}
{"doc":{"tag":["java"]}}
{"update":{"_id":"3"}}
{"doc":{"tag":["hadoop"]}}
{"update":{"_id":"4"}}
{"doc":{"tag":["java","elasticsearch"]}}
小例子
搜索articleID为KDKE-B-9947-#kL5或QQPX-R-3956-#aD8的帖子
代码语言:javascript复制GET /forum/_search
{
"query": {
"constant_score": {
"filter": {
"terms": {
"articleID": [
"KDKE-B-9947-#kL5",
"QQPX-R-3956-#aD8"
]
}
}
}
}
}
Terms Query写法(推荐)
代码语言:javascript复制GET /forum/_search
{
"query": {
"terms": {
"articleID": [
"KDKE-B-9947-#kL5",
"QQPX-R-3956-#aD8"
]
}
}
}
搜索tag中包含java的帖子
代码语言:javascript复制GET /forum/_search
{
"query": {
"constant_score": {
"filter": {
"terms": {
"tag": [
"java"
]
}
}
}
}
Terms Query写法(推荐)
代码语言:javascript复制GET /forum/_search
{
"query": {
"terms": {
"tag": [
"java"
]
}
}
}
优化搜索结果,仅仅搜索tag只包含java的帖子
上面的第二个例子中,搜索java ,可以看到返回了3条结果,其中
代码语言:javascript复制 "tag": [
"java",
"elasticsearch"
]
"tag": [
"java",
"hadoop"
],
也被搜索出来了,如果仅仅是想搜索tag只包含java的帖子呢 ?
为了达到该效果,我们新增个tag_cnt字段 ,用数量来过滤下
代码语言:javascript复制POST /forum/article/_bulk
{"update":{"_id":"1"}}
{"doc":{"tag_cnt":2}}
{"update":{"_id":"2"}}
{"doc":{"tag_cnt":1}}
{"update":{"_id":"3"}}
{"doc":{"tag_cnt":1}}
{"update":{"_id":"4"}}
{"doc":{"tag_cnt":2}}
代码语言:javascript复制GET /forum/_search
{
"query": {
"constant_score": {
"filter": {
"bool": {
"must": [
{
"term": {
"tag_cnt": 1
}
},
{
"terms":{
"tag":["java"]
}
}
]
}
}
}
}
}
Terms Query写法(推荐) ,_score 固定为1
代码语言:javascript复制GET /forum/_search
{
"query": {
"bool": {
"filter": [
{
"term": {
"tag_cnt": 1
}
},
{
"terms": {
"tag": [
"java"
]
}
}
]
}
}
}
计算相关度分数 _score 的写法
代码语言:javascript复制GET /forum/_search
{
"query": {
"bool": {
"must": [
{
"term": {
"tag_cnt": 1
}
},
{
"terms": {
"tag": [
"java"
]
}
}
]
}
}
}
总结一下:
- terms多值搜索
- 优化terms多值搜索的结果,可以增加个cnt字段标示一下,组合过滤
- terms相当于SQL中的in语句