白话Elasticsearch04- 结构化搜索之使用terms query搜索多个值以及多值搜索结果优化
文章目錄
- 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中取搜索
term: {"field": "value"}比如
{"term": {"articcleID": "XHDK-A-1293-#fJ3"}}terms 呢? terms可以實現將一個字段,從多個value中檢索的效果
terms: {"field": ["value1", "value2"]}類似于SQL中的in
select * from table where col in ("value1","value2"......)準備數據
為了演示terms, 我們再新增個tag字段吧
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的帖子
GET /forum/_search {"query": {"constant_score": {"filter": {"terms": {"articleID": ["KDKE-B-9947-#kL5","QQPX-R-3956-#aD8"]}}}} }Terms Query寫法(推薦)
GET /forum/_search {"query": {"terms": {"articleID": ["KDKE-B-9947-#kL5","QQPX-R-3956-#aD8"]}} }搜索tag中包含java的帖子
GET /forum/_search {"query": {"constant_score": {"filter": {"terms": {"tag": ["java"]}}}}Terms Query寫法(推薦)
GET /forum/_search {"query": {"terms": {"tag": ["java"]}} }優化搜索結果,僅僅搜索tag只包含java的帖子
上面的第二個例子中,搜索java ,可以看到返回了3條結果,其中
"tag": ["java","elasticsearch"]"tag": ["java","hadoop"],也被搜索出來了,如果僅僅是想搜索tag只包含java的帖子呢 ?
為了達到該效果,我們新增個tag_cnt字段 ,用數量來過濾下
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}} GET /forum/_search {"query": {"constant_score": {"filter": {"bool": {"must": [{"term": {"tag_cnt": 1}},{"terms":{"tag":["java"]}}]}}}} }Terms Query寫法(推薦) ,_score 固定為1
GET /forum/_search {"query": {"bool": {"filter": [{"term": {"tag_cnt": 1}},{"terms": {"tag": ["java"]}}]}} }計算相關度分數 _score 的寫法
GET /forum/_search {"query": {"bool": {"must": [{"term": {"tag_cnt": 1}},{"terms": {"tag": ["java"]}}]}} }總結一下:
- terms多值搜索
- 優化terms多值搜索的結果,可以增加個cnt字段標示一下,組合過濾
- terms相當于SQL中的in語句
總結
以上是生活随笔為你收集整理的白话Elasticsearch04- 结构化搜索之使用terms query搜索多个值以及多值搜索结果优化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 白话Elasticsearch03- 结
- 下一篇: 白话Elasticsearch05- 结