實時搜索引擎Elasticsearch入門

Elasticsearch簡介

Elasticsearch(簡稱ES)是一個基于Apache Lucene(TM)的開源搜索引擎套像,無論在開源還是專有領域酿联,Lucene可以被認為是迄今為止最先進、性能最好的夺巩、功能最全的搜索引擎庫贞让。
但是,Lucene只是一個庫柳譬。想要發(fā)揮其強大的作用喳张,你需使用Java并要將其集成到你的應用中。Lucene非常復雜美澳,你需要深入的了解檢索相關知識來理解它是如何工作的销部。
Elasticsearch也是使用Java編寫并使用Lucene來建立索引并實現(xiàn)搜索功能摸航,但是它的目的是通過簡單連貫的RESTful API讓全文搜索變得簡單并隱藏Lucene的復雜性。
不過舅桩,Elasticsearch不僅僅是Lucene和全文搜索引擎酱虎,它還提供:

分布式的實時文件存儲,每個字段都被索引并可被搜索
實時分析的分布式搜索引擎
可以擴展到上百臺服務器擂涛,處理PB級結構化或非結構化數(shù)據(jù)
而且读串,所有的這些功能被集成到一臺服務器,你的應用可以通過簡單的RESTful API歼指、各種語言的客戶端甚至命令行與之交互爹土。上手Elasticsearch非常簡單甥雕,它提供了許多合理的缺省值踩身,并對初學者隱藏了復雜的搜索引擎理論。它開箱即用(安裝即可使用)社露,只需很少的學習既可在生產(chǎn)環(huán)境中使用挟阻。Elasticsearch在Apache 2 license下許可使用,可以免費下載峭弟、使用和修改附鸽。
隨著知識的積累,你可以根據(jù)不同的問題領域定制Elasticsearch的高級特性瞒瘸,這一切都是可配置的坷备,并且配置非常靈活。

Elasticsearch中涉及到的重要概念

Elasticsearch有幾個核心概念情臭。從一開始理解這些概念會對整個學習過程有莫大的幫助省撑。

(1) 接近實時(NRT)
Elasticsearch是一個接近實時的搜索平臺。這意味著俯在,從索引一個文檔直到這個文檔能夠被搜索到有一個輕微的延遲(通常是1秒)竟秫。

(2) 集群(cluster)
一個集群就是由一個或多個節(jié)點組織在一起,它們共同持有你整個的數(shù)據(jù)跷乐,并一起提供索引和搜索功能肥败。一個集群由一個唯一的名字標識,這個名字默認就是“elasticsearch”愕提。這個名字是重要的馒稍,因為一個節(jié)點只能通過指定某個集群的名字,來加入這個集群浅侨。在產(chǎn)品環(huán)境中顯式地設定這個名字是一個好習慣纽谒,但是使用默認值來進行測試/開發(fā)也是不錯的。

(3) 節(jié)點(node)
一個節(jié)點是你集群中的一個服務器仗颈,作為集群的一部分佛舱,它存儲你的數(shù)據(jù)椎例,參與集群的索引和搜索功能。和集群類似请祖,一個節(jié)點也是由一個名字來標識的订歪,默認情況下,這個名字是一個隨機的漫威漫畫角色的名字肆捕,這個名字會在啟動的時候賦予節(jié)點刷晋。這個名字對于管理工作來說挺重要的,因為在這個管理過程中慎陵,你會去確定網(wǎng)絡中的哪些服務器對應于Elasticsearch集群中的哪些節(jié)點眼虱。

一個節(jié)點可以通過配置集群名稱的方式來加入一個指定的集群。默認情況下席纽,每個節(jié)點都會被安排加入到一個叫做“elasticsearch”的集群中捏悬,這意味著,如果你在你的網(wǎng)絡中啟動了若干個節(jié)點润梯,并假定它們能夠相互發(fā)現(xiàn)彼此过牙,它們將會自動地形成并加入到一個叫做“elasticsearch”的集群中。

在一個集群里纺铭,只要你想寇钉,可以擁有任意多個節(jié)點。而且舶赔,如果當前你的網(wǎng)絡中沒有運行任何Elasticsearch節(jié)點扫倡,這時啟動一個節(jié)點,會默認創(chuàng)建并加入一個叫做“elasticsearch”的集群竟纳。

(4) 索引(index)
一個索引就是一個擁有幾分相似特征的文檔的集合撵溃。比如說,你可以有一個客戶數(shù)據(jù)的索引蚁袭,另一個產(chǎn)品目錄的索引征懈,還有一個訂單數(shù)據(jù)的索引。一個索引由一個名字來標識(必須全部是小寫字母的)揩悄,并且當我們要對對應于這個索引中的文檔進行索引卖哎、搜索、更新和刪除的時候删性,都要使用到這個名字亏娜。索引類似于關系型數(shù)據(jù)庫中Database的概念。在一個集群中蹬挺,如果你想维贺,可以定義任意多的索引。

(5) 類型(type)
在一個索引中巴帮,你可以定義一種或多種類型溯泣。一個類型是你的索引的一個邏輯上的分類/分區(qū)虐秋,其語義完全由你來定。通常垃沦,會為具有一組共同字段的文檔定義一個類型客给。比如說,我們假設你運營一個博客平臺并且將你所有的數(shù)據(jù)存儲到一個索引中肢簿。在這個索引中靶剑,你可以為用戶數(shù)據(jù)定義一個類型,為博客數(shù)據(jù)定義另一個類型池充,當然桩引,也可以為評論數(shù)據(jù)定義另一個類型。類型類似于關系型數(shù)據(jù)庫中Table的概念收夸。

(6)文檔(document)
一個文檔是一個可被索引的基礎信息單元坑匠。比如,你可以擁有某一個客戶的文檔咱圆,某一個產(chǎn)品的一個文檔笛辟,當然功氨,也可以擁有某個訂單的一個文檔序苏。文檔以JSON(Javascript Object Notation)格式來表示,而JSON是一個到處存在的互聯(lián)網(wǎng)數(shù)據(jù)交互格式捷凄。
在一個index/type里面忱详,只要你想,你可以存儲任意多的文檔跺涤。注意匈睁,盡管一個文檔,物理上存在于一個索引之中桶错,文檔必須被索引/賦予一個索引的type航唆。文檔類似于關系型數(shù)據(jù)庫中Record的概念。實際上一個文檔除了用戶定義的數(shù)據(jù)外院刁,還包括_index糯钙、_type和_id字段。

(7) 分片和復制(shards & replicas)
一個索引可以存儲超出單個結點硬件限制的大量數(shù)據(jù)退腥。比如任岸,一個具有10億文檔的索引占據(jù)1TB的磁盤空間,而任一節(jié)點都沒有這樣大的磁盤空間狡刘;或者單個節(jié)點處理搜索請求享潜,響應太慢。

為了解決這個問題嗅蔬,Elasticsearch提供了將索引劃分成多份的能力剑按,這些份就叫做分片疾就。當你創(chuàng)建一個索引的時候,你可以指定你想要的分片的數(shù)量艺蝴。每個分片本身也是一個功能完善并且獨立的“索引”虐译,這個“索引”可以被放置到集群中的任何節(jié)點上。
分片之所以重要吴趴,主要有兩方面的原因:

允許你水平分割/擴展你的內(nèi)容容量
允許你在分片(潛在地漆诽,位于多個節(jié)點上)之上進行分布式的、并行的操作锣枝,進而提高性能/吞吐量
至于一個分片怎樣分布厢拭,它的文檔怎樣聚合回搜索請求,是完全由Elasticsearch管理的撇叁,對于作為用戶的你來說供鸠,這些都是透明的。

在一個網(wǎng)絡/云的環(huán)境里陨闹,失敗隨時都可能發(fā)生楞捂,在某個分片/節(jié)點不知怎么的就處于離線狀態(tài),或者由于任何原因消失了趋厉。這種情況下寨闹,有一個故障轉移機制是非常有用并且是強烈推薦的。為此目的君账,Elasticsearch允許你創(chuàng)建分片的一份或多份拷貝繁堡,這些拷貝叫做復制分片,或者直接叫復制乡数。復制之所以重要椭蹄,主要有兩方面的原因:

在分片/節(jié)點失敗的情況下,提供了高可用性净赴。因為這個原因绳矩,注意到復制分片從不與原/主要(original/primary)分片置于同一節(jié)點上是非常重要的。
擴展你的搜索量/吞吐量玖翅,因為搜索可以在所有的復制上并行運行
總之翼馆,每個索引可以被分成多個分片。一個索引也可以被復制0次(意思是沒有復制)或多次烧栋。一旦復制了写妥,每個索引就有了主分片(作為復制源的原來的分片)和復制分片(主分片的拷貝)之別。分片和復制的數(shù)量可以在索引創(chuàng)建的時候指定审姓。在索引創(chuàng)建之后街氢,你可以在任何時候動態(tài)地改變復制數(shù)量栋豫,但是不能改變分片的數(shù)量。

默認情況下燕雁,Elasticsearch中的每個索引被分片5個主分片和1個復制,這意味著,如果你的集群中至少有兩個節(jié)點,你的索引將會有5個主分片和另外5個復制分片(1個完全拷貝),這樣的話每個索引總共就有10個分片奥溺。一個索引的多個分片可以存放在集群中的一臺主機上,也可以存放在多臺主機上骨宠,這取決于你的集群機器數(shù)量浮定。主分片和復制分片的具體位置是由ES內(nèi)在的策略所決定的。

Elasticsearch安裝與配置

安裝與運行

(1) 從這里下載Elasticsearch安裝包层亿。一共提供4種格式的安裝包(ZIP桦卒、TAR.GZ、DEB和RPM)匿又,可以根據(jù)自己所使用的系統(tǒng)平臺選擇相應格式的安裝包進行下載方灾。(建議使用Linux系統(tǒng),本人在2臺windows機器上嘗試啟動過碌更,一臺機器上無法正常啟動裕偿,另外一臺可以)

(2) 對下載的安裝包進行解壓縮即可完成安裝操作。下面以在Ubuntu操作系統(tǒng)下使用TAR.GZ格式的1.5.0版本的安裝包為例進行安裝痛单。在Linux shell中輸入下面的命令解壓縮嘿棘。

tar –vxf elasticsearch-1.5.0.tar.gz

安裝成功,下面運行ES桦他。

   注意:Elasticsearch需要Java虛擬機的支持蔫巩,在運行之前保證機器上安裝了JDK,并且JDK版本不能低于1.7_55快压。

(3) 現(xiàn)在可以直接使用默認配置啟動Elasticsearch了。
假設安裝包解壓后的目錄路徑為【/home/elasticsearch/elasticsearch-1.5.0】垃瞧,下面軍用$ES_HOME來表示這個路徑蔫劣。執(zhí)行下面的命令:

 cd /home/elasticsearch/elasticsearch-1.5.0/bin/
 chmod +x * 
 ./elasticsearch

如果出現(xiàn)如圖所示的界面(最后打印出started),則說明Elasticsearch啟動成功个从。


啟動成功界面

下面來驗證一下是否真的啟動成功脉幢。打開瀏覽器,訪問網(wǎng)址 http://host:9200(這里的host是ES的安裝主機地址嗦锐,如果安裝在本機嫌松,就是http://127.0.0.1:9200)。如果顯示下面的信息奕污,則表示ES安裝成功萎羔。

{
  "status" : 200,
  "name" : "Captain Zero",
  "cluster_name" : "elasticsearch",
  "version" : {
    "number" : "1.5.0",
    "build_hash" : "544816042d40151d3ce4ba4f95399d7860dc2e92",
    "build_timestamp" : "2015-03-23T14:30:58Z",
    "build_snapshot" : false,
    "lucene_version" : "4.10.4"
  },
  "tagline" : "You Know, for Search"
}

上面是前臺啟動方式,一旦關閉Linux shell碳默,ES服務就會停止贾陷。所以是實際使用過程中缘眶,絕對不會使用這種方式去啟動ES。除了上面的啟動方式外髓废,還可以加上一定的啟動參數(shù)巷懈。例如:

 ./elasticsearch –d #在后臺運行Elasticsearch
 ./elasticsearch -d -Xmx2g -Xms2g #后臺啟動,啟動時指定內(nèi)存大谢藕椤(2G)
 ./elasticsearch -d -Des.logger.level=DEBUG  #可以在日志中打印出更加詳細的信息顶燕。

ES的配置

配置文件所在的目錄路徑如下:$ES_HOME/config/elasticsearch.yml。
下面介紹一些重要的配置項及其含義冈爹。

(1)cluster.name: elasticsearch

配置elasticsearch的集群名稱割岛,默認是elasticsearch。elasticsearch會自動發(fā)現(xiàn)在同一網(wǎng)段下的集群名為elasticsearch的主機犯助,如果在同一網(wǎng)段下有多個集群癣漆,就可以用這個屬性來區(qū)分不同的集群。生成環(huán)境時建議更改剂买。

(2)node.name: “Franz Kafka”

節(jié)點名惠爽,默認隨機指定一個name列表中名字,該列表在elasticsearch的jar包中config文件夾里name.txt文件中瞬哼,其中有很多作者添加的有趣名字婚肆,大部分是漫威動漫里面的人物名字。生成環(huán)境中建議更改以能方便的指定集群中的節(jié)點對應的機器

(3)node.master: true

指定該節(jié)點是否有資格被選舉成為node坐慰,默認是true较性,elasticsearch默認集群中的第一臺啟動的機器為master,如果這臺機掛了就會重新選舉master结胀。

(4)node.data: true

指定該節(jié)點是否存儲索引數(shù)據(jù)赞咙,默認為true。如果節(jié)點配置node.master:false并且node.data: false糟港,則該節(jié)點將起到負載均衡的作用

(5)index.number_of_shards: 5

設置默認索引分片個數(shù)攀操,默認為5片。經(jīng)本人測試秸抚,索引分片對ES的查詢性能有很大的影響速和,在應用環(huán)境,應該選擇適合的分片大小剥汤。

(6)index.number_of_replicas:

設置默認索引副本個數(shù)颠放,默認為1個副本。此處的1個副本是指index.number_of_shards的一個完全拷貝吭敢;默認5個分片1個拷貝碰凶;即總分片數(shù)為10。

(7)path.conf: /path/to/conf

設置配置文件的存儲路徑,默認是es根目錄下的config文件夾痒留。

(8)path.data:/path/to/data1,/path/to/data2

設置索引數(shù)據(jù)的存儲路徑谴麦,默認是es根目錄下的data文件夾,可以設置多個存儲路徑伸头,用逗號隔開匾效。

(9)path.work:/path/to/work

設置臨時文件的存儲路徑,默認是es根目錄下的work文件夾恤磷。

(10)path.logs: /path/to/logs

設置日志文件的存儲路徑面哼,默認是es根目錄下的logs文件夾

(11)path.plugins: /path/to/plugins

設置插件的存放路徑,默認是es根目錄下的plugins文件夾

(12)bootstrap.mlockall: true

設置為true來鎖住內(nèi)存扫步。因為當jvm開始swapping時es的效率會降低魔策,所以要保證它不swap,可以把ES_MIN_MEM和ES_MAX_MEM兩個環(huán)境變量設置成同一個值河胎,并且保證機器有足夠的內(nèi)存分配給es闯袒。同時也要允許elasticsearch的進程可以鎖住內(nèi)存,linux下可以通過ulimit -l unlimited命令游岳。

(13)network.bind_host: 192.168.0.1

設置綁定的ip地址政敢,可以是ipv4或ipv6的,默認為0.0.0.0胚迫。

(14)network.publish_host: 192.168.0.1

設置其它節(jié)點和該節(jié)點交互的ip地址喷户,如果不設置它會自動判斷,值必須是個真實的ip地址访锻。

(15)network.host: 192.168.0.1

這個參數(shù)是用來同時設置bind_host和publish_host上面兩個參數(shù)褪尝。

(16)transport.tcp.port: 9300

設置節(jié)點間交互的tcp端口,默認是9300期犬。

(17)transport.tcp.compress: true

設置是否壓縮tcp傳輸時的數(shù)據(jù)河哑,默認為false,不壓縮哭懈。

(18)http.port: 9200

設置對外服務的http端口灾馒,默認為9200。

(19)http.max_content_length: 100mb

設置內(nèi)容的最大容量遣总,默認100mb

(20)http.enabled: false

是否使用http協(xié)議對外提供服務,默認為true轨功,開啟旭斥。

(21)gateway.type: local

gateway的類型,默認為local即為本地文件系統(tǒng)古涧,可以設置為本地文件系統(tǒng)垂券,分布式文件系統(tǒng),hadoop的HDFS菇爪,和amazon的s3服務器算芯,其它文件系統(tǒng)的設置。

(22)gateway.recover_after_nodes: 1

設置集群中N個節(jié)點啟動時進行數(shù)據(jù)恢復凳宙,默認為1熙揍。

(23)gateway.recover_after_time: 5m

設置初始化數(shù)據(jù)恢復進程的超時時間,默認是5分鐘氏涩。

(24)gateway.expected_nodes: 2

設置這個集群中節(jié)點的數(shù)量届囚,默認為2,一旦這N個節(jié)點啟動是尖,就會立即進行數(shù)據(jù)恢復意系。

(25)cluster.routing.allocation.node_initial_primaries_recoveries: 4

初始化數(shù)據(jù)恢復時,并發(fā)恢復線程的個數(shù)饺汹,默認為4蛔添。

(26)cluster.routing.allocation.node_concurrent_recoveries: 2

添加刪除節(jié)點或負載均衡時并發(fā)恢復線程的個數(shù),默認為4兜辞。

(27)indices.recovery.max_size_per_sec: 0

設置數(shù)據(jù)恢復時限制的帶寬迎瞧,如入100mb,默認為0弦疮,即無限制夹攒。

(28)indices.recovery.concurrent_streams: 5

設置這個參數(shù)來限制從其它分片恢復數(shù)據(jù)時最大同時打開并發(fā)流的個數(shù),默認為5胁塞。

(29)discovery.zen.minimum_master_nodes: 1

設置這個參數(shù)來保證集群中的節(jié)點可以知道其它N個有master資格的節(jié)點咏尝。默認為1,對于大的集群來說啸罢,可以設置大一點的值(2-4)

(30)discovery.zen.ping.timeout: 3s

設置集群中自動發(fā)現(xiàn)其它節(jié)點時ping連接超時時間编检,默認為3秒,對于比較差的網(wǎng)絡環(huán)境可以高點的值來防止自動發(fā)現(xiàn)時出錯扰才。

(31)discovery.zen.ping.multicast.enabled: false

設置是否打開多播發(fā)現(xiàn)節(jié)點允懂,默認是true。

(32)discovery.zen.ping.unicast.hosts: [“host1”, “host2:port”, “host3 [portX-portY] “]

設置集群中master節(jié)點的初始列表衩匣,可以通過這些節(jié)點來自動發(fā)現(xiàn)新加入集群的節(jié)點蕾总。

除了上面的在安裝時配置文件中就自帶的配置項外,本人在實際使用過程還使用到了下面的配置:

threadpool:
    search:
        type: fixed
        min: 60
        max: 80
        queue_size: 1000
// 配置es服務器的執(zhí)行查詢操作時所用線程池琅捏,fix固定線程數(shù)的線程池生百。
index :
    store:
        type: memory
// 表示索引存儲在內(nèi)存中,當然es不太建議這么做柄延。經(jīng)本人測試蚀浆,做查詢時,使用內(nèi)存索引并不會比正常的索引快。
index.mapper.dynamic: false
// 禁止自動創(chuàng)建mapping市俊。默認情況下杨凑,es可以根據(jù)數(shù)據(jù)類型自動創(chuàng)建mapping。配置成這樣摆昧,可以禁止自動創(chuàng)建mapping的行為撩满。至于什么是mapping,在之后的博文中再介紹据忘。
index.query.parse.allow_unmapped_fields: false 
// 不能查找沒有在mapping中定義的屬性

以上總結介紹了Elasticsearch中的一些基礎知識鹦牛,包括其中的一些核心概念。只有理解了ES中的這些核心概念勇吊,才能對更加得心應手地使用ES曼追,發(fā)揮其強大的搜索能力。同時汉规,也介紹了ES的安裝和運行礼殊,ES的安裝和運行是很簡單的,只需要極少的簡單步驟针史,就可以開始體驗ES晶伦。ES的配置非常豐富,安裝時自帶的配置文件只包含一部分比較核心的配置項啄枕,更多的配置內(nèi)容需要自己去閱讀ES的源碼時才能被發(fā)現(xiàn)婚陪。

ES Restful API基本使用:

ES為開發(fā)者提供了非常豐富的基于HTTP協(xié)議的Rest API,只需要向ES服務端發(fā)送簡單的Rest請求频祝,就可以實現(xiàn)非常強大的功能泌参。本篇文章主要介紹ES中常用操作的Rest API的使用,同時會講解ES的源代碼工程中的API接口文檔常空,通過了解這個API文檔的接口描述結構沽一,就基本上可以實現(xiàn)ES中的絕大部分功能。

注意:查詢是ES的核心漓糙。作為一個先進的搜索引擎铣缠,ES中提供了多種查詢接口。本篇僅僅會涉及查詢API的結構昆禽,而具體如何使用ES所提供的各種查詢API蝗蛙,會在接下來的博文中做詳細介紹。

基礎知識

如果之前沒有用過類似于ES這樣的索引數(shù)據(jù)庫(暫且將ES歸為數(shù)據(jù)庫類醉鳖,與傳統(tǒng)的數(shù)據(jù)庫有較大的區(qū)別)歼郭,要理解本篇博文介紹的API是有些難度的。本節(jié)先介紹一些基礎知識辐棒,對理解全文有很幫助。

Rest介紹

筆者在學習軟件開發(fā)過程中,多次聽到過Rest Http這個概念漾根,但在很長的一段時間里泰涂,死活搞不懂這玩意到底是個什么東西。剛開始看相關資料時辐怕,看得云里霧里逼蒙,完全不知所云 _。這玩意太過于抽象和理論寄疏,心里覺得有必要搞這么復雜么是牢。隨著自己動手開發(fā)的東西越來越多,才開始對它有了一丟丟感覺陕截。

Rest完全不是三言兩語就能將清楚的驳棱,它有自己的一套體系,所以筆者打算以后單獨寫一些有關Rest的博文农曲。在這里推薦一篇優(yōu)秀的文章社搅,它對Rest講的相當清楚,本人看完之后真有醍醐灌頂?shù)母杏X乳规!

Mapping詳解

Mapping是ES中的一個很重要的內(nèi)容形葬,它類似于傳統(tǒng)關系型數(shù)據(jù)中table的schema,用于定義一個索引(index)的某個類型(type)的數(shù)據(jù)的結構暮的。

在傳統(tǒng)關系型數(shù)據(jù)庫笙以,我們必須首先創(chuàng)建table并同時定義其schema,如下面的SQL語句冻辩。下面代碼中小括號內(nèi)的代碼的作用就是定義person_info的schema(模式)猖腕。

create table person_info
(
    name varchar(20),
    age tinyint 
)

在ES中,我們無需手動創(chuàng)建type(相當于table)和mapping(相關與schema)微猖。在默認配置下谈息,ES可以根據(jù)插入的數(shù)據(jù)自動地創(chuàng)建type及其mapping。在下面的API介紹部分中凛剥,會做相關的試驗侠仇。當然,在實際使用過程中我們可能就想硬性規(guī)定mapping犁珠,可以通過配置文件關閉ES的自動創(chuàng)建mapping功能逻炊。

mapping中主要包括字段名、字段數(shù)據(jù)類型和字段索引類型這3個方面的定義犁享。

字段名:這就不用說了余素,與傳統(tǒng)數(shù)據(jù)庫字段名作用一樣,就是給字段起個唯一的名字炊昆,好讓系統(tǒng)和用戶能識別桨吊。

字段數(shù)據(jù)類型:定義該字段保存的數(shù)據(jù)的類型威根,不符合數(shù)據(jù)類型定義的數(shù)據(jù)不能保存到ES中。下表列出的是ES中所支持的數(shù)據(jù)類型视乐。(大類是對所有類型的一種歸類洛搀,小類是實際使用的類型。)

大類 包含的小類
String string
Whole number byte, short, integer, long
Floating point float, double
Boolean boolean
Date date

字段索引類型:索引是ES中的核心佑淀,ES之所以能夠實現(xiàn)實時搜索留美,完全歸功于Lucene這個優(yōu)秀的Java開源索引。在傳統(tǒng)數(shù)據(jù)庫中伸刃,如果字段上建立索引谎砾,我們?nèi)匀荒軌蛞运鳛椴樵儣l件進行查詢,只不過查詢速度慢點捧颅。而在ES中景图,字段如果不建立索引,則就不能以這個字段作為查詢條件來搜索隘道。也就是說症歇,不建立索引的字段僅僅能起到數(shù)據(jù)載體的作用。string類型的數(shù)據(jù)肯定是日常使用得最多的數(shù)據(jù)類型谭梗,下面介紹mapping中string類型字段可以配置的索引類型忘晤。

索引類型 解釋
analyzed 首先分析這個字符串,然后再建立索引激捏。換言之设塔,以全文形式索引此字段。
not_analyzed 索引這個字段远舅,使之可以被搜索闰蛔,但是索引內(nèi)容和指定值一樣。不分析此字段图柏。
no 不索引這個字段序六。這個字段不能被搜索到。

如果索引類型設置為analyzed蚤吹,在表示ES會先對這個字段進行分析(一般來說例诀,就是自然語言中的分詞),ES內(nèi)置了不少分析器(analyser)裁着,如果覺得它們對中文的支持不好繁涂,也可以使用第三方分析器。由于筆者在實際項目中僅僅將ES用作普通的數(shù)據(jù)查詢引擎二驰,所以并沒有研究過這些分析器扔罪。如果將ES當做真正的搜索引擎,那么挑選正確的分析器是至關重要的桶雀。

mapping中除了上面介紹的3個主要的內(nèi)容外矿酵,還有其他的定義內(nèi)容唬复,詳見官網(wǎng)文檔

常用的Rest API介紹

下面介紹一下ES中的一些常用的Rest API坏瘩。掌握了這些API的用法盅抚,基本上就可以簡單地使用ES了。

我們需要借助能夠發(fā)送HTTP請求的工具調(diào)用這些API倔矾,工具是可以任意的,包括網(wǎng)頁瀏覽器柱锹。這里利用Linux上的curl命令來發(fā)送HTTP請求哪自。基本的命令結構為:

  curl <-Xaction> url -d 'body'
  # 這里的action表示HTTP協(xié)議中的各種動作禁熏,包括GET壤巷、POST、PUT瞧毙、DELETE等胧华。

注意。文中的示例代碼里面包含了用戶注釋的文字宙彪,就是 # 號后面的文字矩动。運行代碼時,請注意刪除這些注釋释漆。

查看集群(Cluster)信息相關API

(1)查看集群健康信息悲没。

  curl -XGET "localhost:9200/_cat/heath?v"

返回結果為:

epoch      timestamp cluster       status node.total node.data shards pri relo init unassign pending_tasks 
1440206633 18:23:53  elasticsearch green           1         1      0   0    0    0        0             0 

返回結果的主要字段意義:

  • cluster:集群名,是在ES的配置文件中配置的cluster.name的值男图。
  • status:集群狀態(tài)示姿。集群共有green、yellow或red中的三種狀態(tài)逊笆。green代表一切正常(集群功能齊全)栈戳,yellow意味著所有的數(shù)據(jù)都是可用的,但是某些復制沒有被分配(集群功能齊全)难裆,red則代表因為某些原因子檀,某些數(shù)據(jù)不可用。如果是red狀態(tài)差牛,則要引起高度注意命锄,數(shù)據(jù)很有可能已經(jīng)丟失。
  • node.total:集群中的節(jié)點數(shù)偏化。
  • node.data:集群中的數(shù)據(jù)節(jié)點數(shù)脐恩。
  • shards:集群中總的分片數(shù)量。
  • pri:主分片數(shù)量侦讨,英文全稱為private驶冒。
  • relo:復制分片總數(shù)苟翻。
  • unassign:未指定的分片數(shù)量,是應有分片數(shù)和現(xiàn)有的分片數(shù)的差值(包括主分片和復制分片)骗污。

我們也可以在請求中添加help參數(shù)來查看每個操作返回結果字段的意義崇猫。

  curl -XGET "localhost:9200/_cat/heath?help"

返回結果如下:

epoch         | t,time                                   | seconds since 1970-01-01 00:00:00  
timestamp     | ts,hms,hhmmss                            | time in HH:MM:SS                   
cluster       | cl                                       | cluster name                       
status        | st                                       | health status                      
node.total    | nt,nodeTotal                             | total number of nodes              
node.data     | nd,nodeData                              | number of nodes that can store data
shards        | t,sh,shards.total,shardsTotal            | total number of shards             
pri           | p,shards.primary,shardsPrimary           | number of primary shards           
relo          | r,shards.relocating,shardsRelocating     | number of relocating nodes         
init          | i,shards.initializing,shardsInitializing | number of initializing nodes       
unassign      | u,shards.unassigned,shardsUnassigned     | number of unassigned shards        
pending_tasks | pt,pendingTasks                          | number of pending tasks   

確實是很好很強大。有了這個東東需忿,就可以減少看文檔的時間诅炉。ES中許多API都可以添加help參數(shù)來顯示字段含義,哪些可以這么做呢屋厘?每個API都試試就知道了涕烧。

當然,如果你覺得返回的東西太多汗洒,看著眼煩议纯,我們也可以人為地指定返回的字段。

  curl -XGET "localhost:9200/_cat/health?h=cluster,pri,relo&v"

這次的返回結果就簡單很多羅溢谤。對于患有嚴重強迫癥的患者來說瞻凤,這是福音啊世杀!

cluster       pri relo 
elasticsearch   0    0 

(2)查看集群中的節(jié)點信息阀参。

  curl -XGET "localhost:9200/_cat/nodes?v"

返回節(jié)點的詳細信息如下:

host          ip            heap.percent ram.percent load node.role master name    
master.hadoop localhost            3          35 0.00 d         *      Ezekiel 

(3)查看集群中的索引信息。

  curl -XGET "localhost:9200/_cat/indices?v"

返回集群中的索引信息如下:

health status index      pri rep docs.count docs.deleted store.size pri.store.size 
yellow open   index_test   5   1          0            0       575b           575b 

更多的查看和監(jiān)視ES的API參見官網(wǎng)文檔玫坛。

索引(Index)相關API

(1)創(chuàng)建一個新的索引结笨。

curl -XPUT "localhost:9200/index_test"

如果返回下面的信息,則說明索引創(chuàng)建成功湿镀。如果不是炕吸,則ES會返回相應的異常信息。通趁愠眨可以通過異常信息的最后一項推斷出失敗的原因赫模。

{
    "acknowledged": true
}

上面的操作使用默認的配置信息創(chuàng)建一個索引。大多數(shù)情況下蒸矛,我們想在索引創(chuàng)建的時候就將我們所需的mapping和其他配置確定好瀑罗。下面的操作就可以在創(chuàng)建索引的同時,創(chuàng)建settings和mapping雏掠。

curl -XPUT "localhost:9200/index_test" -d ' # 注意這里的'號
{
  "settings": {
    "index": {
      "number_of_replicas": "1", # 設置復制數(shù)
      "number_of_shards": "5" # 設置主分片數(shù)
    }
  },
  "mappings": { # 創(chuàng)建mapping
    "test_type": { # 在index中創(chuàng)建一個新的type(相當于table)
      "properties": {
        "name": { # 創(chuàng)建一個字段(string類型數(shù)據(jù)斩祭,使用普通索引)
          "type": "string",
          "index": "not_analyzed"
        },
        "age": {
          "type": "integer"
        }
      }
    }
  }
}'

(2)刪除一個索引。

curl -XDELETE "localhost:9200/index_test"

如果返回與創(chuàng)建索引同樣的信息乡话,則說明刪除成功摧玫。反之,則返回相應的異常信息绑青。更多的索引操作參見ES官網(wǎng)文檔诬像。

映射(Mapping)相關API

(1)創(chuàng)建索引的mapping屋群。

curl -XPUT 'localhost:9200/index_test/_mapping/test_type' -d ' 
{
  "test_type": { # 注意,這里的test_type與url上的test_type名保存一致
      "properties": {
        "name": {
          "type": "string",
          "index": "not_analyzed"
        },
        "age": {
          "type": "integer"
        }
      }
    }
  }'

如果不想單獨創(chuàng)建mapping坏挠,可以使用上一節(jié)的方法(創(chuàng)建索引時創(chuàng)建mappings)芍躏。

假設我們的項目中有多個環(huán)境(開發(fā)環(huán)境、測試環(huán)境等)降狠,那每一個環(huán)境的mapping總要一致的吧对竣,那每次創(chuàng)建一次mappings就比較麻煩了,而且還容易導致數(shù)據(jù)不一致喊熟。莫急柏肪,ES還給我們準備另外一種創(chuàng)建mapping的方式〗媾疲可以按照下面的步驟來做。

步驟1 創(chuàng)建一個擴展名為test_type.json的文件名聂使,其中type_test就是mapping所對應的type名壁拉。

步驟2 在test_type.json中輸入mapping信息。假設你的mapping如下:

{
  "test_type": { # 注意柏靶,這里的test_type與json文件名必須一致
      "properties": {
        "name": {
          "type": "string",
          "index": "not_analyzed"
        },
        "age": {
          "type": "integer"
        }
      }
    }
  }

步驟3 在$ES_HOME/config/路徑下創(chuàng)建mappings/index_test子目錄弃理,這里的index_test目錄名必須與我們要建立的索引名一致。將test_type.json文件拷貝到index_tes目錄下屎蜓。

步驟4 創(chuàng)建index_test索引痘昌。操作如下:

curl -XPUT "localhost:9200/index_test" # 注意,這里的索引名必須與mappings下新建的index_test目錄名一致

這樣我們就創(chuàng)建了一個新的索引炬转,并且使用了test_type.json所定義的mapping作為索引的mapping辆苔。就是這么簡單方便!

(2)刪除mapping扼劈。

curl -XDELETE 'localhost:9200/index_test/_mapping/test_type'

(3)查看索引的mapping驻啤。

curl -XGET 'localhost:9200/index_test/_mapping/test_type'

更多的mapping相關操作參加官網(wǎng)文檔

文檔(document)相關API

(1)新增一個文檔荐吵。

curl -XPUT 'localhost:9200/index_test/test_type/1?pretty' -d ' # 這里的pretty參數(shù)的作用是使得返回的json顯示地更加好看骑冗。1是文檔的id值(唯一鍵)。
{
    "name": "zhangsan",
    "age" : "12"
}'

(2)更新一個文檔

curl -XPOST 'localhost:9200/index_test/test_type/1?pretty' -d ' # 這里的1必須是索引中已經(jīng)存在id先煎,否則就會變成新增文檔操作
{
    "name": "lisi",
    "age" : "12"
}'

(3)刪除一個文檔

curl -XDELETE 'localhost:9200/index_test/test_type/1?pretty' # 這里的1必須是索引中已經(jīng)存在id

(4)查詢單個文檔

curl -XGET 'localhost:9200/index_test/test_type/1?pretty'

上面的操作僅僅查詢id為1的一條文檔贼涩,這樣看似乎ES的查詢也太弱了。前面已經(jīng)說過了薯蝎,查詢操作是ES中的核心遥倦,是其立身的根本。但是本文的重點并不在這里良风,為了防止文章的篇幅過長谊迄,之后將專本介紹ES中的查詢操作闷供。

源代碼中提供的Rest API文檔結構

ES的源代碼托管在Github上。將源代碼下載下來之后统诺,里面有一個文件夾專門存放ES中絕大部分的Rest API歪脏。有了這些文檔,就不必每次都要到官網(wǎng)上查詢接口文檔了(PS:ES的官網(wǎng)真的很慢)粮呢。
下面以cat.health.json文件為例簡單地介紹這些Rest API文檔的結構婿失。一旦結構搞清楚了,文檔看起來就比較順心啄寡,ES用起來就更加得心應手了豪硅!

{
  "cat.health": {
    "documentation": "http://www.elastic.co/guide/en/elasticsearch/reference/master/cat-health.html", # 該文檔對應的官方站點
    "methods": ["GET"], 
    "url": { # url部分可選
      "path": "/_cat/health",  
      "paths": ["/_cat/health"],
      "parts": {
      },
      "params": {
        "local": {
          "type" : "boolean",
          "description" : "Return local information, do not retrieve the state from master node (default: false)"
        },
        "master_timeout": {
          "type" : "time",
          "description" : "Explicit operation timeout for connection to master node"
        },
        "h": {
            "type": "list",
            "description" : "Comma-separated list of column names to display"
        },
        "help": {
          "type": "boolean",
          "description": "Return help information",
          "default": false
        },
        "ts": {
          "type": "boolean",
          "description": "Set to false to disable timestamping",
          "default": true
        },
        "v": {
          "type": "boolean",
          "description": "Verbose mode. Display column headers",
          "default": true
        }
      }
    },
    "body": null
  }
}

上面文檔接口所對應的Reqeust操作如下:

curl -XGET "localhost:9200/_cat/health?v" -d 'body'

該操作命令可劃分為5個部分,下面把這5個部分與文檔對應起來挺物。通過這個例子懒浮,就可以在閱讀其他文檔后,使用正確的操作了识藤。

  1. 第1部分(-XGET):對應文檔中methods所包含的GET操作砚著。
  2. 第2部分(localhost:9200):是ES服務端所在主機的hostname和port。
  3. 第3部分(/_cat/health):對應文檔中的url痴昧。其中path是最簡單的url稽穆;paths是除了path之外的其他url;parts描述和解釋paths里面的url的可變部分(通常用{}包裹赶撰,如{index})舌镶。
  4. 第4部分v:表示參數(shù),對應文檔中的params豪娜。像“v”這種boolean類型的參數(shù)餐胀,不需要特意指定其布爾值(true或者false),出現(xiàn)即表示true侵歇,否則為false骂澄。
  5. 第5部分body:表示要傳遞的數(shù)據(jù)主體,對應文檔中的body。如果body里面指明“required=true”,則表示必須傳入body數(shù)據(jù)惕虑。具體body里面需要傳怎樣的數(shù)據(jù)坟冲,則可以訪問文檔中的documentation字段所指明的官方站點進行查詢。

總結

本文重點介紹了ES中的一些常用Rest API的用法溃蔫,并在開始部分簡單地介紹了一些基礎知識(Rest和mapping)健提。掌握了這些API的調(diào)用,就可以利用ES完成簡單的應用程序了。當然,ES的API遠不止這些踢星,如果想要更加深入地了解ES的使用及其內(nèi)部原理故源,建議先仔細地閱讀ES的官網(wǎng)文檔紊遵。然后下載其源代碼進行研究账千。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市暗膜,隨后出現(xiàn)的幾起案子匀奏,更是在濱河造成了極大的恐慌,老刑警劉巖学搜,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件娃善,死亡現(xiàn)場離奇詭異,居然都是意外死亡瑞佩,警方通過查閱死者的電腦和手機聚磺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來炬丸,“玉大人瘫寝,你說我怎么就攤上這事〕砭妫” “怎么了矢沿?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長酸纲。 經(jīng)常有香客問我,道長瑟匆,這世上最難降的妖魔是什么闽坡? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮愁溜,結果婚禮上疾嗅,老公的妹妹穿的比我還像新娘。我一直安慰自己冕象,他們只是感情好代承,可當我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著渐扮,像睡著了一般论悴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上墓律,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天膀估,我揣著相機與錄音,去河邊找鬼耻讽。 笑死察纯,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播饼记,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼香伴,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了具则?” 一聲冷哼從身側響起即纲,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎乡洼,沒想到半個月后崇裁,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡束昵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年拔稳,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锹雏。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡巴比,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出礁遵,到底是詐尸還是另有隱情轻绞,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布佣耐,位于F島的核電站政勃,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏兼砖。R本人自食惡果不足惜奸远,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望讽挟。 院中可真熱鬧懒叛,春花似錦、人聲如沸耽梅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽眼姐。三九已至诅迷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間妥凳,已是汗流浹背竟贯。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留逝钥,地道東北人屑那。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓拱镐,卻偏偏與公主長得像,于是被迫代替她去往敵國和親持际。 傳聞我的和親對象是個殘疾皇子沃琅,可洞房花燭夜當晚...
    茶點故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內(nèi)容