iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 25
1
Elastic Stack on Cloud

Elastic Stack武學練功坊系列 第 25

Elastic Stack第二十五重

  • 分享至 

  • xImage
  •  

Query DSL Part VI (查詢語法)

本篇介紹 Query DSL 的 term-lvel queries
我會著重在我使用過或是覺得比較特別的 query,沒有介紹到的不代表不重要


Term-level queries

term-level queries 不像 full-text quries 去 analyze(分析) query string轉換terms之後再去匹配,
而是直接用query去匹配存在field內的exact terms(精確的值)

exists query
找出指定field是否含有indexed values(建立索引的值)的documents

有幾種可能是document的indexed values不存在的:

  • 原始的JSON資料就是 null[]
  • 此 field 的 mapping parameter index 設為 false
  • field value的長度超過 mapping parameter ignore_above 的設定值
  • field value是"異常的",而且 mapping parameter ignore_malformed 是設為 true

簡單說明一下 mapping parameter ignore_malformed
此參數 ignore_malformed 預設為 false
一般而言,如果把 string (如 test) 儲存至 field type 為 integer (或其他numeric type),
是會造成exception,而讓此新增document的動作失敗,
如果此參數 ignore_malformed 設為 true ,則可以讓此field有exception產生時,忽略他,
而其他field都可正常輸入沒有exception產生,則最後此筆document則會被新增,

找出field user 是有indexed value的 documents

GET /_search
{
  "query": {
    "exists": { (1)
      "field": "user" (2)
    }
  }
}

(1): exists query
(2): field 參數,為必填,是用來指定欲搜尋的 field

所以此 query會回傳的documents是 field user 有indexed value的

[Note]
上面說明仔細看會發現,JSON value是 null[] 才會屬於不存在 indexed value,
所以其實 "" , "-" , [null, "foo"] 都是屬於有 indexed value的

那如果我現在是要找某一field不存在indexed value的documents呢?
搭配 bool query 中的 must_not 即可
Request

GET /_search
{
  "query": {
    "bool": {
      "must_not": {
        "exists": {
          "field": "user"
        }
      }
    }
  }
}

IDs query

其實之前在某一篇章有介紹過,這次在完整介紹一下

透過此query,可以用 ids來搜尋出documents,而搜尋的正是 metadata fields的 _id field

Example Request

GET /_search
{
  "query": {
    "ids" : { (1)
      "values" : ["1", "4", "100"] (2)
    }
  }
}

(1): ids query
(2): value 參數,為必填,欲搜尋的ids (array of strings)

prefix query
匹配指定field的prefix(前綴),是否含有query string,如有則回傳此documents

Example Request

GET /_search
{
  "query": {
    "prefix": { (1)
      "user.id": { (2)
        "value": "ki" (3)
      }
    }
  }
}

(1): prefix query
(2): <field>,必填,欲搜尋的 field
(3): value,必填,在(2) field中,欲搜尋的前綴(prefix)字串

搜尋 field user.id 的field value前綴(prefix)是"ki"的documents

es提供了更簡短的寫法,以上述為例,可改寫為

GET /_search
{
  "query": {
    "prefix" : {
      "user.id" : "ki" 
    }
  }
}

也就是合併 <field>value


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


Reference

Term-level queries
ignore_malformed


上一篇
Elastic Stack第二十四重
下一篇
Elastic Stack第二十六重
系列文
Elastic Stack武學練功坊30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言