ElasticSearch是一個基於Lucene構建的開源,分佈式,RESTful搜索引擎。設計用於雲計算中,可以達到實時搜索,穩定,可靠,快速,安裝使用方便。支持經過HTTP使用JSON進行數據索引。 html
Lucene只是一個框架,要利用它的功能,須要使用JAVA,而且在程序中集成Lucene。更糟的是,Lucene很是複雜,須要作不少的學習瞭解,才能明白它是如何運行的。 java
Elasticsearch使用Lucene做爲內部引擎,可是在使用它作全文搜索時,只須要使用統一開發好的API便可,請不須要了解其背後複雜的Lucene的運行原理。因此ElasticSearch能夠看做是Lucene的封裝。 node
ElasticSearch,簡稱ES,是使用Lucene做爲內部引擎,而Lucene是純Java語言編寫的,所以也是運行在JVM上的。 linux
假設JDK安裝包位於/home/test/java目錄下,Linux中安裝JDK: 數據庫
以root身份在/usr/下創建java目錄:sudo mkdir /usr/java json
rpm –ivh /home/test/java/jdk-7u67-linux-i586.rpm (使用該命令進行安裝,會安裝到/usr/java/目錄下) bootstrap
sudo vi /etc/profile 安全
#JAVA_HOME 服務器
export JAVA_HOME=/usr/java/jdk1.7.0_67 網絡
export CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH: $JAVA_HOME/bin
java -version
輸出Java版本的相關信息,及表示安裝成功。
ES下載地址:http://www.elasticsearch.org/download 目前最新版本是:1.4.1
將安裝包放於/homg/test/目錄下,解壓elasticsearch-1.4.1.tar:tar –zxvf /home/test/elasticsearch-1.4.1.tar
解壓安裝後,在/home/test/elasticsearch-1.4.1/目錄下會有三個文件夾:bin、config、lib
運行bin文件夾下的elasticsearch便可將ES系統跑起來:./elasticsearch
最新版的ES須要JDK 1.7及以上
若使用Java API進行操做ES,二者的JDK版本還需一致
配置文件位於config目錄下,主要有:elasticsearch.yml(ES框架的核心配置)、logging.yml(日誌記錄相關配置,使用的是log4j進行日誌記錄)
主要解釋elasticsearch.yml下各配置項的含義。
################################### 集羣###################################
# 集羣名稱,默認爲elasticsearch,在同一網段,具備相同集羣名字的節點會自動成爲一個集羣
#cluster.name: elasticsearch
####################################節點#####################################
# 節點名稱,es啓動時會自動建立節點名稱
#node.name: "Franz Kafka"
# 是否做爲主節點,每一個節點均可以被配置成爲主節點,默認值爲true,只有設置爲true時,纔有可能成爲master,最早啓動,且該參數設爲true的節點會被推選了master
#node.master: true
# 每一個節點均可以定義一些與之關聯的通用屬性,用於後期集羣進行碎片分配時的過濾
#node.rack: rack314
# 默認狀況下,多個節點能夠在同一個安裝路徑啓動,若是你想讓你的es只啓動一個節點,能夠進行以下設置
#node.max_local_storage_nodes: 1
#################################### 索引####################################
# 設置一個索引的分片數量,默認值爲5
#index.number_of_shards: 5
# 設置一個索引可被複制的數量,默認值爲1
#index.number_of_replicas: 1
# 當你想要禁用公佈式時,你能夠進行以下設置
#index.number_of_shards: 1
#index.number_of_replicas: 0
# 這兩個屬性的設置直接影響集羣中索引和搜索操做的執行。假設你有足夠的機器來持有碎片和複製品,那麼能夠按以下規則設置這兩個值:
# 1) 擁有更多的碎片能夠提高索引執行能力,並容許經過機器分發一個大型的索引;
# 2) 擁有更多的複製器可以提高搜索執行能力以及集羣能力。
# 對於一個索引來講,number_of_shards只能設置一次,而number_of_replicas可使用索引更新設置API在任什麼時候候被增長或者減小
#################################### Paths ####################################
# 配置文件所在的位置,即elasticsearch.yml和logging.yml所在的位置
#path.conf: /path/to/conf
# 分配給當前節點的索引數據所在的位置,能夠設置多個路徑,路徑之間用逗號分隔
#path.data: /path/to/data
# 臨時文件位置
#path.work: /path/to/work
# 日誌文件所在位置
#path.logs: /path/to/logs
# 插件安裝位置
#path.plugins: /path/to/plugins
#################################### 插件###################################
# 插件託管位置,若列表中的某一個插件未安裝,則節點沒法啓動
#plugin.mandatory: mapper-attachments,lang-groovy
################################### 內存####################################
# JVM開始交換時,ElasticSearch表現並很差:你須要保障JVM不進行交換,
# 能夠將bootstrap.mlockall設置爲true禁止交換
#bootstrap.mlockall: true
##############################網絡和HTTP###############################
# 默認狀況下,ElasticSearch使用0.0.0.0地址,併爲http傳輸開啓9200-9300端口,
# 爲節點到節點的通訊開啓9300-9400端口,也能夠自行設置IP地址
#network.bind_host: 192.168.0.1
# 設置其餘節點鏈接此節點的地址,若是不設置的話,則自動獲取
#network.publish_host: 192.168.0.1
# 定製該節點與其餘節點交互的端口
#transport.tcp.port: 9300
# 節點間交互時,能夠設置是否壓縮,默認爲不壓縮
#transport.tcp.compress: true
# Http傳輸監聽定製端口
#http.port: 9200
# 設置內容的最大長度
#http.max_content_length: 100mb
# 禁止HTTP
#http.enabled: false
################################### 網關###################################
# 網關容許在全部集羣重啓後持有集羣狀態,集羣狀態的變動都會被保存下來,
# 當第一次啓用集羣時,能夠從網關中讀取到狀態,默認網關類型(也是推薦的)是local
#gateway.type: local
# 容許在N個節點啓動後恢復過程
#gateway.recover_after_nodes: 1
# 設置初始化恢復過程的超時時間
#gateway.recover_after_time: 5m
# 設置該集羣中可存在的節點上限
#gateway.expected_nodes: 2
############################# 恢復設置#############################
# 設置一個節點的併發數量,有兩種狀況,一種是在初始復甦過程當中
#cluster.routing.allocation.node_initial_primaries_recoveries: 4
# 另外一種是在添加、刪除節點及調整時
#cluster.routing.allocation.node_concurrent_recoveries: 2
# 設置復甦時的吞吐量,默認狀況下是 20mb
#indices.recovery.max_bytes_per_sec: 20mb
# 設置從對等節點恢復片斷時打開的流的數量上限
#indices.recovery.concurrent_streams: 5
################################## Discovery ##################################
# 設置一個集羣中主節點的數量,當多於三個節點時,該值可在2-4之間
#discovery.zen.minimum_master_nodes: 1
# 設置ping其餘節點時的超時時間,網絡比較慢時可將該值設大
#discovery.zen.ping.timeout: 3s
# 禁止當前節點發現多個集羣節點,默認值爲false
#discovery.zen.ping.multicast.enabled: false
# 設置新節點被啓動時可以發現的主節點列表
#discovery.zen.ping.unicast.hosts: ["host1", "host2:port"]
##################################日誌顯示##################################
# Shard level query and fetch threshold logging.
#index.search.slowlog.threshold.query.warn: 10s
#index.search.slowlog.threshold.query.info: 5s
#index.search.slowlog.threshold.query.debug: 2s
#index.search.slowlog.threshold.query.trace: 500ms
#index.search.slowlog.threshold.fetch.warn: 1s
#index.search.slowlog.threshold.fetch.info: 800ms
#index.search.slowlog.threshold.fetch.debug: 500ms
#index.search.slowlog.threshold.fetch.trace: 200ms
#index.indexing.slowlog.threshold.index.warn: 10s
#index.indexing.slowlog.threshold.index.info: 5s
#index.indexing.slowlog.threshold.index.debug: 2s
#index.indexing.slowlog.threshold.index.trace: 500ms
##################################垃圾回收日誌記錄################################
#monitor.jvm.gc.young.warn: 1000ms
#monitor.jvm.gc.young.info: 700ms
#monitor.jvm.gc.young.debug: 400ms
#monitor.jvm.gc.old.warn: 10s
#monitor.jvm.gc.old.info: 5s
#monitor.jvm.gc.old.debug: 2s
################################## 安全################################
# Uncomment if you want to enable JSONP as a valid return transport on the
# http server. With this enabled, it may pose a security risk, so disabling
# it unless you need it is recommended (it is disabled by default).
#http.jsonp.enable: true
一個集羣就是由一個或多個節點組織在一塊兒, 它們共同持有整個的數據,並一塊兒提供索引和搜索功能。一個集羣由一個惟一的名字標識,這個名字默認就是「elasticsearch」 。一個節點只能經過指定某個集羣的名字,來加入這個集羣。
一個節點是集羣中的一個服務器,做爲集羣的一部分,它存儲你的數據,參與集羣的索引和搜索功能。和集羣相似,一個節點也是由一個名字來標識的,默認狀況下,這個名字是隨機的。這個名字會在啓動的時候賦予節點。 這個名字對於管理工做來講挺重要的,由於在這個管理過程當中,你會去肯定網絡中的哪些服務器對應於Elasticsearch 集羣中的哪些節點。
在一個集羣裏,能夠擁有任意多個節點。並且,若是當前網絡中沒有運 行 任 何 Elasticsearch 節 點 , 這 時 啓 動 一 個 節 點 , 會 默 認 創 建並 加 入 一 個 叫 作「elasticsearch」的集羣.
一個索引就是一個擁有幾分類似特徵的文檔的集合。一個索引由一個名字來標識(必須所有是小寫字母的),而且當咱們要對對應於這個索引中的文檔進行索引、搜索、更新和刪除的時候,都要使用到這個名字。相似於數據庫db。
在一個索引中,能夠定義一種或多種類型。 一個類型是索引的一個邏輯上的分類/分區,其語義徹底由你來定。一般,會爲具備一組共同字段的文檔定義一個類型。相似於數據表table
一個文檔是一個可被索引的基礎信息單元。好比,你能夠擁有某一個客戶的文檔,某一個產品的一個文檔,固然,也能夠擁有某個訂單的一個文檔。文檔以 JSON(Javascript Object Notation)格式來表示,在一個 index/type 裏面,能夠存儲任意多的文檔。注意,儘管一個文檔,物理上存在於一個索引之中,文檔必須被索引/賦予一個索引的 type。相似於一行記錄。
一個索引能夠存儲超出單個結點硬件限制的大量數據。好比,一個具備 10 億文檔的索引佔據 1TB 的磁盤空間,而任一節點都沒有這樣大的磁盤空間;或者單個節點處理搜索請求,響應太慢。爲了解決這個問題,Elasticsearch 提供了將索引劃分紅多份的能力,這些份就叫作分片。當你建立一個索引的時候,你能夠指定你想要的分片的數量。每一個分片自己也是一個功能完善而且獨立的「索引」 ,這個「索引」能夠被放置到集羣中的任何節點上。
關係數據庫 ⇒ 數據庫 ⇒ 表 ⇒ 行 ⇒ 列(Columns) Elasticsearch ⇒ 索引 ⇒ 類型 ⇒ 文檔 ⇒ 字段(Fields)