ElasticSearch是一個基於Lucene構建的開源,分佈式,RESTful搜索引擎。設計用於雲計算中,可以達到實時搜索,穩定,可靠,快速,安裝使用方便。支持經過HTTP使用JSON進行數據索引。 html
咱們創建一個網站或應用程序,並要添加搜索功能,令咱們受打擊的是:搜索工做是很難的。咱們但願咱們的搜索解決方案要快,咱們但願有一個零配置和一個徹底免費的搜索模式,咱們但願可以簡單地使用JSON經過HTTP的索引數據,咱們但願咱們的搜索服務器始終可用,咱們但願可以一臺開始並擴展到數百,咱們要實時搜索,咱們要簡單的多租戶,咱們但願創建一個雲的解決方案。Elasticsearch旨在解決全部這些問題和更多的。node
怎樣在Lucene之上構建一個分佈式、高度伸縮、接近實時的搜索引擎呢? 讓咱們回顧一下在搜索引擎(基於lucene)伸縮性這條路上都作了那些嘗試,而且elasticsearch是如未嘗試並去解決這些挑戰的。 linux
首先咱們瞭解下最基礎的理論知識 building blocks (這些理論基礎是構建分佈式近實時搜索引擎的基礎)。 接着咱們研究一下到底哪一種纔是最佳的分區策略 partitioning (將lucene索引文檔分割到多個分佈式的分片中去)。 而後咱們一樣須要決定使用哪一種分區複製方式 replication (複製可以保證系統的高可用以及提升搜索的吞吐)。 最後,咱們再看一下事務日誌 transaction log (事務日誌在elasticsearch裏面是一個保證數據一致性的很是酷的功能)。git
表明一個集羣,集羣中有多個節點,其中有一個爲主節點,這個主節點是能夠經過選舉github
產生的,主從節點是對於集羣內部來講的。es的一個概念就是去中心化,字面上理解就是無中心節點,這是對於集羣外部來講的,由於從外部來看es集羣,在邏輯上是個總體,你與任何一個節點的通訊和與整個es集羣通訊是等價的。 數據庫
一個節點是你集羣中的一個服務器,做爲集羣的一部分,它存儲你的數據,參與集羣的索引和搜索功能。和集羣相似,一個節點也是由一個名字來標識的,默認狀況下,這個名字是一個隨機的漫威漫畫角色的名字,這個名字會在啓動的時候賦予節點。這個名字對於管理工做來講挺重要的,由於在這個管理過程當中,你會去肯定網絡中的哪些服務器對應於Elasticsearch 集羣中的哪些節點。 npm
一個節點能夠經過配置集羣名稱的方式來加入一個指定的集羣。默認狀況下,每一個節點都會被安排加入到一個叫作「elasticsearch」的集羣中,這意味着,若是你在你的網絡中啓動了若干個節點,並假定它們可以相互發現彼此,它們將會自動地造成並加入到一個叫作「elasticsearch」的集羣中。 bootstrap
在一個集羣裏,只要你想,能夠擁有任意多個節點。並且,若是當前你的網絡中沒有運行任何Elasticsearch節點,這時啓動一個節點,會默認建立並加入一個叫作「elasticsearch」的集羣。 centos
一個索引就是一個擁有幾分類似特徵的文檔的集合。好比說,你能夠有一個客戶數據的索引,另外一個產品目錄的索引,還有一個訂單數據的索引。一個索引由一個名字來標識(必須所有是小寫字母的),而且當咱們要對對應於這個索引中的文檔進行索引、搜索、更新和刪除的時候,都要使用到這個名字。 瀏覽器
在一個集羣中,若是你想,能夠定義任意多的索引。
索引至關於數據庫
在一個索引中,你能夠定義一種或多種類型。一個類型是你的索引的一個邏輯上的分類/分區,其語義徹底由你來定。一般,會爲具備一組共同字段的文檔定義一個類型。好比說,
咱們假設你運營一個博客平臺而且將你全部的數據存儲到一個索引中。在這個索引中,你能夠爲用戶數據定義一個類型,爲博客數據定義另外一個類型,固然,也能夠爲評論數據定義另外一個類型。
類型至關於數據庫中的表
一個文檔是一個可被索引的基礎信息單元。好比,你能夠擁有某一個客戶的文檔,某一個產品的一個文檔,固然,也能夠擁有某個訂單的一個文檔。文檔以 JSON(Javascript Object Notation)格式來表示,而 JSON 是一個處處存在的互聯網數據交互格式。
在一個 index/type 裏面,只要你想,你能夠存儲任意多的文檔。注意,儘管一個文檔,物理上存在於一個索引之中,文檔必須被索引/賦予一個索引的 type。
文檔至關於表中的一行記錄
表明索引分片,es能夠把一個完整的索引分紅多個分片,這樣的好處是能夠把一個大的索引拆分紅多個,分佈到不一樣的節點上。構成分佈式搜索。分片的數量只能在索引建立前指定,而且索引建立後不能更改。
表明索引副本,es能夠設置多個索引的副本,副本的做用一是提升系統的容錯性,當個某個節點某個分片損壞或丟失時能夠從副本中恢復。二是提升es的查詢效率,es會自動對搜索請求進行負載均衡。
總之,每一個索引能夠被分紅多個分片。一個索引也能夠被複制 0 次(意思是沒有複製)或屢次。一旦複製了,每一個索引就有了主分片(做爲複製源的原來的分片)和複製分片(主分片的拷貝)之別。分片和複製的數量能夠在索引建立的時候指定。在索引建立以後,你能夠在任什麼時候候動態地改變複製的數量,可是你過後不能改變分片的數量。
默認狀況下,Elasticsearch 中的每一個索引被分片 5 個主分片和 1 個複製,這意味着,若是你的集羣中至少有兩個節點,你的索引將會有 5 個主分片和另外 5 個複製分片(1 個徹底拷貝),這樣的話每一個索引總共就有 10 個分片。
1.以本人爲例,在三臺機器上安裝了es,來搭建集羣
2進入elasticsearch的config目錄,打開並編輯elasticsearch.yml
# ======================== Elasticsearch Configuration =========================
#
# NOTE: Elasticsearch comes with reasonable defaults for most settings.
# Before you set out to tweak and tune the configuration, make sure you
# understand what are you trying to accomplish and the consequences.
#
# The primary way of configuring a node is via this file. This template lists
# the most important settings you may want to configure for a production cluster.
#
# Please see the documentation for further information on configuration options:
# <http://www.elastic.co/guide/en/elasticsearch/reference/current/setup-configuration.html>
#
# ---------------------------------- Cluster -----------------------------------
#
# Use a descriptive name for your cluster:
#三臺電腦cluster.name:保持一致
cluster.name: my-askingdata
#
# ------------------------------------ Node ------------------------------------
#
# Use a descriptive name for the node:
#三臺電腦的node.name不能同樣
node.name: node-1
#
# Add custom attributes to the node:
#
# node.rack: r1
#
# ----------------------------------- Paths ------------------------------------
#
# Path to directory where to store the data (separate multiple locations by comma):
#
# path.data: /path/to/data
#
# Path to log files:
#
# path.logs: /path/to/logs
#
# ----------------------------------- Memory -----------------------------------
#
# Lock the memory on startup:
#
# bootstrap.mlockall: true
#
# Make sure that the `ES_HEAP_SIZE` environment variable is set to about half the memory
# available on the system and that the owner of the process is allowed to use this limit.
#
# Elasticsearch performs poorly when the system is swapping the memory.
#
# ---------------------------------- Network -----------------------------------
#
# Set the bind address to a specific IP (IPv4 or IPv6):
# ip
network.host: 192.168.1.106
#
# Set a custom port for HTTP:
#端口
http.port: 9200
#
# For more information, see the documentation at:
# <http://www.elastic.co/guide/en/elasticsearch/reference/current/modules-network.html>
#
# --------------------------------- Discovery ----------------------------------
#
# Pass an initial list of hosts to perform discovery when new node is started:
# The default list of hosts is ["127.0.0.1", "[::1]"]
#寫入三臺電腦的ip
discovery.zen.ping.unicast.hosts: ["192.168.1.106", "192.168.1.108","192.168.1.109"]
#
# Prevent the "split brain" by configuring the majority of nodes (total number of nodes / 2 + 1):
#
1.進入elasticsearch的bin目錄
2.執行 ./elasticsearch 命令便可運行
3.瀏覽器中運行:http://192.168.1.108:9200/ 若是出現如下畫面表示運行成功
下載Elasticsearch 5.1.1
下載地址:https://www.elastic.co/downloads/elasticsearch
zip和tar格式是各類系統都通用的,解壓以後啓動Elasticsearch便可。
下載elasticsearch-head
下載地址:https://github.com/mobz/elasticsearch-head,下載後解壓縮。
1、安裝nodejs
curl -sL -o /etc/yum.repos.d/khara-nodejs.repo https://copr.fedoraproject.org/coprs/khara/nodejs/repo/epel-7/khara-nodejs-epel-7.repo
yum install -y nodejs nodejs-npm
$ node -v
$ npm -v
2、安裝grunt
npm install -g grunt-cli
npm install -g grunt --save-dev
grunt -version
到elasticsearch-head-master目錄下,運行命令:
npm install
若是速度較慢或者安裝失敗,可使用國內鏡像:
npm install -g cnpm --registry=https://registry.npm.taobao.org
編輯elasticsearch-5.1.1/config/elasticsearch.yml,加入如下內容:
http.cors.enabled: true
http.cors.allow-origin: "*"
打開elasticsearch-head-master/Gruntfile.js,找到下面connect屬性,新增hostname: ‘0.0.0.0’:
connect: {
server: {
options: {
hostname: '*',
port: 9100,
base: '.',
keepalive: true
}
}
}
在elasticsearch-head-master/目錄下,運行啓動命令:
grunt server
後臺啓動grunt server命令;
nohup grunt server &
若是想關閉head插件,使用Linux查找進程命令:
ps aux|grep head
結束進程:
kill進程號
將以下一條歌曲信息的數據提交到ES中建立索引:
[plain] view plain copy
url:http://127.0.0.1:9200/song001/list001/1
data:{"number":32768,"singer":"楊坤","size":"5109132","song":"今夜二十歲","tag":"中國好聲音","timelen":319}
索引名字是:song001;
索引的類型是:list001;
本記錄的id是:1
返回的信息能夠看到建立是成功的,而且版本號是1;ES會對記錄修改進行版本跟蹤,第一次建立記錄爲1,同一條記錄每修改一次就追加1。
至此一條記錄就提交到ES中創建了索引,注意HTTP的方法是PUT,不要選擇錯了。
根據索引時的ID查詢的文檔的RESTful接口以下
url:http://127.0.0.1:9200/song001/list001/1
HTTP方法採用GET的形式。
根據索引時的ID更新的文檔的內容其RESTful接口以下
url:http://127.0.0.1:9200/song001/list001/1
HTTP方法採用PUT的形式。
將歌手名由「楊坤」改爲「楊坤獨唱」;
結果中的version字段已經成了2,由於咱們這是是修改,索引版本遞增;created字段是false,表示此次不是新建而是更新。
更新接口與建立接口徹底同樣,ES會查詢記錄是否存在,若是不存在就是建立,存在就是更新操做。
根據索引時的ID更新的文檔的內容其RESTful接口以下
url:http://127.0.0.1:9200/song001/list001/1
HTTP方法採用DELETE的形式。
刪除事後,再經過查詢接口去查詢將得不到結果。
增刪改查的RESTful接口URL形式:http://localhost:9200/<index>/<type>/[<id>]
增刪改查分別對應:HTTP請求的PUT、GET、DELETE方法。PUT調用是若是不存在就是建立,已存在是更新。
快速bulk插入數據
下載 https://github.com/codelibs/elasticsearch-reindexing