Elasticsearch全文檢索實戰小結

1、項目概述

這是一個被我稱之爲「沒有槍、沒有炮,硬着頭皮本身造」的項目。項目是和其它公司合做的三個核心模塊開發。 
使用ES的目的是: 
1)、採集數據、網站數據清洗後存入ES; 
2)、對外提供精確檢索、通配符檢索、模糊檢索、分詞檢索、全文檢索接口等二次封裝接口。html

2、項目架構

這裏寫圖片描述
如上圖所示,ES做爲中間層,一方面存儲數據清洗後存儲的數據,另外一方面對外提供插入、更新、刪除、檢索接口的。前端

3、ES使用小結

3.1 ES版本選型

1.X,2.X版本有太多侷限性,5.X作了較大性能提高的改進。好比:string字段類型分紅了keyword和text兩種類型,keyword用於精確匹配,text結合設定的分詞器用於全文檢索。 
選擇5.X須要勇氣,實踐證實當時「向前一小步」的正確性。jquery

3.2 ES安裝部署

ELK都有安裝。 
ES安裝了head插件,用途:查看集羣狀態、查看索引信息、查看mapping信息、查看每一個索引下數據信息、進行簡單字段查詢操做; 
安裝了ik分詞插件,用途:分詞,實現全文檢索。 
安裝了Kibana,用途:數據對接展現;用DevTool替代postman執行DSL驗證,以驗證增、刪、改、查功能。 
安裝了logstash,用途:藉助「logstash-input-jdbc」實現數據庫到ES之間的同步。spring

3.3 ES API選型與使用

調研了ES提供的原生API以及Jest等,最終選擇Jest。將Maven工程相關jar包導出到項目中使用。sql

3.4 後端框架選型

play new 工程名 
play eclipsify 工程名 
play clean 
play deps 
play run 測試模式 
play start release模式數據庫

3.5 ES分頁處理

ES Java接口能返回的默認的最大記錄數爲10000行。若是想返回超過1W+條的記錄,須要作以下設置:後端

PUT ting_index/_settings
{
  "max_result_window" : 500000 }
  • 1
  • 2
  • 3
  • 4
  • 5

3.6 如何只刪除數據,而不刪除索引

相似Mysql等關係型數據庫的delete from mtable操做,而不是drop掉表,參考以下:api

POST my_store/products/_delete_by_query
{
  "query": { "match_all": {} } }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

參考:https://www.elastic.co/guide/en/elasticsearch/reference/master/docs-delete-by-query.html緩存

3.7 Jest update更新操做

數據前添加doc一層,以下所示: 
strJson = 「{」 + 」 \」doc\」 :」 + strJson + 「}」;tomcat

3.8 集羣中全部節點都安裝ik分詞器

集羣裏每個實例都要安裝ik插件。 
不然,當咱們更新包含指定分詞的mapping的時候會報錯。

3.9 最大字節數限制

報錯信息以下:「whose UTF8 encoding is longer than the max length 32766 「, 
這個問題是某個字段size過大致使lucence不能索引引發的。 
若是要存儲超過32766字節的數據,那麼須要在mapping中設置字段時,添加ignore_above = 256就能夠了。

舉例,新增Mapping的操做以下:

POST tingindex/tingtype/_mapping
{
    "tingtype":{ "properties":{ "content":{ "type":"text", "analyzer":"ik_max_word", "search_analyzer":"ik_max_word", "fields":{ "keyword":{ "ignore_above":256, "type":"keyword" } } }, "publish_time":{ "type":"date", "format":"YYYY-MM-dd HH:mm:ss" }, "author":{ "ignore_above":256, "type":"keyword" }, } } }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

參考: 
https://www.elastic.co/guide/en/elasticsearch/reference/5.5/ignore-above.html

3.10 出現未分派, elasticsearch集羣,在新增節點調整分片數時,出現UNASSIGNED。

排查方案: 
GET /_cluster/allocation/explain

3.11 kibana修改時區

kibana->management->advanced setting->dateFormat:tz, 編輯,改爲GMT +0。

3.12 ES檢索(URL訪問方式)

不指定索引的全文檢索舉例: 
http://192.168.11.174:9200/_search?pretty&q=北京 
指定索引的全文檢索舉例: 
http://192.168.11.174:9200/articles/articles_info/_search?pretty&q=北京 
指定字段檢索舉例: 
http://192.168.11.174:9200/articles/articles_info/_search?pretty&q=title:我愛北京天安門

3.13 ES高性能配置(from ES中文社區)

【1】分詞對性能的影響: 
索引過程當中,分詞會對索引速度有所影響,建議你能夠優化一下你的mapping,沒必要要的就沒必要分詞,甚至沒必要設成可搜索的了。 
舉例:5.X中沒必要要分詞的設置爲keyword類型。

【2】分片和副本對性能影響: 
分片和副本的設計,應該根據節點數來調整,正常狀況下 節點數= (副本數+1)*分片數,如果你但願提升搜索性能,但是適當提升副本數。

【3】內存對性能的影響: 
1).節點的內存分配的不能太少了。 
ES其實很佔內存,大部分的操做都是創建在內存足夠的基礎上。 
舉例:你的數據量應該在150G-200G左右,我以爲能夠把內存調整到10G左右。

2). ES的內存使用分爲兩部分ES緩存和Lucene經過內核緩存加速一些數據。

3). 若是服務器內存 nG > 64G,ES的內存儘可能設置低於32G,建議最大31G. 
由於es使用「內存指針壓縮」技術,一旦內存內存大於32G這項技術將失效,內存有效使用只有原來的60%~70%。 
你沒必要爲內存浪費而擔憂,由於lucene會經過系統把一些聚合和排序的數據緩存起來方便你快速查詢使用。

4) .若是服務器內存 nG < 64G,建議給ES分配 內存 (n-2)/2G. 首先2G是給系統預留,而後es和lucene。

5) . 若是你想繼續你的實時查詢,儘可能不要使用swap(交換分區),建議關閉系統swap使用

【4】ES線程設置 
線程數方法:線程數:=(內核數*3)/2+1

舉例:檢索服務器是24核,因此:線程池的大小=(24*3)/2+1=37 。 
參考: 
https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-threadpool.html

4、項目總體小結

4.一、需求要細化

切記: 
1)不要拿到合同或需求就開發。 
2)欲速則不達。 
3)需求細化後造成《需求規格說明書》,並必定郵件或電話或當面找用戶確認。 
對於需求,由頂向下知道須要實現的核心功能,團隊核心敲定分幾個模塊? 
逐個模塊細化需求點。

4.二、預研要充分

對於新的技術點,在項目啓動後的需求細化階段便可同步進行。 
做爲項目經理的我,沒有事必躬親,多關注預研點方案選型、預研難點、預研報告,小細節如:下載、安裝部署、參數驗證、英文翻譯安排團隊其它成員執行。

4.三、文檔要跟進

需求有需求文檔,設計根據項目須要和進度安排有概要設計或詳細設計文檔。 
設計文檔千萬不能少,設計的過程就是開發「路演」的過程。 
設計文檔必定要梳理清楚架構圖、模塊圖、數據流圖、流程圖。 
需求文檔是設計的基礎,需求和設計文檔是開發的基礎。

4.四、思惟要活躍

技術方案的選型很重要,大的方面包括:

1)檢索存儲集羣部署,集羣節點個數選擇等。 
2)先後端選型,前端用jquery,jsp仍是js? 後端使用spring,tomcat,仍是play框架? 
3)開源方案選型,要提前預研可用性、需求點覆蓋程度、二次開發或封裝難度等。 
4)先後端接口對接格式敲定。 
5)對外提供檢索服務接口名稱,參數敲定。

思惟活躍主要體如今:

1)方案選型、技術調研快刀斬亂麻,時間緊,不糾結。此路不通,另尋他路。 
2)本身不能解決,不要太拖沓,及時google,stackoverflow解決或者和架構師討論解決。

4.五、開發要同步

1)接口對接溝通要充分。 
接口提供方和接口使用方,要反覆多花時間溝通業務,要定義好數據接口。 
此時的耗時,過後你會發現是好事,溝通越充分要好。

2)接口對接要實時同步。 
一方修改了,要第一時間告訴對方。

5、項目管理小結

5.一、多方溝通要郵件

郵件是證據,避免沒必要要賴帳或扯皮。 
qq溝通和微信都不是好方式,最主要緣由是不利於查看聊天記錄、不利於快速檢索。

5.二、進度彙報要詳細

包含但不限於項目總體狀況、本週已完成、下週計劃、項目風險與應對。

5.三、任務分工要明確

團隊成員特色不一樣,切記口頭分工。團隊人少,我用excel作了詳細記錄。

5.四、每週例會要及時

周例會起到承上啓下的做用,有效協調控制項目進度、團隊成員工做飽和度。

6、後記

一、ES要學習的東西很是多。不糾結,多去官網、官方論壇、stackoverflow、Google檢索答案, 
相信我,你並不孤獨。 
二、ES還有很長的路要走,繼續精進閱讀與思考,繼續加油!

—————————————————————————————————— 
更多ES相關實戰乾貨經驗分享,請掃描下方【銘毅天下】微信公衆號二維碼關注。 
(每週至少更新一篇!)

這裏寫圖片描述 
和你一塊兒,死磕Elasticsearch! 
——————————————————————————————————

2017年09月03日 16:09 於家中牀前

做者:銘毅天下 
轉載請標明出處,原文地址: 
http://blog.csdn.net/laoyang360/article/details/77623013 若是感受本文對您有幫助,請點擊‘喜歡’支持一下,並分享出去,讓更多的人受益。您的支持是我堅持寫做最大的動力,謝謝!

相關文章
相關標籤/搜索