標籤:Lucene style blog http ar io color os 使用
http://fuxiaopang.gitbooks.io/learnelasticsearch/content/ (中文)
在Elasticsearch中,文檔術語一種類型(type),各種各樣的類型存在於一個索引中。你也可以通過類比傳統的關聯式資料庫得到一些大致的相似之處:
關聯式資料庫 ⇒ 資料庫 ⇒ 表 ⇒ 行 ⇒ 列(Columns)Elasticsearch ⇒ 索引 ⇒ 類型 ⇒ 文檔 ⇒ 欄位(Fields)
一個Elasticsearch叢集可以包含多個索引(資料庫),也就是說其中包含了很多類型(表)。這些類型中包含了很多的文檔(行),然後每個文檔中又包含了很多的欄位(列)
Elasticsearch是一個分布式可擴充的即時搜尋和分析引擎。它能協助你搜尋、分析和瀏覽資料,而往往大家並沒有在某個項目一開始就預料到需要這些功能。Elasticsearch之所以出現就是為了重新賦予硬碟中看似無用的未經處理資料新的活力。
無論你是需要全文檢索搜尋、結構化資料的即時統計,還是兩者的結合,這本指南都會協助你瞭解其中最基本的概念,從最基本的操作開始學習Elasticsearch。之後,我們還會逐漸開始探索更加複雜的搜尋技術,你可以根據自身的學習的步伐。
Elasticsearch並不是單純的全文檢索搜尋這麼簡單。我們將向你介紹講解結構化搜尋、統計、查詢過濾、地理定位、自動完成以及你是不是要尋找的提示。我們還將探討如何給資料建模能提升Elasticsearch的效能,以及在生產環境中如何配置、監視你的叢集。
Elasticsearch是一個基於Lucene構建的開源,分布式,RESTful搜尋引擎。設計用於雲端運算中,能夠達到即時搜尋,穩定,可靠,快速,安裝使用方便。支援通過HTTP使用JSON進行資料索引。
我們建立一個網站或應用程式,並要添加搜尋功能,令我們受打擊的是:搜尋工作是很難的。我們希望我們的搜尋解決方案要快,我們希望 有一個零配置和一個完全免費的搜尋模式,我們希望能夠簡單地使用JSON通過HTTP的索引資料,我們希望我們的搜尋伺服器始終可用,我們希望能夠一台開 始並擴充到數百,我們要即時搜尋,我們要簡單的多租戶,我們希望建立一個雲的解決方案。Elasticsearch旨在解決所有這些問題和更多的。
安裝
以windows作業系統和ES0.19.7版本為例:
①下載elasticsearch-0.19.7.zip
②直接解壓至某目錄,設定該目錄為ES_HOME環境變數
③安裝JDK,並設定JAVA_HOME環境變數
④在windows下,運行 %ES_HOME%\bin\elasticsearch.bat即可運行
分布式搜尋elasticsearch單機與伺服器環境搭建
先到http://www.elasticsearch.org/download/下 載最新版的elasticsearch運行包,本文寫時最新的是0.19.1,作者是個很勤快的人,es的更新很頻繁,bug修複得很快。下載完解開有三 個包:bin是啟動並執行指令碼,config是設定檔案,lib是放依賴的包。如果你要裝外掛程式的話就要多建立一個plugins的檔案夾,把外掛程式放到這個檔案 夾中。
1.單機環境:
單機版的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,有本地檔案系統(預設),Distributed File System,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目錄
- cd config
- wget http://github.com/downloads/medcl/elasticsearch-analysis-ik/ik.zip --no-check-certificate
- unzip ik.zip
- rm ik.zip
安裝mmseg外掛程式:
- bin/plugin -install medcl/elasticsearch-analysis-mmseg/1.1.0
下載相關配置詞典檔案到config目錄
- cd config
- wget http://github.com/downloads/medcl/elasticsearch-analysis-mmseg/mmseg.zip --no-check-certificate
- unzip mmseg.zip
- rm mmseg.zip
分詞配置
ik分詞配置,在elasticsearch.yml檔案中加上
- index:
- analysis:
- analyzer:
- ik:
- alias: [ik_analyzer]
- type: org.elasticsearch.index.analysis.IkAnalyzerProvider
或
- index.analysis.analyzer.ik.type : “ik”
這兩句的意義相同
mmseg分詞配置,也是在在elasticsearch.yml檔案中
- index:
- analysis:
- analyzer:
- mmseg:
- alias: [news_analyzer, mmseg_analyzer]
- type: org.elasticsearch.index.analysis.MMsegAnalyzerProvider
或
- index.analysis.analyzer.default.type : "mmseg"
mmseg分詞還有些更加個人化的參數設定如下
- index:
- analysis:
- tokenizer:
- mmseg_maxword:
- type: mmseg
- seg_type: "max_word"
- mmseg_complex:
- type: mmseg
- seg_type: "complex"
- mmseg_simple:
- type: mmseg
- seg_type: "simple"
這樣配置完後外掛程式安裝完成,啟動es就會載入外掛程式。
定義mapping
在添加索引的mapping時就可以這樣定義分詞器
- {
- "page":{
- "properties":{
- "title":{
- "type":"string",
- "indexAnalyzer":"ik",
- "searchAnalyzer":"ik"
- },
- "content":{
- "type":"string",
- "indexAnalyzer":"ik",
- "searchAnalyzer":"ik"
- }
- }
- }
- }
indexAnalyzer為索引時使用的分詞器,searchAnalyzer為搜尋時使用的分詞器。
java mapping代碼如下:
- XContentBuilder content = XContentFactory.jsonBuilder().startObject()
- .startObject("page")
- .startObject("properties")
- .startObject("title")
- .field("type", "string")
- .field("indexAnalyzer", "ik")
- .field("searchAnalyzer", "ik")
- .endObject()
- .startObject("code")
- .field("type", "string")
- .field("indexAnalyzer", "ik")
- .field("searchAnalyzer", "ik")
- .endObject()
- .endObject()
- .endObject()
- .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
Elasticsearch是一個分布式可擴充的即時搜尋和分析引擎,elasticsearch安裝配置及中文分詞