elasticsearch安裝配置及中文分詞

ElasticSearch是一個基於Lucene構建的開源,分佈式,RESTful搜索引擎。設計用於雲計算中,可以達到實時搜索,穩定,可靠,快速,安裝使用方便。支持經過HTTP使用JSON進行數據索引。 java

  咱們創建一個網站或應用程序,並要添加搜索功能,令咱們受打擊的是:搜索工做是很難的。咱們但願咱們的搜索解決方案要快,咱們但願有一個零配置和一個 徹底免費的搜索模式,咱們但願可以簡單地使用JSON經過HTTP的索引數據,咱們但願咱們的搜索服務器始終可用,咱們但願可以一臺開始並擴展到數百,我 們要實時搜索,咱們要簡單的多租戶,咱們但願創建一個雲的解決方案。Elasticsearch旨在解決全部這些問題和更多的。linux

安裝

  以windows操做系統和ES0.19.7版本爲例:git

 

  ①下載elasticsearch-0.19.7.zipgithub

 

  ②直接解壓至某目錄,設置該目錄爲ES_HOME環境變量數據庫

 

  ③安裝JDK,並設置JAVA_HOME環境變量json

 

  ④在windows下,運行 %ES_HOME%\bin\elasticsearch.bat便可運行windows

分佈式搜索elasticsearch單機與服務器環境搭建瀏覽器

      先到http://www.elasticsearch.org/download/下 載最新版的elasticsearch運行包,本文寫時最新的是0.19.1,做者是個很勤快的人,es的更新很頻繁,bug修復得很快。下載完解開有三 個包:bin是運行的腳本,config是設置文件,lib是放依賴的包。若是你要裝插件的話就要多新建一個plugins的文件夾,把插件放到這個文件 夾中。服務器

1.單機環境:app

單機版的elasticsearch運行很簡單,linux下直接 bin/elasticsearch就運行了,windows運行bin /elasticsearch.bat。若是是在局域網中運行elasticsearch集羣也是很簡單的,只要cluster.name設置一致,而且 機器在同一網段下,啓動的es會自動發現對方,組成集羣。

2.服務器環境:

若是是在服務器上就可使用elasticsearch-servicewrapper這個es插件,它支持經過參數,指定是在後臺或前臺運行es,而且支持啓動,中止,重啓es服務(默認es腳本只能經過ctrl+c關閉es)。使用方法是到https://github.com/elasticsearch/elasticsearch-servicewrapper下載service文件夾,放到es的bin目錄下。下面是命令集合:
bin/service/elasticsearch +
console 在前臺運行es
start 在後臺運行es
stop 中止es
install 使es做爲服務在服務器啓動時自動啓動
remove 取消啓動時自動啓動

在service目錄下有個elasticsearch.conf配置文件,主要是設置一些java運行環境參數,其中比較重要的是下面的

參數:

#es的home路徑,不用用默認值就能夠
set.default.ES_HOME=<Path to ElasticSearch Home>

#分配給es的最小內存
set.default.ES_MIN_MEM=256

#分配給es的最大內存
set.default.ES_MAX_MEM=1024


# 啓動等待超時時間(以秒爲單位)
wrapper.startup.timeout=300

# 關閉等待超時時間(以秒爲單位)

wrapper.shutdown.timeout=300

# ping超時時間(以秒爲單位)

wrapper.ping.timeout=300

安裝插件

  以head插件爲例:

 

  聯網時,直接運行%ES_HOME%\bin\plugin -install mobz/elasticsearch-head

 

  不聯網時,下載elasticsearch-head的zipball的master包,把內容解壓到%ES_HOME%\plugin\head\_site目錄下,[該插件爲site類型插件]

 

  安裝完成,重啓服務,在瀏覽器打開 http://localhost:9200/_plugin/head/ 便可

ES概念

  cluster

 

  表明一個集羣,集羣中有多個節點,其中有一個爲主節點,這個主節點是能夠經過選舉產生的,主從節點是對於集羣內部來講的。es的一個概念就是去中心 化,字面上理解就是無中心節點,這是對於集羣外部來講的,由於從外部來看es集羣,在邏輯上是個總體,你與任何一個節點的通訊和與整個es集羣通訊是等價 的。

 

  shards

 

  表明索引分片,es能夠把一個完整的索引分紅多個分片,這樣的好處是能夠把一個大的索引拆分紅多個,分佈到不一樣的節點上。構成分佈式搜索。分片的數量只能在索引建立前指定,而且索引建立後不能更改。

 

  replicas

 

  表明索引副本,es能夠設置多個索引的副本,副本的做用一是提升系統的容錯性,當個某個節點某個分片損壞或丟失時能夠從副本中恢復。二是提升es的查詢效率,es會自動對搜索請求進行負載均衡。

 

  recovery

 

  表明數據恢復或叫數據從新分佈,es在有節點加入或退出時會根據機器的負載對索引分片進行從新分配,掛掉的節點從新啓動時也會進行數據恢復。

 

  river

 

  表明es的一個數據源,也是其它存儲方式(如:數據庫)同步數據到es的一個方法。它是以插件方式存在的一個es服務,經過讀取river中的數據並 把它索引到es中,官方的river有couchDB的,RabbitMQ的,Twitter的,Wikipedia的。

 

  gateway

 

  表明es索引的持久化存儲方式,es默認是先把索引存放到內存中,當內存滿了時再持久化到硬盤。當這個es集羣關閉再從新啓動時就會從gateway 中讀取索引數據。es支持多種類型的gateway,有本地文件系統(默認),分佈式文件系統,Hadoop的HDFS和amazon的s3雲存儲服務。

 

  discovery.zen

 

  表明es的自動發現節點機制,es是一個基於p2p的系統,它先經過廣播尋找存在的節點,再經過多播協議來進行節點之間的通訊,同時也支持點對點的交互。

 

  Transport

 

  表明es內部節點或集羣與客戶端的交互方式,默認內部是使用tcp協議進行交互,同時它支持http協議(json格式)、thrift、servlet、memcached、zeroMQ等的傳輸協議(經過插件方式集成)。

分佈式搜索elasticsearch中文分詞集成

elasticsearch官方只提供smartcn這個中文分詞插件,效果不是很好,好在國內有medcl大神(國內最先研究es的人之一)寫的兩個中文分詞插件,一個是ik的,一個是mmseg的,下面分別介紹下二者的用法,其實都差很少的,先安裝插件,命令行:
安裝ik插件:

plugin -install medcl/elasticsearch-analysis-ik/1.1.0  

下載ik相關配置詞典文件到config目錄

  1. cd config  
  2. wget http://github.com/downloads/medcl/elasticsearch-analysis-ik/ik.zip --no-check-certificate  
  3. unzip ik.zip  
  4. rm ik.zip  

安裝mmseg插件:

  1. bin/plugin -install medcl/elasticsearch-analysis-mmseg/1.1.0  

下載相關配置詞典文件到config目錄

  1. cd config  
  2. wget http://github.com/downloads/medcl/elasticsearch-analysis-mmseg/mmseg.zip --no-check-certificate  
  3. unzip mmseg.zip  
  4. rm mmseg.zip  

分詞配置

ik分詞配置,在elasticsearch.yml文件中加上

  1. index:  
  2.   analysis:                     
  3.     analyzer:        
  4.       ik:  
  5.           alias: [ik_analyzer]  
  6.           type: org.elasticsearch.index.analysis.IkAnalyzerProvider  

  1. index.analysis.analyzer.ik.type : 「ik」  

這兩句的意義相同
mmseg分詞配置,也是在在elasticsearch.yml文件中

  1. index:  
  2.   analysis:  
  3.     analyzer:  
  4.       mmseg:  
  5.           alias: [news_analyzer, mmseg_analyzer]  
  6.           type: org.elasticsearch.index.analysis.MMsegAnalyzerProvider  

  1. index.analysis.analyzer.default.type : "mmseg"  

mmseg分詞還有些更加個性化的參數設置以下

  1. index:  
  2.   analysis:  
  3.     tokenizer:  
  4.       mmseg_maxword:  
  5.           type: mmseg  
  6.           seg_type: "max_word"  
  7.       mmseg_complex:  
  8.           type: mmseg  
  9.           seg_type: "complex"  
  10.       mmseg_simple:  
  11.           type: mmseg  
  12.           seg_type: "simple"  

這樣配置完後插件安裝完成,啓動es就會加載插件。

定義mapping

在添加索引的mapping時就能夠這樣定義分詞器

  1. {  
  2.    "page":{  
  3.       "properties":{  
  4.          "title":{  
  5.             "type":"string",  
  6.             "indexAnalyzer":"ik",  
  7.             "searchAnalyzer":"ik"  
  8.          },  
  9.          "content":{  
  10.             "type":"string",  
  11.             "indexAnalyzer":"ik",  
  12.             "searchAnalyzer":"ik"  
  13.          }  
  14.       }  
  15.    }  
  16. }  

indexAnalyzer爲索引時使用的分詞器,searchAnalyzer爲搜索時使用的分詞器。

java mapping代碼以下:

  1. XContentBuilder content = XContentFactory.jsonBuilder().startObject()  
  2.         .startObject("page")  
  3.           .startObject("properties")         
  4.             .startObject("title")  
  5.               .field("type", "string")             
  6.               .field("indexAnalyzer", "ik")  
  7.               .field("searchAnalyzer", "ik")  
  8.             .endObject()   
  9.             .startObject("code")  
  10.               .field("type", "string")           
  11.               .field("indexAnalyzer", "ik")  
  12.               .field("searchAnalyzer", "ik")  
  13.             .endObject()       
  14.           .endObject()  
  15.          .endObject()  
  16.        .endObject()  

定義完後操做索引就會以指定的分詞器來進行分詞。

 附:

ik分詞插件項目地址:https://github.com/medcl/elasticsearch-analysis-ik

mmseg分詞插件項目地址:https://github.com/medcl/elasticsearch-analysis-mmseg

若是以爲配置麻煩,也能夠下載個配置好的es版本,地址以下:https://github.com/medcl/elasticsearch-rtf

 

elasticsearch的基本用法

最大的特色:  1. 數據庫的 database, 就是  index  2. 數據庫的 table,  就是 tag  3. 不要使用browser, 使用curl來進行客戶端操做.  不然會出現 java heap ooxx...  curl:  -X 後面跟 RESTful :  GET, POST ...  -d 後面跟數據。 (d = data to send)  1. create:   指定 ID 來創建新記錄。 (貌似PUT, POST均可以)  $ curl -XPOST localhost:9200/films/md/2 -d '  { "name":"hei yi ren", "tag": "good"}'  使用自動生成的 ID 創建新紀錄:  $ curl -XPOST localhost:9200/films/md -d '  { "name":"ma da jia si jia3", "tag": "good"}'  2. 查詢:  2.1 查詢全部的 index, type:  $ curl localhost:9200/_search?pretty=true  2.2 查詢某個index下全部的type:  $ curl localhost:9200/films/_search  2.3 查詢某個index 下, 某個 type下全部的記錄:  $ curl localhost:9200/films/md/_search?pretty=true  2.4 帶有參數的查詢:   $ curl localhost:9200/films/md/_search?q=tag:good  {"took":7,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":2,"max_score":1.0,"hits":[{"_index":"film","_type":"md","_id":"2","_score":1.0, "_source" :  { "name":"hei yi ren", "tag": "good"}},{"_index":"film","_type":"md","_id":"1","_score":0.30685282, "_source" :  { "name":"ma da jia si jia", "tag": "good"}}]}}  2.5 使用JSON參數的查詢: (注意 query 和 term 關鍵字)  $ curl localhost:9200/film/_search -d '  {"query" : { "term": { "tag":"bad"}}}'  3. update   $ curl -XPUT localhost:9200/films/md/1 -d { ...(data)... }  4. 刪除。 刪除全部的:  $ curl -XDELETE localhost:9200/films 

相關文章
相關標籤/搜索