iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 7
0

Searching Part I(搜尋)

主要介紹搜尋的請求和回應的參數
此篇的指令以 kibana 操作為主,個人覺得比較方便好用且易上手


匯入樣本資料 (sample data set)

利用elastic提供的sample data set匯入至我們的elastic cloud
有些許資料就可以很快速的看出我們執行指令的效果,
有不一樣的data也可以嘗試更多指令,比較指令間的差異

下載資料

sample data set: account.json

可以按右鍵另存新檔,即會挑出下載視窗

每一筆資料為使用者帳戶的資訊,例如:

{
  "account_number": 0,
  "balance": 16623,
  "firstname": "Bradshaw",
  "lastname": "Mckenzie",
  "age": 29,
  "gender": "F",
  "address": "244 Columbus Place",
  "employer": "Euron",
  "email": "bradshawmckenzie@euron.com",
  "city": "Hobucken",
  "state": "CO"
}

批次匯入資料

到剛剛下載的檔案(account.json)的目錄下,執行指令

Request (cURL)

curl -u {AUTH} "{endpoint}/bank/_bulk?pretty&refresh" -XPOST -H "Content-Type: application/json" --data-binary "@accounts.json"

如不知道{AUTH}{endpoint}要替換什麼值,可參考 Elastic Stack第五重
[注意] "{endpoint}/bank/_bulk?pretty&refresh" 這邊要用 "(雙引號) 包起來,不然會報錯

Response(因為過長,所以只截片段圖)
Bulk Insert Response

驗證結果

可使用 上一重 教的 取得指定index內的所有documents 來驗證

Verification
發現 bank index被建立了,而且有資料了

查看所有indices狀況

indices為index複數

Request (kibana)

GET /_cat/indices?v

Response
Cat Indices Response
可以發現有 bank 這個index,以及 docs.count (代表documents數量) 有1000筆


搜尋 (Search)

Sort(排序)
搜尋 bank index所有documents,並用 account_number 排序

Request (kibana)

GET /bank/_search
{
  "query": {
    "match_all": {}
    
  },
  "sort": [
    {
      "account_number": "asc"
    }
  ]
}

Response
Bank Search Response

Response Parameters (回應參數)
針對 _search 的 Response 做更詳細的介紹

  • took: 此次request耗時多久 (毫秒)
  • timed_out: 此次request 是否 timed out
  • max_score: 匹配的documents中最高的分數 (相關分數)
  • hits.total.value: 共匹配多少documents
  • hits.hits: 為此次搜尋結果的documents,預設只取最前面10筆
  • hits.hits[i]._score: document 的 相關分數 (match_all 不適用於此)

Page Through (分頁)
每一個搜尋要求(search request) 都是獨立的,也就是requests間沒有狀態關係,
所以如果想要翻頁(取得其他筆資料),可用
from: 從第幾筆開始 (預設為0)
size: 取幾筆 (預設為10)

範例:取bank index第二頁的documents,即取得第10筆到第19筆

Request (kibana)

GET /bank/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "account_number": "asc"
    }
  ],
  "from": 10,
  "size": 10
}

Response
Search Page Through Response

搜尋特定欄位是否包含某字串

以搜尋 address (地址) 是否包含 milllane

Request (kibana)

GET /bank/_search
{
  "query": {
    "match": {
      "address": "mill lane"
    }
  }
}

Response
Search match Response
此時可以在和上面詳細介紹的參數做比對,
[紅框]
max_score 是指匹配的最高分,第一筆即是一樣的分數,代表第一筆是最匹配的,
而在不指定排序情況下,預設的排序即是 高分->低分
[橘黃框]
第一筆的 address不僅有 mill 也有 lane,而第二筆只有 mill
也因此,第一筆會比第二筆還高分

[注意]

  • 此request是去找有 milllane
  • 會發現其實request的搜尋字串都是小寫,為什麼還可以匹配到,因為es在不設定 analyzer 情況下,預設是使用 standard analyzer,而此analyzer中間有一步驟是會把字詞都變小寫(lowercase),後續會有篇章更詳細介紹 analyzer

那如果現在想要真的搜尋 "mill lane" 這個字串呢?
使用 match_phrase

Request (kibana)

GET /bank/_search
{
  "query": {
    "match_phrase": {
      "address": "mill lane"
    }
  }
}

Response
Search match_phrase Response


小小新手,如有理解錯誤或寫錯再請不吝提醒或糾正


Reference

Indexing documents in bulk
Start searching


上一篇
Elastic Stack第六重
下一篇
Elastic Stack第八重
系列文
Elastic Stack武學練功坊30

尚未有邦友留言

立即登入留言