1.elasticsearch的結構
首先elasticsearch目前的結構為 /index/type/id id對應的就是存儲的文檔ID,elasticsearch一般將數據以JSON格式存儲。我們可以將elasticsearch和關系型數據庫進行比較,index相當於關系型數據庫中的database,type相當於table,而id就相當於表中的主鍵,elasticsearch中一個文檔存儲的一個json則能視為是關系型數據庫中一張表的一行數據,而ID就是他的主鍵,在理解了es的存儲結構后我們就可以對elasticsearch的一些基本使用進行了解了。
2.映射
elasticsearch在導入數據到索引時會按照固定的模板去導入數據,模板中可以設置字段的數據類型,以及設置數據的分詞策略,注意es會在數據導入時就對數據做分詞,然后在搜索數據的時候,會按照存入時的分詞策略查詢數據
{"settings":{ "analysis" : { "analyzer" : { "ik" : { "tokenizer" : "ik_max_word" } } }, "index" : { "analysis.analyzer.default.type": "ik_max_word" } }, "mappings": { "doc": { "dynamic": "false", "properties": { "brand": { "type": "string", "analyzer": "ik_max_word" }, "product_name": { "type": "string", "analyzer": "ik_max_word" } } } } }
關於分詞,elasticsearch中默認的標准分詞器基本只能將一句話只能分成一個個的字,所以我們要用到ik分詞器,切記版本問題。
下載地址》》:https://github.com/medcl/elasticsearch-analysis-ik
下載完成直接解壓到es的pulgin目錄下就行,ik分詞器默認有兩種分詞方式:
(1) ik_max_word,該模式的分詞策略為最大化詞匯搜索,既會遞歸整個詞條,將詞條中所有的語句列出,允許重復。
(2) ik_smart,該策略不允許詞匯重復,詞條中如果有沒有匹配到詞典的字直接忽略
關於ik分詞器這里就不再詳細敘述了,有一些關於詞典的知識請大家自行百度,這里只對elasticsearch重點講述!
3.搜索
①query組件
好了,到了正式介紹es的時候,搜索引擎不用多說搜索肯定是最重要的一點,下面給出一個最簡單的例子
首先看到 紅色箭頭1 ,整個語句意思從前至后 分別為 GET 方式對es請求, /catalogue 為請求的索引地址,可以具體到/type甚至id,/_search代表發起查詢請求,而后面的則是請求的json體,毫無疑問json體是搜索的關鍵也是今天的主要講解內容。
再看到紅色剪頭2,es中所有的查詢都要包含在query組件中,query后面則跟着一個JSON,JSON的內容也就是紅色剪頭3,match_all代表無條件的查詢即搜索所有,同樣的還有match代表有條件的查詢,查詢條件放在match后面的json中,記住整個查詢體都按照json格式來寫。
如上隊商品名進行查詢,查出所有名字包含洗衣粉的商品,搜索結果如下:
可以看到返回hits的其實是個json數組,每個json中包含着該數據的index、type、id以及匹配的分數_score以及數據_source
好了,這樣就介紹完了最基本的單條件搜索
②bool組件
上面是單條件查詢,那么多條件怎么查詢呢,可以看到如下圖:
可以看到直接在query里面是不能進行多條件查找的,這里需要用到bool組件
使用bool組件進行復雜的查詢:
可以看到使用bool組件后多條件搜索就沒有報錯,那么bool的結構是怎么樣呢?
bool表達式包含三個jsonArray:
(1)must 包含了所有必須匹配的條件,如果有一項不匹配則排除,類似於邏輯且
(2) should包含的條件必須滿足至少一個,類似於邏輯或
(3)must_not 包含了所有排除的條件,類似於邏輯非
整個結構如下:
{ "query":{ "bool":{ "must":[], "should":[], "must_not":[] } } }
並且bool直接多重嵌套使用,所以想做出復雜的搜索功能,可以在bool上多下功夫
還有如上圖中的range范圍控制,和size查詢的大小就不細說,看圖應該就明白了
③分頁查詢
這里再講一下es中怎么做到分頁查詢
es中和size並列還有from屬性,size是一次查詢的數量,from則是從第幾個開始查,搭配使用即可達到分頁查詢的目的
④排序
es中可以使用sort對數據進行排序,sort為一個jsonArray,可以按照多個字段對數據進行排序,說明一下,如果不使用sort排序,es則默認按照_score匹配分數進行降序排序,當使用sort並且sort中沒有_score時,_score會變成null從而達到排除按照_score排序,按照多個條件進行排序時,按照jsonArray中json的排序順序進行先排和后排,關於升序降序學過數據庫的童鞋應該很清楚!什么?沒學過數據庫?那你現在還不去學數據庫?
至此elasticsearch基礎教程結束,后面將為大家帶來elasticsearch的進階教程和ELK架構實現電商搜索引擎