iT邦幫忙

2023 iThome 鐵人賽

DAY 17
0
Software Development

由淺入深來探討Elasticsearch,從基礎語法到底層相關原理系列 第 17

【Day 17】由淺入深來探討Elasticsearch - Searching for Data (1)

  • 分享至 

  • xImage
  •  

從今天開始我們就來介紹ES中不同種類的搜尋方式
在ES中,search query或是簡稱query,就是對index或是ES data stream發送請求取得相關的資訊
一般我們會比較習慣使用Query DSL來寫語法

Query DSL有以下特點:

  • Domain-Specific Language,是ES提供建構查詢語句的特定語言
  • 可由Leaf query clauses與Compound query clauses組成
    • 前者為對於特定欄位的特定查詢方法,如match, term等
    • 後者代表查詢語句可以由多個leaf查詢或是compound查詢所組合而成,可以支持複雜的邏輯結構
  • 支持一些消耗量大的查詢方式
    • 查詢join type field或是使用script等等

接下來我們來介紹幾種常用的查詢方式:

  1. term-level queries
  2. range search
  3. prefixes, wildcard與正規表達式查詢
  4. full text query
  5. match query

term-level queries

  • 通過查找結構資料來獲取精確值
    • 例如尋找特定型號或是品牌
  • 詞語查詢沒有使用分析器
    • 因為要精確找到反向索引中的文檔,因此不會做任何修飾
    • 代表如果有時態或是大小寫問題會導致找不到結果
GET /your_index/_search
{
  "query": {
    "term": {
      "filed_name": {
        "value": "value"
      }
    }
  }
}
  • 支援查詢不同類型的欄位
// boolean
"term": {
      "filed_name": {
        "value": true
}
// numbers
"term": {
      "filed_name": {
        "score": 60
}
// date
"term": {
      "filed_name": {
        "create_time": "2023-05-30 11:27:39"
}
  • 可以透過調整其他參數來達到不同效果
// case_insensitive可以忽略大小寫
"term": {
	"block": {
		"value": "nba", // 原始資料是NBA
    "case_insensitive": true // 可以使其忽略大小寫
  }
}
// 透過改成terms來查詢多個單字,只要文檔含有其中一個就返回
"terms": {
	"FIELD": [
	  "VALUE1",
    "VALUE2"
	]
}

range search

  • 可以查詢範圍,包含或是不包含
GET /your_index/_search
{
  "query": {
    "range": {
      "FIELD": {
        "gte": 10,
        "lte": 20
      }
    }
  }
}
參數名稱 數學符號 描述
gt > 大於
gte 大於等於
lt < 小於
lte 小於等於

range也能查日期範圍

  • 如果沒有精確到時間,ES會預設00:00:00
  • 可以設time_zone來調整時區範圍
"range": {
	"time_field": {
    "time_zone": "+01:00", 
    "gte": "2023/9/18",
    "lte": "2023/9/19"
		}
}

Prefixes, wildcards & regular expressions

GET /ptt/_search
{
  "query": {
    "wildcard": { // 這邊可以放prefix, wildcard或是regexp分別對應不同的搜尋方式
      "block": {
        "value": "G"
      }
    }
  }
}
  • 三種查詢方式都能搭配case_insensitive
  • prefix代表開頭為這個值的可以匹配
  • wildcard則可以搭配*與?使用,但是最好不要放在value的開頭
  • 正規表達式則是要注意有些寫法跟其他系統不太一樣
    參考:https://www.elastic.co/guide/en/elasticsearch/reference/current/regexp-syntax.html

full text query

  • 用於非結構化文字,例如文章、標題或是內容等等
  • 會經過跟查詢欄位的analyzer一樣處理,這樣才能匹配

Match query

  • 最泛用的全文搜尋
  • 可以查多個目標
    • 預設是or,但是也可以透過operator來調整搜尋範圍
GET /ptt/_search
{
  "query": {
    "match": {
      "FIELD": "TEXT1 TEXT2",
			"operator": "AND"
    }
  }
}

今天在一些參數上沒有提到太多~之後要使用到的時候再一起介紹
明天我們會繼續把一些基礎的查詢用法給介紹完~
並且也會補上之前沒有介紹完,object搜尋的坑~

參考資料
search your data:
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-your-data.html

Query DSL:
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl.html

regexp:
https://www.elastic.co/guide/en/elasticsearch/reference/current/regexp-syntax.html


上一篇
【Day 16】由淺入深來探討Elasticsearch - Analyzers
下一篇
【Day 18】由淺入深來探討Elasticsearch - Searching for Data (2)
系列文
由淺入深來探討Elasticsearch,從基礎語法到底層相關原理30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言