Ⅰ elasticsearch基本查詢筆記(三)-- es查詢總結
term 查詢是簡單查詢,接受一個欄位名和參數,進行精準查詢,類似sql中:
ES中對應的DSL如下:
在ES5.x及以上版本,字元串類型需設置為keyword或text類型,根據類型來進行精確值匹配。
當進行精確值查詢,可以使用過濾器,因為過濾器的執行非常快,不會計算相關度(ES會計算查詢評分),且過濾器查詢結果容易被緩存。
bool過濾器組成部分:
當我們需要多個過濾器時,只須將它們置入 bool 過濾器的不同部分即可。
terms是包含的意思,如下:
name包含["奧尼爾","麥迪"]
返回結果:
range查詢可同時提供包含(inclusive)和不包含(exclusive)這兩種范圍表達式,可供組合的選項如下:
類似sql中的范圍查詢:
ES中對應的DSL如下:
如下sql,age不為null:
ES中對應的DSL如下:
如下sql,age為null:
ES中對應的DSL如下:
註:missing查詢在5.x版本已經不存在。
匹配包含 not analyzed(未分詞分析)的前綴字元:
匹配具有匹配通配符表達式( (not analyzed )的欄位的文檔。 支持的通配符:
1) * 它匹配任何字元序列(包括空字元序列);
2) ? 它匹配任何單個字元。
請注意,此查詢可能很慢,因為它需要遍歷多個術語。
為了防止非常慢的通配符查詢,通配符不能以任何一個通配符*****或 ? 開頭。
正則表達式查詢允許您使用正則表達式術語查詢。
舉例如下:
注意: * 的匹配會非常慢,你需要使用一個長的前綴,
通常類似.*?+通配符查詢的正則檢索性能會非常低。
模糊查詢查找在模糊度中指定的最大編輯距離內的所有可能的匹配項,然後檢查術語字典,以找出在索引中實際存在待檢索的關鍵詞。
舉例:
檢索索引test_index中,type為user的全部信息。不過在 es6.x 版本,一個index僅有一個type,未來 es7.x 版本,將取消type,所以這個查詢沒啥意義。
返回指定id的全部信息。
全文檢索查詢,是通過分析器,對查詢條件進行分析,然後在全文本欄位進行全文查詢。
全文搜索取決於mapping中設定的analyzer(分析器),這里使用的是ik分詞器。
所以在進行查詢開發時候,需要先了解index的mapping,從而選擇查詢方式。
匹配查詢接受文本/數字/日期類型,分析它們,並構造查詢。
對查詢傳入參數進行分詞,搜索詞語相同文檔。
match_phrase查詢分析文本,並從分析文本中創建短語查詢。
用戶已經漸漸習慣在輸完查詢內容之前,就能為他們展現搜索結果,這就是所謂的即時搜索(instant search) 或輸入即搜索(search-as-you-type) 。
不僅用戶能在更短的時間內得到搜索結果,我們也能引導用戶搜索索引中真實存在的結果。
例如,如果用戶輸入 johnnie walker bl ,我們希望在它們完成輸入搜索條件前就能得到: Johnnie Walker Black Label 和 Johnnie Walker Blue Label 。
match_phrase_prefix與match_phrase相同,除了它允許文本中最後一個術語的前綴匹配。
Ⅱ ES導致SQL注入的方式
SQL注入方法
方法1
先猜表名
And (Select count(*) from 表名)<>0
猜列名
And (Select count(列名) from 表名)<>0
或者也可以這樣
and exists (select * from 表名)
and exists (select 列名 from 表名)
返回正確的,那麼寫的表名或列名就是正確
這里要注意的是,exists這個不能應用於猜內容上,例如and exists (select len(user) from admin)>3 這樣是不行的
很多人都是喜歡查詢裡面的內容,一旦iis沒有關閉錯誤提示的,那麼就可以利用報錯方法輕松獲得庫裡面的內容
獲得資料庫連接用戶名:;and user>0
方法2
後台身份驗證繞過漏洞
驗證繞過漏洞就是'or'='or'後台繞過漏洞,利用的就是AND和OR的運算規則,從而造成後台腳本邏輯性錯誤
例如管理員的賬號密碼都是admin,那麼再比如後台的資料庫查詢語句是
user=request("user")
passwd=request("passwd")
sql='select admin from adminbate where user='&'''&user&'''&' and passwd='&'''&passwd&'''
那麼我使用'or 'a'='a來做用戶名密碼的話,那麼查詢就變成了
select admin from adminbate where user=''or 'a'='a' and passwd=''or 'a'='a'
這樣的話,根據運算規則,這里一共有4個查詢語句,那麼查詢結果就是 假or真and假or真,先算and 再算or,最終結果為真,這樣就可以進到後台了
這種漏洞存在必須要有2個條件,第一個:在後台驗證代碼上,賬號密碼的查詢是要同一條查詢語句,也就是類似
sql="select * from admin where username='"&username&'&"passwd='"&passwd&'
如果一旦賬號密碼是分開查詢的,先查帳號,再查密碼,這樣的話就沒有辦法了。
第二就是要看密碼加不加密,一旦被MD5加密或者其他加密方式加密的,那就要看第一種條件有沒有可以,沒有達到第一種條件的話,那就沒有戲了
Ⅲ es的sql將double轉成long
第一種強制類型轉換doubled=1.5;inti=(int)d;這種方式的話採取的是截位,意思就是去掉小數點後的數字,比如1.8,結果是1,如果是1.9999999,那結果也是1;
第二種使用Round函數:doubled=1.6;inti=Math.Round(d,0);(保留0維小數就是取整)
第二個參數表示的是保留的小數位數,使用Round函數是四捨五入,而不是截位,比如是1.4,那結果就是1,是1.5,結果就是2(3)es兼容sql擴展閱讀:double類型轉換成int類型例題:int16=short;int32=int;int64=long;double轉成int時候會涉及都小數,看你像對小數做什麼操作了,以3.8為例子:
intnum=Math.Floor(3.8)
//返回小於或等於指定數字的最大整數,結果為3intnum=Math.Round(3.8)//將值舍入到最接近的整數或指定的小數位數,結果為4
Ⅳ ES里有類似sql的lag或lead函數的功能么
對於支持分析函數lag的資料庫(Oracle 9i或之後, SQL Server 2012開始有支持lag, lead分析函數; PostgreSQL和MySQL不知道)來說, 可以直接使用lag函數. lag分析函數的作