ElasticSearch是一個強大的搜索服務器,基於Apache Lucene
的全文搜索引擎開發,具備高性能、分佈式和零配置的優勢。在當前的項目中,咱們但願ES能承擔億級文檔的搜索,而ES也證實了即使面對這樣的數據規模,也能實現十分迅速的搜索響應。html
Mapping
定義不一樣的屬性(好比能否被搜索)以
ElasticSearch 1.5.0
版本爲例node
ES的使用很簡單,從官網下載壓縮包後,解壓後輸入以下指令:python
./bin/elasticsearch -d --cluster.name [your_cluster_name] --node.name [your_node_name]
一旦在多臺主機上啓動擁有同一個cluster.name
的ES實例,它們會自動組成一個集羣。git
elasticsearch-head是一個必裝的插件,它提供了一個web界面,顯示集羣和索引的狀態,同時具有瀏覽和搜索文檔的功能。只須要經過ES的plugin
指令安裝就OK了:github
./bin/plugin -install mobz/elasticsearch-head
一般線上系統都不會使用ES做爲主存儲,從主存儲建立索引的效率是咱們關心的。ES的bulk API能支持批量操做,大大提高了建立索引的效率。如下是使用pyelasticsearch
(非官方的一個Python客戶端)批量建立索引的範例:web
pythonfrom pyelasticsearch import ElasticSearch from pyelasticsearch import bulk_chunks es = ElasticSearch() def documents(): for _doc in docs: yield es.index_op(doc=_doc, id=doc['id']) for chunk in bulk_chunks(documents(), docs_per_chunk=500, bytes_per_chunk=10000): es.bulk(chunk, index='index-test', doc_type='doc')
單機索引200萬條記錄的耗時約10分鐘。數據庫
ES支持中文的前提是安裝正確的分詞組件,好比elasticsearch-analysis-ik。但貌似該組件的最新版本(1.2.9)不支持plugin
指令直接安裝,只能經過Maven
從新編譯了:bootstrap
git clone https://github.com/medcl/elasticsearch-analysis-ik.git --depth 1 cd elasticsearch-analysis-ik/ # 真心但願你的網絡棒棒嗒 mvn package unzip ./target/releases/elasticsearch-analysis-ik-1.2.9.zip
zip解壓獲得5個jar包:緩存
返回ES目錄,新建路徑./plugins/analysis-ik
並把上述jar包所有移進去。
第二步,把elasticsearch-analysis-ik/config/ik
文件夾(IK
自帶的詞典)複製到ES目錄的./config
路徑下。
第三步,在./config/elasticsearch.yml
文件的最後加上:服務器
index: analysis: analyzer: ik: alias: [news_analyzer_ik,ik_analyzer] type: org.elasticsearch.index.analysis.IkAnalyzerProvider index.analysis.analyzer.default.type : "ik"
至此大功告成。注意配置分詞組件必須在建立索引以前,不然是無效的。
ES的調優分兩個層面,一是Java層面的調優,包括加大JVM的可用內存及單線程內存。
對Unix系統,可修改./bin/elasticsearch.in.sh
文件:
# 通常分配主機1/4-1/2的內存 if [ "x$ES_MIN_MEM" = "x" ]; then ES_MIN_MEM=12g fi if [ "x$ES_MAX_MEM" = "x" ]; then ES_MAX_MEM=12g fi JAVA_OPTS="$JAVA_OPTS -Xms${ES_MIN_MEM}" JAVA_OPTS="$JAVA_OPTS -Xmx${ES_MAX_MEM}" # 線程大小, ES單線程承載的數據量比較大 JAVA_OPTS="$JAVA_OPTS -Xss128m"
調優的第二個層面是ES自己的調優,修改./config/elasticsearch.yml
文件,關鍵的項目以下所示:
# 分片數量,推薦分片數*副本數=集羣數量 # 分片會帶來額外的分割和合並的損耗,理論上分片數越少,搜索的效率越高 index.number_of_shards: 20 # 鎖定內存,不讓JVM寫入swapping,避免下降ES的性能 bootstrap.mlockall: true # 緩存類型設置爲Soft Reference,只有當內存不夠時纔會進行回收 index.cache.field.max_size: 50000 index.cache.field.expire: 10m index.cache.field.type: soft
來自:建造者說