本篇介紹 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