【理論部分】
一、什么是Elasticsearch?
一個采用Restful API標准的高擴展性和高可用性的實時數據分析的全文搜索工具。
二、Elasticsearch的用途
i) Github
“Github使用Elasticsearch搜索20TB的數據,包括13億的文件和1300億行的代碼”
這個不用介紹了吧,碼農們都懂的,Github在2013年1月升級了他們的代碼搜索,由solr轉為elasticsearch,目前集群規模為26個索引存儲節點和8個客戶端節點(負責處理搜索請求),詳情請看官方博客https://github.com/blog/1381-a-whole-new-code-search
Mozilla公司以火狐著名,它目前使用 WarOnOrange 這個項目來進行單元或功能測試,測試的結果以 json的方式索引到elasticsearch中,開發人員可以非常方便的查找 bug。
Socorro是Mozilla 公司的程序崩潰報告系統,一有錯誤信息就插入到 Hbase和Postgres 中,然后從 Hbase中讀取數據索引到elasticsearch中,方便查找。

三、Elasticsearch 名詞解釋
- Index:Elasticsearch用來存儲數據的邏輯區域,它類似於關系型數據庫中的db概念。一個index可以在一個或者多個shard上面,同時一個shard也可能會有多個replicas。(必須小寫)
- Document:Elasticsearch里面存儲的實體數據,類似於關系數據中一個table里面的一行數據。
- Document type:為了查詢需要,一個index可能會有多種document,也就是document type,但需要注意,不同document里面同名的field一定要是相同類型的。相當於數據庫里的一個表。 (區分大小寫,且里面的field也區分大小寫)
- Document id : 唯一,相當於數據庫主鍵。
- Mapping:存儲field的相關映射信息,不同document type會有不同的mapping。
ii) 在服務層面主要有:
- Node: 一個server實例。
- Cluster:多個node組成cluster。
- Shard:數據分片,一個index可能會存在於多個shards,不同shards可能在不同nodes。
- Replica:shard的備份,有一個primary shard,其余的叫做replica shards。
【實踐部分】
四、Elasticsearch 的安裝部署啟動
[boss@localhost ~]$ mkdir elasticesearch
[boss@localhost ~]$ cd elasticesearch/
[boss@localhost elasticesearch]$ tar xzf elasticsearch-2.3.5.tar.gz
[boss@localhost elasticesearch]$ cd bin/
[boss@localhost bin]$ ./elasticsearch
五、Elasticsearch 目錄、配置信息解釋
i) 安裝的目錄布局如下:
Type |
Description |
Default Location |
Setting |
home |
elasticsearch 安裝目錄 | path.home | |
bin |
二進制腳本,包括elasticsearch啟動節點 | {path.home}/bin | |
conf |
配置文件路徑,包含elasticsearch.yml | {path.home}/config | path.conf |
data |
在節點上每個索引/碎片的數據文件的位置。可以有多個目錄。 | {path.home}/data | path.data |
work |
零時文件目錄(工作目錄) | {path.home}/work | path.work |
logs |
日志文件目錄 | {path.home}/logs | path.logs |
如果有多個數據目錄,可以允許使用數據分拆技術,將數據能夠按照設置放在不同的磁盤上。這個分拆原來是很簡單的,只是保證一個文件完整的存在一個地方,具體是如果選擇存在那個磁盤上是通過 index.store.distributor來配置的:
- least_used(默認):總是選擇可用空間最大的目錄。
- random:隨機選擇的目錄。選擇一個特定的目錄的概率,是與這個目錄中可用空間量成正比。
cluster.name: elasticsearch天然具備集群能力,所以這里就有一個集群名稱配置,默認為elasticsearch,最好修改下。
node.name: 節點名稱,也就是集群中的各個節點的名稱,也需要配置,方便以后管理和java api開發
network.host: 允許訪問的host,可以是ipv4也可以是ipv6形式,在es2.x下如果不配,那么就只能localhost訪問了。
http.port: http端口號,用於restful、插件的訪問端口,默認9200,不能重復
transport.tcp.port: 通訊端口,java api 訪問的就是這個端口,默認9300,不能重復
discovery.zen.ping.unicast.hosts: 這個是集群啟動的時候,默認發現的主機列表,然后通過這里的host再去發現別的節點,需要至少配置一個,不然好像有點問題,我在集群搭建的時候就因為沒配置遇到一些意外情況。
discovery.zen.minimum_master_nodes: 最小的master選舉人數,默認為2,這種形式計算(total number of nodes /2+1)
discovery.zen.ping.multicast.enabled: 自動發現節點開關,如果為false,則新加入的節點不會被發現。
discovery.zen.ping.timeout: 自動發現超時時間。
六、Elasticsearch插件安裝

target/releases/elasticsearch-analysis-ik-{version}.zip
到 your-es-root/plugins/ik
4、重啟elasticsearch。這點很重要,我就因為沒有重啟折騰了一上午。
編譯安裝:
cd F:\software\elasticsearch-analysis-lc-pinyin-dev_2.2.2\elasticsearch-analysis-lc-pinyin
mvn package
配置使用:
curl -XPUT http://localhost:9200/addr
curl -XPOST http://localhost:9200/addr/std/_mapping -d'
{
"std": {
"properties": {
"detail_name": {
"type": "string",
"analyzer": "lc_index",
"search_analyzer": "lc_search",
"fields": {
"cn": {
"type": "string",
"analyzer": "ik_max_word",
"search_analyzer": "ik_max_word"
}
}
},
"door_name": {
"type": "string",
"analyzer": "lc_index",
"search_analyzer": "lc_search",
"fields": {
"cn": {
"type": "string",
"analyzer": "ik_max_word",
"search_analyzer": "ik_max_word"
}
}
}
}
}
}
'
#!/bin/sh # This example is a template to connect to Oracle # The JDBC URL and SQL must be replaced by working ones. DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" bin=${DIR}/../bin lib=${DIR}/../lib JAVA_HOME="/opt/java/jdk1.8.0_101" echo ' { "type" : "jdbc", "jdbc" : { "url" : "jdbc:oracle:thin:@//***.***.***.***:1521/***", "connection_properties" : { "oracle.jdbc.TcpNoDelay" : false, "useFetchSizeWithLongColumn" : false, "oracle.net.CONNECT_TIMEOUT" : 10000, "oracle.jdbc.ReadTimeout" : 50000 }, "user" : "pboss", "password" : "******", "sql" : "select std_addr_id as \"_id\",std_addr_id as \"std_addr_id\", name as \"door_name\", detail_name as \"detail_name\" from addr_std_addr", "index" : "addr", "type" : "std", "elasticsearch" : { "cluster" : "alpha-application", "host" : "10.10.100.104", "port" : 9300 }, "max_bulk_actions" : 20000, "max_concurrent_bulk_requests" : 10, "index_settings" : { "index" : { "number_of_shards" : 1, "number_of_replica" : 0 } } } } ' | ${JAVA_HOME}/bin/java \ -cp "${lib}/*" \ -Dlog4j.configurationFile=${bin}/log4j2.xml \ org.xbib.tools.Runner \ org.xbib.tools.JDBCImporter
"interval": "1800", 這里是同步數據的頻率 1800s,半小時,可以按需要設成 1s或其它 "schedule" : "0 0/60 0-23 ? * *", 同步數據任務 60分鍾一次 "flush_interval" : "5s", 刷新間隔為5S