ElasticSearch:html
ES是一個基於Lucene實現的開源、分佈式、Restful的全文本搜索引擎;此外,它仍是一個分佈式實時文檔存儲,其中每一個文檔的每一個field均是被索引的數據,且可被搜索;也是一個帶實時分析功能的分佈式搜索引擎,可以擴展至數以百計的節點實時處理PB級的數據。java
Lucene介紹:http://www.cnblogs.com/python-gm/p/8400001.html
基本組件:node
ES的集羣組件:python
ES Cluster工做過程:json
官方站點:https://www.elastic.co/
ElasticSearch依賴於JDK環境:能夠安裝配置 Oracle JDK 或 OpenJDK ubuntu
ES的默認端口:緩存
Restful API:bash
Cluster APIs:app
curl -XGET 'http://172.16.100.67:9200/_cluster/health?pretty'
curl -XGET 'http://172.16.100.67:9200/_cluster/state/<metrics>?pretty'
curl -XGET 'http://172.16.100.67:9200/_cluster/stats'
curl -XGET 'http://172.16.100.67:9200/_nodes/stats'
Plugins:負載均衡
/usr/share/elasticsearch/bin/plugin -h 參數: -l -i, --install -r, --remove
http://HOST:9200/_plugin/plugin_name
部署elasticsearch集羣:
主機:Ubuntu16.04 elasticsearch版本:6.4.2
sudo apt-get install default-jre # 查看java版本 java -version openjdk version "1.8.0_181" OpenJDK Runtime Environment (build 1.8.0_181-8u181-b13-0ubuntu0.16.04.1-b13) OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)
# 首先須要添加 Apt-key: wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add - # 而後添加 Elasticsearch 的 Repository 定義: echo "deb https://artifacts.elastic.co/packages/6.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-6.x.list # 安裝 Elasticsearch: sudo apt-get update sudo apt-get install elasticsearch # 全部主機完成 Elasticsearch 的安裝
cluster.name: evescn ##集羣名稱,全部主機配置必須相同 node.name: node-1 ##節點名稱,不一樣主機此處名字不能相同 path.data: /var/lib/elasticsearch path.logs: /var/log/elasticsearch network.host: 0.0.0.0 http.port: 9200 discovery.zen.ping.unicast.hosts: ["192.168.20.102", "192.168.20.103", "192.168.0.104"] ## 集羣地址設置,配置以後集羣的主機之間能夠自動發現
# curl -XGET 'http://localhost:9200/_cluster/state?pretty' | less { "cluster_name" : "evescn", "compressed_size_in_bytes" : 10114, "cluster_uuid" : "lmV_adT3TTGt3kz5_IWeSA", "version" : 14, "state_uuid" : "c1pcj3nAS5-DyWoCcWXy5w", "master_node" : "LdRkSjSMSLKH7PtOwDHQIw", "blocks" : { }, "nodes" : { "LdRkSjSMSLKH7PtOwDHQIw" : { "name" : "node-2", "ephemeral_id" : "nf0KaKZlQduuz3rWVzxhew", "transport_address" : "192.168.20.103:9300", "attributes" : { "ml.machine_memory" : "1021595648", "ml.max_open_jobs" : "20", "xpack.installed" : "true", "ml.enabled" : "true" } }, "LR0zlOMbRF-kxX33VQLtCw" : { "name" : "node-3", "ephemeral_id" : "gX8srlZWR9GdU2W-B63KIw", "transport_address" : "192.168.20.104:9300", "attributes" : { "ml.machine_memory" : "1021595648", "ml.max_open_jobs" : "20", "xpack.installed" : "true", "ml.enabled" : "true" } ...... }
## 6.X新版本規則,須要指定 -H "Content-Type: application/json" # A主機插入數據 # curl -H "Content-Type: application/json" -XPUT 'localhost:9200/students/class1/2?pretty' -d ' > { > "first_name": "gm", > "last_name": "evescn", > "gender": "Man", > "age": 23, > "courses": "ELK" > }' # B主機查看 # curl -XGET 'localhost:9200/students/class1/2?pretty' { "_index" : "students", "_type" : "class1", "_id" : "2", "_version" : 1, "found" : true, "_source" : { "first_name" : "gm", "last_name" : "evescn", "gender" : "Man", "age" : 23, "courses" : "ELK" }
CRUD操做相關的API:
curl -XPUT 'localhost:9200/students/class1/2?pretty' -d ' > { > "first_name": "Rong", > "last_name": "Huang", > "gender": "Female", > "age": 23, > "courses": "Luoying Shenjian" > }' { "_index" : "students", "_type" : "class1", "_id" : "2", "_version" : 1, "created" : true }
~]# curl -XGET 'localhost:9200/students/class1/2?pretty' { "_index" : "students", "_type" : "class1", "_id" : "2", "_version" : 1, "found" : true, "_source": { "first_name": "Rong", "last_name": "Huang", "gender": "Female", "age": 23, "courses": "Luoying Shenjian" }
~]# curl -XPOST 'localhost:9200/students/class1/2/_update?pretty' -d ' { "doc": { "age": 22 } }' { "_index" : "students", "_type" : "class1", "_id" : "2", "_version" : 2 }
DETELE ~]# curl -XDELETE 'localhost:9200/students/class1/2'
~]# curl -XDELETE 'localhost:9200/students' ~]# curl -XGET 'localhost:9200/_cat/indices?v'
查詢數據:
一、經過Restful request API查詢; ~]# curl -XGET 'localhost:9200/students/_search?pretty' 二、經過發送REST request body進行; ~]# curl -XGET 'localhost:9200/students/_search?pretty' -d ' > { > "query": { "match_all": {} } > }'
/_search:全部索引; /INDEX_NAME/_search:單索引; /INDEX1,INDEX2/_search:多索引; /s*,t*/_search:正則匹配搜索 /students/class1/_search:單類型搜索 /students/class1,class2/_search:多類型搜索
Mapping和Analysis:
GET /_search?q='Xianglong' :全部域中出現此字符串的值 GET /_search?q='Xianglong%20Shiba%20Zhang' GET /_search?q=courses:'Xianglong%20Shiba%20Zhang' :在courses域中查詢此字符串 GET /_search?q=courses:'Xianglong' 前兩個:表示在_all域搜索; 後兩個:在指定的域上搜索;
~]# curl 'localhost:9200/students/_mapping/class1?pretty'
types:exact full-text 精確值:指未經加工的原始值;在搜索時進行精確匹配; full-text:用於引用文本中數據;判斷文檔在多大程序上匹配查詢請求;即評估文檔與用戶請求查詢的相關度;
Standard analyzer: Simple analyzer Whitespace analyzer Language analyzer
request body: 分紅兩類: query dsl:執行full-text查詢時,基於相關度來評判其匹配結果;查詢執行過程複雜,且不會被緩存; filter dsl:執行exact查詢時,基於其結果爲「yes」或「no」進行評判;速度快,且結果緩存;
查詢語句的結構: { QUERY_NAME: { AGGUMENT: VALUE, ARGUMENT: VALUE,... } } { QUERY_NAME: { FIELD_NAME: { ARGUMENT: VALUE,... } } }
term filter:精確匹配包含指定term的文檔;
{ "term": {"name": "Guo"} } curl -XGET 'localhost:9200/students/_search?pretty' -d { "query": { "term": { "name": "Guo" } } }
terms filter:用於多值精確匹配; { "terms": { "name": ["Guo", "Rong"] }} range filters:用於在指定的範圍內查找數值或時間。 { "range": "age": { "gte": 15, "lte": 25 } } gt, lt, gte, lte
exists and missing filters:存在或不存在
{ "exists": { "age": 25 } }
boolean filter: 基於boolean的邏輯來合併多個filter子句; must:其內部全部的子句條件必須同時匹配,即and; must: { "term": { "age": 25 } "term": { "gender": "Female" } }
must_not:其全部子句必須不匹配,即not must_not: { "term": { "age": 25 } }
should:至少有一個子句匹配,即or should: { "term": { "age": 25 } "term": { "gender": "Female" } }
match_all Query: 用於匹配全部文檔,沒有指定任何query,默認即爲match_all query. { "match_all": {} }
match Query: 在幾乎任何域上執行full-text或exact-value查詢; 若是執行full-text查詢:首先對查詢時的語句作分析; { "match": {"students": "Guo" }} 若是執行exact-value查詢:搜索精確值;此時,建議使用過濾,而非查詢; { "match": {"name": "Guo"} }
multi_match Query: 用於在多個域上執行相同的查詢; { "multi_match": "query": full-text search "field": {'field1', 'field2'} } { "multi_match": "query": { "students": "Guo" } "field": { "name", "description" } }
bool query: 基於boolean邏輯合併多個查詢語句;與bool filter不一樣的是,查詢子句不是返回"yes"或"no",而是其計算出的匹配度分值。所以,boolean Query會爲各子句合併其score; must: must_not: should:
合併filter和query: { "filterd": { query: { "match": {"gender": "Female"} } filter: { "term": {"age": 25}} } }
GET /INDEX/_validate/query?pretty { ... } GET /INDEX/_validate/query?explain&pretty { ... }