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部分(-XGET):對應文檔中methods所包含的GET操作砚著。
- 第2部分(localhost:9200):是ES服務端所在主機的hostname和port。
- 第3部分(/_cat/health):對應文檔中的url痴昧。其中path是最簡單的url稽穆;paths是除了path之外的其他url;parts描述和解釋paths里面的url的可變部分(通常用{}包裹赶撰,如{index})舌镶。
- 第4部分v:表示參數(shù),對應文檔中的params豪娜。像“v”這種boolean類型的參數(shù)餐胀,不需要特意指定其布爾值(true或者false),出現(xiàn)即表示true侵歇,否則為false骂澄。
- 第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)文檔紊遵。然后下載其源代碼進行研究账千。