一 序
本文屬於極客時間Elasticsearch核心技術與實戰學習筆記系列。
二 結構化數據
結構化搜索(Structured search) 是指對結構化數據的搜索
- 日期,布爾類型和數字都是結構化
文本也可以是結構化的
- 如彩色筆可以有離散的顏色集合:紅(red)、綠(green)、藍(blue)
- 一個博客可能被標記了標籤,例如,分佈式(distributed)和搜索(search)
- 電商網站上的商品都有 UPCs(通用產品碼 Universal Product Codes)或其他的唯一標識,它們都遵從嚴格規定的、結構化的格式
ES 中的機構化搜索
- 布爾、時間,日期和數字這類結構化數據:有精確的格式,我們可以對這些格式進行邏輯操作。包括比較數字或時間的範圍,或判斷兩個值的大小
- 結構化的文本可以做到精確匹配或者部分匹配
- Term 查詢 / Prefix 前綴查詢
- 結構化結構只有 “是” 或 “否” 兩個值
- 根據場景需要,可以決定結構化搜索是否需要打分
demo
#結構化搜索,精確匹配
DELETE products
POST /products/_bulk
{ "index": { "_id": 1 }}
{ "price" : 10,"avaliable":true,"date":"2018-01-01", "productID" : "XHDK-A-1293-#fJ3" }
{ "index": { "_id": 2 }}
{ "price" : 20,"avaliable":true,"date":"2019-01-01", "productID" : "KDKE-B-9947-#kL5" }
{ "index": { "_id": 3 }}
{ "price" : 30,"avaliable":true, "productID" : "JODL-X-1937-#pV7" }
{ "index": { "_id": 4 }}
{ "price" : 30,"avaliable":false, "productID" : "QQPX-R-3956-#aD8" }
GET products/_mapping
查詢你boolean
查詢#對布爾值,通過constant score 轉成 filtering,沒有算分
數字類型 Term
#數字類型 terms
數字類型支持range查詢
constant_score 把filter包起來,並且跳過了算分的步驟
- gt 大於
- lt 小於
- gte 大於等於
- lte 小於等於
日期 range
demo的查詢就是大於一年之前的。
exists 查詢 - 非空查詢
處理多值字段
#處理多值字段
POST /movies/_bulk
{ "index": { "_id": 1 }}
{ "title" : "Father of the Bridge Part II","year":1995, "genre":"Comedy"}
{ "index": { "_id": 2 }}
{ "title" : "Dave","year":1993,"genre":["Comedy","Romance"] }
#處理多值字段,term 查詢是包含,而不是等於
POST movies/_search
{
"query": {
"constant_score": {
"filter": {
"term": {
"genre.keyword": "Comedy"
}
}
}
}
}
處理多值字段,term 查詢是包含,而不是等於
儘管包含除了Comedy以外的其他詞,它還是被匹配並作爲結果返回
怎麼實現genre裏面只有Comedy這1個值的搜索結果?
最好的方式是增加並索引另一個字段, 這個字段用以存儲該字段包含詞項的數量.
我另外插入測試數據
POST /movies/_bulk
{ "index": { "_id": 3 }}
{ "title" : "Father of the Bridge Part II","year":1995, "genre":"Comedy","genre_count" : 1}
{ "index": { "_id": 4 }}
{ "title" : "Dave","year":1993,"genre":["Comedy","Romance"],"genre_count" : 2 }
GET /movies/_doc/3
#處理多值字段,term 查詢是包含,而不是等於
POST movies/_search
{
"query": {
"constant_score": {
"filter": {
"bool": {
"must":[
{ "term" : { "genre.keyword" : "Comedy" }},
{ "term" : { "genre_count" : 1 } }
]
}
}
}
}
}
這個查詢現在只會匹配具有單個標籤 comedy 的文檔,而不是任意一個包含 comedy 的文檔。
參考:
https://www.elastic.co/guide/cn/elasticsearch/guide/current/_finding_multiple_exact_values.html