本篇介紹 Query DSL 的 term-lvel queries
我會著重在我使用過或是覺得比較特別的 query,沒有介紹到的不代表不重要
term-level queries 不像 full-text quries 去 analyze(分析) query string轉換terms之後再去匹配,
而是直接用query去匹配存在field內的exact terms(精確的值)
exists
query
找出指定field是否含有indexed values(建立索引的值)的documents
有幾種可能是document的indexed values不存在的:
null
或 []
index
設為 false
ignore_above
的設定值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
小小新手,如有理解錯誤或寫錯再請不吝提醒或糾正
Term-level queries
ignore_malformed