Elasticsearch核心技術與實戰學習筆記 第四章 25 | 結構化搜索

一 序

  本文屬於極客時間Elasticsearch核心技術與實戰學習筆記系列。

二 結構化數據

結構化搜索(Structured search) 是指對結構化數據的搜索

  • 日期,布爾類型和數字都是結構化

文本也可以是結構化的

  • 如彩色筆可以有離散的顏色集合:紅(red)、綠(green)、藍(blue)
  • 一個博客可能被標記了標籤,例如,分佈式(distributed)和搜索(search)
  • 電商網站上的商品都有 UPCs(通用產品碼 Universal Product Codes)或其他的唯一標識,它們都遵從嚴格規定的、結構化的格式

ES 中的機構化搜索

  • 布爾、時間,日期和數字這類結構化數據:有精確的格式,我們可以對這些格式進行邏輯操作。包括比較數字或時間的範圍,或判斷兩個值的大小
  • 結構化的文本可以做到精確匹配或者部分匹配
  1. Term 查詢 / Prefix 前綴查詢
  • 結構化結構只有 “是” 或 “否” 兩個值
  1. 根據場景需要,可以決定結構化搜索是否需要打分

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

 

小結

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章