目錄
Elastic Search 是一個基於Lucene構建的開源、分佈式、RESTful接口全文搜索引擎,也是一個分佈式文檔數據庫。
相關產品
- Beats
一個代理,可以把數據發給ES。
- Shield
權限控制,基於角色管理。收費項目
- Watcher
警報和通知工具
- Marvel
管理和監控工具。收費項目
全文索引
對每個詞建立一個索引,指明該詞在文章中出現的次數和位置。
Lucene
Lucene是一個全文索引引擎工具包,提供了完整的查詢引擎和索引引擎,以及部分的文本分析引擎。
lucene倒排索引
不是由記錄確定屬性值,而是由屬性值確定記錄位置,因此稱爲倒排索引。帶有倒排索引的文件稱爲倒排索引文件(reverted file)。
倒排索引中的對象爲文檔或者文檔中的單詞。用來存儲單詞或者文檔在一個文檔或一組文檔中的位置。
搜索引擎的關鍵是建立倒排索引文件。倒排索引一般表現爲一個關鍵詞,它的頻度,位置。
1、取得關鍵詞:
2、建立倒排索引
3、實現
-
詞典文件(Term Dictionary)
-
頻率文件(frequencies)
-
位置文件(positions)
-
field。信息所在位置,保存在詞典文件中。
4、壓縮算法
5、應用場景
術語及概念
1、索引詞(term)
索引詞是一個能夠被索引的精確值。foo,Foo,FOO,是不同的索引詞。
2、文本(text)
文本是一段普通的非結構化文字。搜索引擎應該能夠根據索引詞找到原文。
3、分析(analysis)
分析是把文本轉化爲索引詞的過程。分析的結果依賴分詞器。
4、集羣(cluster)
5、節點(node)
6、路由(routing)
當存儲一個文檔,它會存儲在唯一的一個主分片中,具體哪個分片通過散列值確定。
7、分片(shard)
分片是單個lucene實例。索引是指向主分片和副本分片的邏輯空間。
8、主分片(primary shard)
每個文檔只存在在主分片中,然後複製到不同副本,默認一個索引有5個主分片。
9、副本分片(replica shard)
每一個分片可以有0個多個副本。副本是針對每個分片的。分片個數 x 副本數量 = 總副本分片個數。
10、複製(replica)
每個索引可以拆分成多個分片。索引可以複製0個或多個分片。一旦複製,就有了主分片與副本分片。分片的數量和副本的數量可以在創建索引時創建。創建索引後可以修改副本的數量,但是不可以修改分片的數量。默認每個索引分配5個分片和一個副本,則集羣至少需要2個節點,包括5分主分片和5個副本分片。
11、索引(index)
索引是具有相同結構的文檔集合。例如客戶索引,目錄索引,訂單索引等。
12、類型(type)
在索引中可以定義一個或多個類型,類型是索引的邏輯分區。一般情況,一種類型被定義爲具有一組公共字段的文檔。
13、文檔(document)
存儲的一個JSON格式字符串。每個存在在索引中的一個文檔,都有一個ID和類型。每個文檔都是一個JSON對象,存儲了0個或多個字段(或者鍵值對),原始的JSON文檔被存在一個叫做_source的字段中,索引返回值默認就是這個字段。
14、映射(mapping)
映射像關係數據庫中的表結構,每個索引都有一個映射,定義了索引中的每個字段類型以及一個索引範圍的設置。一個映射可以事先定義或者自動識別。
15、字段(field)
文檔中包含0個或多個字段,字段可以是一個簡單的值,也可以是數組或者嵌套對象。
16、來源字段(source field)
源文檔被存在_source字段,索引時返回。
17、主鍵(ID)
文檔的id/type/index必須是唯一的。
映射詳解
字段數據類型
- 字符串類型:string(3.x後改成了text類型)
- 整數 : byte,short,integer,long
- 浮點數:float,double
- 布爾型: boolean
- 日期: date
字段屬性(約束條件)
-
type:指定該字段的數據類型,值爲上述列出的“字段數據類型”,不指定的話,由elasticsearch自動判斷。
-
index:指定該字段是否索引,接收值爲true和false,字符串類型默認爲true,其他的數據類型默認爲false。值爲true的話會做分詞。值爲false的話不分詞,原樣寫入索引中。
-
ignore_above:接受整數值,如果字符串長度長於這個值,則不寫入索引,不指定的話默認爲0。
-
analyzer:如果該字段需要索引的話,指定索引時使用的分詞器,不指定的話默認使用標準分詞器分詞。
-
search_analyzer:指定搜索時使用的分詞器,不知道的話使用標準分詞器分詞。
-
store:值爲yes和no,默認爲no。指定是否將該字段的原始文檔寫入索引。在elasticsearch中,因爲_source中(_source下面解析)已經存儲了一份原始文檔,在索引中再存儲原始文檔就多餘了,所以Elasticsearch默認是把store屬性設置爲no。
-
include_in_all:指定該字段是否需要包含在_all中(_all下面解析),接收值爲true和false,默認爲flase。
-
null_value:如果該字段的值爲null,則用該值代替。
-
format:格式化日期類型,比如:yyyy-MM-dd HH:mm:ss||yyyy-MM-dd。默認strict_date_optional_time||epoch_millis
元數據類型
每一個文檔都有與之關聯的元數據,元數據字段是爲了保證系統正常運行內置字段,比如_index表示索引字段,_type表示類型,_id表示文檔主鍵,這些字段都是以下劃線開始的,除了這些元數據之外,還有兩個很重要的元數據,它們是_all和_source,這兩個元數據字段可以在我們創建類型映射的時候,指定約束條件,我們接着來看看:
- _source:
存儲的文檔的原始值。默認_source字段是開啓的,也可以關閉。如果想要關閉_source字段,在mapping中的設置如下:
{
"typename":{
"_source":{
"enabled":false
},
"properties": {
...
}
}
}
如果只想存儲某幾個字段的原始值到elasticsearch,可以通過incudes參數來設置,同樣,可以通過excludes參數排除某些字段。在mapping中的設置如下:
{
"typename":{
"_source":{
"includes":["field1","field2"],"excludes":["field3","field4"]
},
"properties": {
...
}
}
}
- _all:
包含全部內容的字段,默認是關閉的,開啓_all字段的方法和_source類似,mapping中的配置如下:
{
"typename": {
"_all": {
"enabled": true
},
"properties": {
...
}
}
}
也可以通過在字段中指定某個字段是否包含在_all中:
{
"yourtype": {
"typename": {
"field1": {
"type": "string",
"include_in_all": false
},
"field2": {
"type": "string",
"include_in_all": true
}
}
}
}
對外接口
ES對外接口以HTTP協議,以JSON格式REST約定對外提供。
HTTP配置放在elasticsearch.yml中,都是靜態屬性,必須重啓生效。HTTP對外接口模塊是可以禁用的,設置http.enabled = false 。
API約定
多索引參數
- _all
全部索引
- *
通配符,統配多個字符
- ignore_unavailable
當索引不存在或關閉時,是否忽略索引。true、false
- allow_no_indices
使用通配符查詢索引,索引不存在時,是否返回失敗。true、false。
- expand_wildcards
控制通配符索引表達式匹配哪一類索引。包括open(開啓),close(關閉),none(不可用),all(開啓和關閉)
日期篩選
幾乎所有API都支持日期篩選。
語法:
<static_name {date_math_expr{date_format|time_zone}}>
- static_name :索引名稱
- date_math_expr:動態日期計算表達式
- date_format:日期格式
- time_zone:時區,默認UTC
例如:
<secilog-{now/d{YYYY.MM.dd+12:00}}>
通用參數
1、pretty
?pretty=true,返回JSON格式,或者
?format=yaml,YAML格式
2、human
?human=true,返回更適合人類閱讀的格式
3、日期表達式
- ||
- 分割符號
- +
- 加一個單位
- -
- 減一個單位
- /
- 取整
支持的時間單位:y(年),M(月),w(周),d(日),H(時),m(分),s(秒)
4、響應過濾(filter_path)
通過filter_path過濾返回內容
?filter_path=took,hits*
支持通配符(*),逗號分割。
基於URL的訪問控制
可以通過配置文件限制某個用戶對索引的請求
REST
POST,GET,PUT,DELETE
HEAD插件
Head插件作爲url請求工具,需要在服務器安裝
http://host:port/_plugin/head
創建庫
http:/*/secisland?pretty
返回:
{ "acknowledged":true} //表示成功
插入數據
修改文檔
刪除文檔
刪除庫
JAVA API