ElasticSearch是一個基於Lucene的分佈式多用戶全文搜索引擎,使用Json索引,提供RESTful API,有着極高的實時搜索性能。html
ES主要功能git
優勢github
ES特性算法
索引結構sql
健康狀態docker
Mysql : ES 關係對比數據庫
在具體存儲空間選型時須要考慮一下幾點:json
存儲空間選型建議:
通常一種文檔數據即佔用一個INDEX空間,除非知足如下條件可考慮TYPE空間數組
DockerFile:緩存
FROM elasticsearch:2.3.5 # head插件 RUN /usr/share/elasticsearch/bin/plugin install mobz/elasticsearch-head # IK分詞安裝 RUN mkdir /usr/share/elasticsearch/plugins/analysis-ik \ && cd /usr/share/elasticsearch/plugins/analysis-ik \ && wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v1.9.5/elasticsearch-analysis-ik-1.9.5.zip \ && unzip elasticsearch-analysis-ik-1.9.5.zip \ && rm -fr elasticsearch-analysis-ik-1.9.5.zip
鏡像構建與啓動:
docker build -t test/elasticsearch . docker run -d -p 9200:9200 -p 9300:9300 --name=es test/elasticsearch # 檢查插件(應該會羅列head、 analysis-ik兩個插件) docker exec es bin/elasticsearch-plugin list
訪問:
http://localhost:9200
http://192.168.137.4:9200/_plugin/head
analyzer
分析器由如下組成:
char_filter
字符過濾器tokenizer
分詞器filter
詞條過濾器IK分詞:
plugins/analysis-ik/config/custom/mydict.dic
文件中追加自定義詞條plugins/analysis-ik/config/IKAnalyzer.cfg.xml
中配置utf-8遠程詞庫remote_ext_dict地址Last-Modified、ETag
,任一值變更都會觸發IK插件進行詞庫熱更新WebServer
在 client
請求文件的內容發生變動時 會自動更新Last-Modified、ETag
兩個頭部信息測試分詞器
curl -XGET 'http://localhost:9200/索引/_analyze?analyzer=ik&pretty=true&text=xxx'
curl -XPUT http://localhost:9200/索引
curl -XPUT http://localhost:9200/索引/_mapping/類型 -d' { "properties": { "字段": { "type": "text", #byte、integer、float、string、date、boolean、geo_point、geo_shape、nested(用於嵌套的對象數組)、object(用於對象,對象會被扁平化處理) "index": "analyzed", #analyzed(全文搜索)、not_analyzed(精確值搜索)、no(不可搜索); "analyzer": "ik_max_word", "include_in_all": true, #該字段是否要包含在_all字段中進行搜索 "fields": { "子字段1": { "type": "string" } } } } } #子字段查詢標識 字段.子字段1 # 默認索引模式 - string類型默認`analyzed` - 其餘簡單類型默認`not_analyzed`
curl -XPUT http://localhost:9200/索引/類型/id -d'xxx'
curl -XPOST http://localhost:9200/索引/類型 -d'xxx'
curl -XPUT http://localhost:9200/索引/類型/id -d'xxx'
curl -XDELETE http://localhost:9200/索引
curl -XGET http://localhost:9200/索引/類型/id
curl -XGET http://localhost:9200/索引/類型/_search?查詢字符串
查詢字符串:
q=xxx:yyy
+
追加匹配條件,-
追加不匹配條件sort=字段:desc|asc
DSL請求體形式 curl -XPOST http://localhost:9200/_search -d'DSL請求體'
(注意請求類型是post)
DSL請求體
{}
{query:查詢表達式, sort:排序, from:起始數, size:每頁文檔數}
查詢模式
查詢表達式
{查詢方法: 值}
{查詢方法: {字段:值}}
{ bool:{ 合併關係: 查詢語句 或 [查詢語句], ... } }
查詢語句合併關係
每一個子查詢有本身的評分,在bool時合併評分,如下每一個合併關係在每一個bool的直接下級中只能調用一次
常見查詢語句
{match_all: {}}
{match: {字段: 值}}
{multi_match: {query:值, fields:[字段1, ...]}}
{range: {字段:{gte:最小值,lt:最大值}}}
{term: {字段:值}}
{terms: {字段:[值1,...]}}
{exists: {field:字段}}
{nested: {path:上級字段, query:查詢表達式}}
注意
{ "term" : { "tags" : "search" } }
能夠匹配字段 { "tags" : ["search", "open_source"] }
查詢調試
curl -XGET http://localhost:9200/索引/類型/_validate/query -d{}
curl -XGET http://localhost:9200/索引/類型/_validate/query?explain -d{}
curl -XGET http://localhost:9200/_search?explain&format=yaml -d{}
curl -XGET http://localhost:9200/索引/類型/ID/_explain -d{}
默認相關性得分降序排列 curl -XGET http://localhost:9200/索引/類型/_search -d'{query:查詢表達式, sort:排序, from:起始數, size:每頁文檔數}'
查詢結果集排序:
{字段: {order:desc|asc}}
{字段: {order:desc|asc, mode:歸一模式}}
min、max、avg、sum、
index:analyzed
的String
會被ES處理成多值字段[{字段1: {order:desc|asc}}, ...]
注意:
index:not_analyzed
字段上進行排序index:analyzed
字段上排序極耗內存請求結構 curl -XGET http://localhost:9200/索引/類型/_search -d'{query:查詢表達式, highlight:高亮表達式}'
高亮表達式:
{ pre_tags : [<tag1>], post_tags : [</tag1>], fields : { _all: { pre_tags : [<tag1>], post_tags : [</tag1>], fragment_size: 100, #匹配片斷長度 number_of_fragments: 5, #匹配片斷數 no_match_size: 0, #無匹配狀況下文本長度 } field1 : {} } }
請求體
curl -XGET http://localhost:9200/索引/類型/_search -d { size:0, #設置查詢結果集數目爲0提升聚合查詢速度 query:查詢表達式, aggs:聚合表達式, }
聚合表達式
{ 聚合名1:{ 聚合方法:{field:字段} global:{}, #聲明在全局桶下聚合(聚合運算基於所有文檔) aggs:嵌套聚合表達式(僅桶類聚合下面能夠增長嵌套聚合) }, ... }
聚合構成
一個聚合的每一個 層級 均可以有多個度量或桶
聚合方法
分桶聚合通用參數
距離算法distance_type
圈過濾
{ geo_distance:{ distance:1km, distance_type:距離算法, location位置字段:{ lon:對比經度 lat:對比緯度 } } }
環過濾
{ geo_distance_range:{ gte:1km,內徑 lte:1km,外徑 distance_type:距離算法, location位置字段:{ lon:對比經度 lat:對比緯度 } } }
排序
{ _geo_distance:{ location位置字段:{ lat:對比緯度, lon:對比經度 }, nested_path:可選的nest路徑, order:desc|asc, unit:km, distance_type:距離算法 } }
返回結果中,每一個條目的sort字段首個值即爲相對距離/m
{ index: my_index, body: { query: { bool: { must: [ #評分模式的搜搜匹配 {match: {字段: 值}}, ... {nested: { path:上級字段, query: { bool: { must: [ {match: {上級字段.該級字段: 值}}, ... ] } } }} ], filter: [ #不評分模式的過濾 {term: {字段:值}}, {range: {字段:{gte:最小值,lt:最大值}}}, ... { geo_distance:{ distance:1km, distance_type:距離算法, location位置字段:{ lon:對比經度 lat:對比緯度 } } } ], } }, from: 100, size: 50, sort: [ {排序字段: {order: desc}}, ... {_geo_distance:{ location位置字段{ lon:對比經度 lat:對比緯度 }, order:asc, unit:km, distance_type:距離算法 } } ], highlight: { { fields : { myField: { pre_tags : [<tag1>], post_tags : [</tag1>], fragment_size: 100, #匹配片斷長度 number_of_fragments: 5, #匹配片斷數 no_match_size: 0, #無匹配狀況下文本長度 } } } }, aggs: { 聚合名: { term: {field: 字段名}, ... aggs: { mySum: {sum: {field:字段名}} } }, ... }, } }