前言
因為最近在寫一個功能點是與Elastic Search 相關的,是以最近在完成功能的基礎上,還去查了很多有關于Elastic Search的文檔。Elastic Search 的 client ,還是不少的,但是現在我隻用了Java High Level REST Client。下面是進行的總結,希望也可以幫助像我一樣的小白。
多說一點:這是我的第一篇筆記,作為一個馬上要畢業的大學生來說,多學,多聽,多積累,是很有必要的。有可能語言上比較晦澀難懂,技術的闡述上也不是那麼娴熟準确,但是我會好好努力的。
為什麼用到Elastic Search?
這裡的Elastic Search 泛指的是全文檢索。在剛接觸的時候,我想過這樣一個問題,在關系型資料庫mysql的
like進行模糊查詢的效果,與Elastic Search這樣的全文檢索,效果幾乎就是一樣的,那為什麼還要用全文檢索呢?如果是學了一些的現在的我,遇上了剛開始接觸全文檢索的我的話,一定會指着自己的鼻子說:“你真是無知啊。”
原因我覺得一共有兩個:
第一個是查詢的速度特别快!在關系型資料庫中,資料是結構化的,我們當要進行模糊查詢的時候,會從想要查詢的表的第一條資料開始比對,如果不是,繼續下一條,如果再不是,繼續去查,就這樣一直查下去,直到查到了,自己想要的那條資料。而Elastic Search呢?它其實使用了反向索引的索引方法。大概意思其實是這樣的:現在一個有三篇文章
| id | content |
|--------|------------------------------|
|文章1| Java是世界上最好的 . |
|文章2| 人生苦短,快學python|
|文章3| C++是世界上最難的 . |
這也是存儲在關系型資料庫中的存儲形式,查詢的話,他會一行行的進行查詢。而如果存在了Elastic Search 中會變成什麼樣子呢?在全文檢索中存在這分詞器這麼個東西,分詞器會把輸入的句子自動的進行一定規律進行分割,例如過空格分割,下劃線分割,等等。如果是中文,也有插件可以對其進行語義分割。分割後的效果如下所示(隻是舉例子,真實情況未必如此)
|關鍵詞 | 文章号|
|------------|----------|
|世界 | 1,3 |
|人生苦短| 2 . |
|Java | 1 . |
|python | 2 |
|C++ | 3 |
當我們輸入世界,立刻就知道出現在了第一個,和第三個文章中。
第二個是因為我們在做全文檢索的時候,根本用不到那麼複雜的邏輯,我們用到基礎的增删改查就行,使用了Elastic Search 之後,我們在用不用折騰資料庫那麼多的資料了。
我們怎麼去使用Elastic Search?
在我們看來學習一門新的技術最主要的還是要去多看看官網,最基本能用到的官網應該都會說。這是官網傳送門:
https://www.elastic.co/,接下來是 rest high level api的傳送門:
https://www.elastic.co/guide/en/elasticsearch/client/java-rest/6.3/java-rest-high-getting-started-initialization.html。官網上有怎麼進行下載下傳,安裝,如何使用的方法。如果覺得官網寫的不是那麼細緻還有大牛們在各大部落格上,進行的知識分享。
以下是使用Rest high level api 操縱Elastic Search的
https://www.cnblogs.com/ginb/p/8716485.html https://blog.csdn.net/paditang/article/details/78802799還有使用curl操縱Elastic Search 的
https://www.cnblogs.com/mycd/p/7859792.html個人使用經驗
剛使用了半個多月,以下是我的個人拙見,分析也不是特别全面。
我個人在簡單的連接配接到Elastic Search 的時候,使用的是Post Man,有可能是因為先入為主的原因吧,在上大學的時候,無意間接觸到了這個神奇,然後便一發不可收拾。它可以發送get,post , put, delete 等 所有的rest api 。并且可以攜帶上各種參數,無論是在請求頭,還是請求體。不但如此,在有spring security防護下的項目,我們可以攜帶上token進行通路。不但如此,我最喜歡的還是他能存儲url的功能,友善快捷。所有這些功能,再有可視化界面的加持下,顯得更加的舒服。
Post Man 操縱Elastic Search 指令如下 :
首先我先聲明一個全局變量(開個玩笑)其實就是把下文中的所有
http://ip:port/_index/_type換成了
ES,這裡值得說一下的是_index類似于像是database的概念,_type類似于table的概念。以上參數都可以換成自己對應的參數。
創造一個文檔,我們使用PUT請求,url為: ES/_id content-type選擇application/json,然後寫一個json資料例如:
{
"first_name" : "John",
"last_name" : "Smith",
"age" : 25,
"about" : "I love to go rock climbing",
"interests": [ "sports", "music" ]
}
這樣就成功建立了一個文檔。可以使用不同的_id建立多個文檔,如果我們使用了相同的id使用不同的json資料,那麼相當于修改操作。
查詢一個文檔,我們使用GET請求,url為:ES/_id。在這裡如果添加了?pretty。形如ES/_id?pretty那麼結果就會顯示為整齊json格式。傳回的結果中的 _source為本文檔使用者插入的資料,其餘的為這篇文檔的中繼資料。
如果我們使用了ES/_search,那麼就是不添加任何條件,進行全部搜尋。
如果想進行準确查詢ES/_search?q=key:value。在這裡key為想要查詢的字段,value為想要查詢的結果。
删除一篇文檔,我估計我不說,大家也會猜出來了吧。沒錯,就是使用DELETE請求,發送ES/_id即可。
本文純手打,不但是對自己學習的一種總結,也希望可以幫助到需要幫助的人,謝謝大家。不喜勿噴。