分布式搜索 Elasticsearch 簡介
Elasticsearch是一個基于lucene的、開源的、分布式的、RESTful的搜索引擎。Elasticsearch有如下特征:
1. 更快的執行搜索;
2. 安裝簡單;
3. 完全自由的搜索模式;
4. 可以簡單地通過HTTP使用JSON索引數據;
5. 分布式,可對搜索集群;
6. 能夠實時搜索;
7. 實現簡單地多租戶;
8. 等等。
很多時候我們使用Elasticsearch來代替lucene實現搜索,當然,代替的原因是因為其可實現搜索集群。
自由和面向文檔的模式
搜索引擎的數據模型屬于模式自由以及數據庫是面向文檔的,以目前#nosql的發展趨勢來看,使用這種數據模型來構建應用程序已經被證明是非常高效的。
elasticsearch 的模型基于 JSON, 事實上,在近些年,它儼然已經成為數據呈現的一個標準,此外,通過JSON,可以非常簡單的表示半結構化的數據,同樣的,大多數編程語言都會優先支持JSON數據的解析.
模式映射(Schema Mapping)
elasticsearch是無模式的,你隨便往里面扔一個JSON格式的文檔,然后ES就可以自動的進行索引。輸入的內容如果是數字或者是時間類型,ES也自動的檢測出來,并做相應的處理。
但是,眾所周知,搜索引擎是非常復雜的,索引文檔中的字段是可以設置BOOST值來影響打分的,另外還可以使用不同的分析器(Analyzer)用來控制怎么分詞,比如有些字段是需要進行分詞的,但是有些則不一定,如此等等。elasticsearch允許你完全控制這些規則,最終將一個JSON文檔映射到搜索引擎里面。并且可以按索引(Index)和按類型(Type)2種級別來進行設置.。
獲取數據(GETting Some Data)
每個索引的文檔都必須要有一個唯一標識(在類型級別),在很多時候這是非常有用的,比如你想更新或者刪除某一個索引文檔,或者只是想拿一條索引數據看看。獲取數據真是簡單的不能再簡單了,你只需用告訴es指定文檔的索引、類型、和id就可以拿回實際的索引文檔了(就是你建索引的時候的JSON文檔)。
搜索(Search)
處理查詢只需要一個簡單的請求,里面隱藏了很多復雜的es提供的基于分布式的操作。可以簡單的使用 Lucene通用的語法,或者使用基于JSON格式QueryDSL(DSL:領域特定語言)來構造搜索各種請求(更加靈活,方便構造復雜查詢)。
搜索可不僅僅就是查詢就結束了,方面/層面(facets),高亮,自定義腳本等等都是支持的。
多租戶(Multi Tenancy)
單個索引既然已經有了,那為什么還會需要不止一個索引呢,其實,有很多原因需要支持多索引,比如,對日志索引可以按周來分別存放,或者是對不同的索引進行不同的設置(比如,一個使用內存作為存儲,一個使用文件系統來存儲)。
當有了多個索引之后,我們就想要能夠跨索引來進行搜索(或者其他操作)。
設置(Settings)
能夠進行配置本身就是一把雙刃劍,我們想要的是能夠打開就能盡快運行,中間無需任何配置,并且當有需要的時候能夠控制應用程序的幾乎所有方面。
elasticsearch 從構建之初就這種理念,所以幾乎所有事情都是可配和可插拔的,此外,每個索引(index)都有其獨立的配置,用來覆蓋主配置(master settings)。舉例來說,一個索引可以配置為使用內存存儲,10個分片和1個副本,而另外一個索引可以是使用文件系統存儲,1個分片和10個副本。所有的索引級別(index)的設置都是可以在創建索引的時候通過YAML或者JSON格式來進行指定的。
分布式(Distributed)
elasticsearch的一個最主要的功能就是對分布式的支持,索引能夠分拆為多個分片,每個分片可以有0個或者多個副本,集群中的每個數據節點,都可以承載一個或者多個分片,并且充當協調和處理各種操作分發到合適的分片上去。再平衡(Rebalancing)和路由(routing)這一切都是自動進行的。
時間之門(Gateway)
也許有一天,整個集群會崩潰(誰也無法保證因為什么原因),或者是因為特殊需要而進行關停,大多數情況,我們是需要讓集群恢復到最后的一個狀態的,并且讓服務重新run起來 ,elasticsearch提供了一個叫做gateway的模塊,允許你來做這件事情,你可以想想時間機器和搜索的結合。
集群的狀態信息(包括事務日志)可以通過每個本地存儲(默認模式)來重建,或共享存儲(如NFS或者Amazon S3),當使用共享存儲,集群狀態信息會異步的復制過去。
此外,當使用共享存儲來做持久化,索引信息可以完全的存放在內存里面,就算做整個集群的關閉再恢復也不會有問題。
集群(cluster)
集群中有多個節點,其中有一個為主節點,這個主節點是可以通過選舉產生的,主從節點是對于集群內部來說的。es的一個概念就是去中心化,字面上理解就是無中心節點,這是對于集群外部來說的,因為從外部來看es集群,在邏輯上是個整體,你與任何一個節點的通信和與整個es集群通信是等價的。
索引分片(shards)
es可以把一個完整的索引分成多個分片,這樣的好處是可以把一個大的索引拆分成多個,分布到不同的節點上。構成分布式搜索。分片的數量只能在索引創建前指定,并且索引創建后不能更改。
索引副本(replicas)
es可以設置多個索引的副本,副本的作用一是提高系統的容錯性,當個某個節點某個分片損壞或丟失時可以從副本中恢復。二是提高es的查詢效率,es會自動對搜索請求進行負載均衡。
數據重新分布(recovery)
es在有節點加入或退出時會根據機器的負載對索引分片進行重新分配,掛掉的節點重新啟動時也會進行數據恢復。
數據源(river)
也是其它存儲方式(如:數據庫)同步數據到es的一個方法。它是以插件方式存在的一個es服務,通過讀取river中的數據并把它索引到es中,官方的river有couchDB的,RabbitMQ的,推ter的,Wikipedia的。
Transport
代表es內部節點或集群與客戶端的交互方式,默認內部是使用tcp協議進行交互,同時它支持http協議(json格式)、thrift、servlet、memcached、zeroMQ等的傳輸協議(通過插件方式集成)。