ElasticSearch 索引
ElasticSearch 索引
這是ElasticSearch 2.4 版本系列的第三篇:
第一篇:ES1:Windows下安裝ElasticSearch
第二篇:ES2:ElasticSearch 集群配置
第三篇:ES3:ElasticSearch 索引
ElasticSearch是文檔型數據庫,索引(Index)定義了文檔的邏輯存儲和字段類型,每個索引可以包含多個文檔類型,文檔類型是文檔的集合,文檔以索引定義的邏輯存儲模型,比如,指定分片和副本的數量,配置刷新頻率,分配分析器等,存儲在索引中的海量文檔分布式存儲在ElasticSearch集群中。
ElasticSearch是基于Lucene框架的全文搜索引擎,將所有文檔的信息寫入到倒排索引(Inverted Index)的數據結構中,倒排索引建立的是索引中詞和文檔之間的映射關系,在倒排索引中,數據是面向詞(Term)而不是面向文檔的。
ElasticSearch的對象模型,跟關系型數據庫模型相比:
索引(Index):相當于數據庫,用于定義文檔類型的存儲;在同一個索引中,同一個字段只能定義一個數據類型;
文檔類型(Type):相當于關系表,用于描述文檔中的各個字段的定義;不同的文檔類型,能夠存儲不同的字段,服務于不同的查詢請求;
文檔(Document):相當于關系表的數據行,存儲數據的載體,包含一個或多個存有數據的字段;
字段(Field):文檔的一個Key/Value對;
詞(Term):表示文本中的一個單詞;
標記(Token):表示在字段中出現的詞,由該詞的文本、偏移量(開始和結束)以及類型組成;
索引是由段(Segment)組成的,段不是實時更新的,這意味著,在建立索引時,一個段寫入磁盤后,就不再被更新。被刪除文檔的信息存儲在一個單獨的文件中,在搜索數據時,ElasticSearch首先從段中查詢,再從查詢結果中過濾被刪除的文檔,這意味著,段中存儲”未被刪除文檔“的密度降低。多個段可以通過段合并(Segment Merge)操作把“已刪除”的文檔將從段中物理刪除,將未刪除的文檔合并成一個新段,新段中沒有”已刪除文檔“,因此,段合并操作能夠提高索引的查找速度,但段合并是IO密集型的,需要消耗大量的IO操作。
一,創建索引
在創建索引之前,首先了解RESTful API的調用風格,在管理和使用ElasticSearch服務時,常用的HTTP動詞有下面五個:
GET 請求:獲取服務器中的對象
相當于SQL的Select命令
GET /blogs:列出所有博客
POST請求:在服務器上更新對象
相當于SQL的Update命令
POST /blogs/ID:更新指定的博客
PUT請求:在服務器上創建對象
相當于SQL的Create命令
PUT /blogs/ID:新建一個博客
DELETE請求:刪除服務器中的對象
相當于SQL的Delete命令
DELETE /blogs/ID:刪除指定的博客
HEAD請求:僅僅用于獲取對象的基礎信息
1,禁用自動創建索引
推薦設置:在全局配置文件 elasticsearch.yml 中,禁用自動創建索引:
action.auto_create_index:false
2,手動創建索引
創建索引的語法是:PUThttp://host:port/index_name/ +index_configuration
其中,index_name是創建的索引的名字,indiex_configuration是向ElasticSearch服務器傳遞的請求負載的主體,數據格式是json,用于定義索引的配置信息:映射節(mappings)和配置節(settings)。
在創建索引時,需要精心設計索引的映射節(mappings)和配置節(settings),本例創建blog索引和articles文檔類型,創建索引的語法是:
PUT http://localhost:9200/blog/
下文詳細介紹ElasticSearch索引的配置信息
二,索引映射節(mappings)
1,索引結構
索引是由文檔類型構成的,在mappings字段中定義索引的文檔類型,示例代碼中為blog索引定義了三個文檔類型:articles,followers和comments
{
"mappings":{
"articles":{ },
"followers":{ },
"comments":{ }
}
}
2,文檔屬性
文檔屬性定義了文檔類型的共用屬性,適用于文檔的所有字段:
dynamic_date_formats屬性:該屬性定義可以識別的日期格式列表;
dynamic屬性:默認值為true,允許向文檔類型中加入字段,推薦設置為false,關閉ElasticSearch自動類型檢測,同時關閉自動添加字段;文檔類型的所有字段必須顯式定義,在properties字段中未定義的字段都將會ElasticSearch忽略。
{
"mappings":{
"articles":{ "dynamic":false,
"dynamic_date_formats":["yyyy-MM-dd hh:mm:ss", "yyyy-MM-dd" ],
"properties":{
"id":{},
"title":{},
"author":{},
"content":{},
"postedat":{}
}
}
}
}
三,文檔的字段屬性
1,字段的數據類型
字段的數據類型由字段的屬性type指定,ElasticSearch支持的基礎數據類型主要有:
字符串類型:string;
數值類型:字節(byte)、2字節(short)、4字節(integer)、8字節(long)、float、double;
布爾類型:boolean,值是true或false;
時間/日期類型:date,用于存儲日期和時間;
二進制類型:binary;
IP地址類型:ip,以字符串形式存儲IPv4地址;
特殊數據類型:token_count,用于存儲索引的字數信息
在文檔類型的properties屬性中,定義字段的type屬性,指定字段的數據類型:
"properties":{
"id":{"type":"long"},
2,字段的公共屬性
index_name:該屬性定義字段的別名,該別名會存儲在索引中;默認值是字段的名稱。
index:編入索引,該屬性共有三個有效值:analyzed、no和not_analyzed:
analyzed:表示該字段將會被ES引擎分析,產生token,能夠使用全文搜索;
not_analyzed:表示該字段不會被分析,使用原始值編入索引;
no:無法搜索該字段;
其中analyzed是分析,分解的意思,默認值是analyzed,表示將該字段編入索引,以供搜索。
store:該屬性值是boolean,指定是否將字段的原始值寫入索引,默認值是no
boost:助推,默認值是1,定義了字段在文檔中的重要性/權重;
copy_to:該屬性指定一個字段Field1,字段Field1的值將會被復制到當前字段;
include_in_all:該屬性指定當前字段是否包括在_all字段中,默認值是ture,所有的字段都會包含_all字段中;如果index=no,那么屬性include_in_all無效,這意味著當前字段無法包含在_all字段中。
3,字符串類型常用的其他屬性
analyzer:該屬性定義用于建立索引和搜索的分線器名稱,默認值是全局定義的分析器名稱
index_analyzer:該屬性定義用于建立索引的分析器名稱;
search_analyzer:該屬性定義的分析器,用于處理發送到特定字段的查詢字符串;
index_options:索引選項
分析器(analyzer)屬性,可以引用在配置結點(settings)中自定義的分析器
4,數值類型的其他屬性
precision_step:該屬性指定為數值字段每個值生成的term數量,值越低,產生的term數量越高,范圍查詢越快,索引越大,默認值是4;
ignore_malformed:忽略錯誤格式,默認值是false,不忽略錯誤格式;
5,日期類型的其他屬性
format:指定日期的格式,例如:“yyyy-MM-dd hh:mm:ss”
precision_step:該屬性指定為數值字段每個值生成的term數量,值越低,產生的term數量越高,范圍查詢越快,索引越大,默認值是4;
ignore_malformed:忽略錯誤格式,默認值是false,不忽略錯誤格式;
6,多字段(fields)
在fields屬性中定義一個或多個字段,該字段的值和當前字段值相同,可以設置一個字段用于搜索,一個字段用于排序等。
"properties":
{
"id":{ "type":"long",
"fields":{ "id2":{"type":"long","index":"not_analyzed"} }
},
7,信息格式(postings_format)
postings_format屬性用于為字段指定信息格式:
default:使用字段的默認信息格式,提供了實時的對存儲字段和詞向量的壓縮功能
pulsing:將高基數字段的信息列表編碼為詞條矩陣,加快查詢速度;
direct:在讀操作過程中將詞條加載到矩陣中,能夠提升常用字段的性能,但是內存消耗較大;
memory:將所有的數據寫入硬盤,并將數據讀取到內存中;
bloom_default和bloom_pulsing分別是default 和 pulsing的擴展,增加了bloom過濾器;
8,文檔值格式(doc_values_format)
文檔值格式(doc_values_format),該屬性定義字段的值被寫入到具有較高內存效率的列式結構,以便進行高效的排序和聚合搜索。使用文檔值的字段將有專屬的字段數據緩存實例,無需像普通字段一樣倒排。
文檔值格式的有效值:
default:當未指定文檔值格式時,使用默認格式,使用少量內存;
disk:將字段數據存儲在硬盤中,幾乎不需要內存,在執行排序和聚合操作時,性能略有降低;由于字段數據存儲在硬盤上,從而節省JVM堆內存空間;
memory:將字段數據存儲在內存中,在執行排序和聚合操作時,和倒排索引字段的功能不相上下,由于這種數據結構存儲在內存中,索引的刷新速度更快;
配置字段的文檔值格式:
"properties":{
"id":{
"type":"int","doc_values_format":"memory"
},
四,附加字段
1,_all 字段
ElasticSearch使用_all字段存儲其他字段的數據以便搜索,默認情況下,_all字段是啟用的,包含了索引中所有字段的數據,然而這一字段使索引變大,如果不需要,請禁用該字段,或排除某些字段。為了在_all字段中不包括某個特定字段,在字段中設置“include_in_all”屬性為false。
禁用_all字段,需要修改映射配置:
{
"articles":{ "_all":{
"enabled":"false"
}
}
}
2,_source 字段
_source字段表示在生成索引的過程中,存儲發送到ElasticSearch的原始JSON文檔,默認情況下,該字段會被啟用,因為索引的局部更新功能依賴該字段。
{
"articles":{
"_source":{
"enabled":"false"
}
}
}
{
"articles":{
"_source":{
"excludes":["Content","Comments"],
"includes":["author"]
}
}
}
3,_routing 字段
路由字段,將一個文檔值進行哈希映射,并將該文檔路由到指定的分片,路由的公式是:
shard_num = hash(_routing) % num_primary_shards
在ElasticSearch 2.4 版本中,path參數被廢棄,使用的默認字段是_id,設置required為true,表示路由字段在進行索引的CRUD操作時必需顯式賦值。
{
"articles":{
"_routing":{
"required":"true"
}
}
}
在put 命令中,使用自定義的路由字段,以下示例使用 user1字段作為路由字段更新和查詢文檔:
PUT my_index/my_type/1?routing=user1
{
"title": "This is a document"
}
GET my_index/my_type/1?routing=user1
五,索引配置節(settings)
1,配置索引的分片和副本數量
ElasticSearch索引是有一個或多個分片組成的,每個分片是索引的一個水平分區,包含了文檔數據的一部分;每個分片有0,1或多個副本,分片的副本和分片存儲相同的數據。
示例代碼,為索引創建5個分片,分片沒有副本:
"settings":{
"number_of_shards":5,
"number_of_replicas":0,
2,配置分析器(analyzer)
在配置結點的analysis屬性中配置分析器,參考官方文檔了解更多,
分詞器(tokenizer)是系統預定義的,常用的分詞器是:
standard:默認值,用于大多數歐洲語言的標準分詞器
simple:基于非字母字符來分詞,并將其轉化為小寫形式
whitespace:基于空格來分詞
stop:除了simple的所有功能,還能基于停用詞(stop words)過濾數據;
pattern:使用正則表達式分詞;
snowball:除了standard提供的分詞功能之外,還提供詞干提取功能;
過濾器是系統預定義的,常用的過濾器是:
asciifolding
lowercase
kstem
在配置結點中,自定義分析器(analyzer)示例代碼:
View Code
六,刪除索引
刪除索引的語法是: DELETEhttp://localhost:9200/blog
七,更新索引
索引的更新分為逐個文檔的更新和批量文檔更新:
1,單個文檔(Individual Document)的更新
單個文檔更新的語法是:POSThttp://localhost:9200/blog/articles/1 +文檔對象的JSON數據
POSThttp://localhost:9200/blog/articles/1
文檔對象的JSON數據示例如下:
{
"id":1,
"title":"Elasticsearch index",
"Author":"悅光陰",
"content":"xxxxxxxxxxx",
"postedat":"2017-03-14"
}
2,批量文檔的更新(Bluk)
批量文檔更新的語法是:POSThttp://localhost:9200/_bulk+ 批量文檔對象的JSON數據,在_bulk 端進行批量更新操作。
在傳遞的請求主體中,每一個請求分為兩個JSON數據,第一個JSON數據包含操作說明的描述信息,第二個JSON數據包含文檔對象:
View Code
八,搜索索引
在_search端對索引數據進行搜索,ES查詢的語法非常復雜,總體來說,ElasticSearch支持聚合查詢和簡單查詢。
1,按照路由搜索
路由可以控制文檔和查詢轉發的目的分片,ElasticSearch計算路由字段的哈希值,對于相同的路由值,將產生相同的哈希值,分配到特定的分片上;如果在查詢時,指定路由值,那么只需要搜索單個分片而不是整個索引,就能獲取查詢結果。
路由字段由文檔類型的_routing屬性定義,在查詢時,使用routing參數來查找特定路由的文檔:
GET http://localhost:9200/blog/_search?routing=1235&q=article_id=100
2,聚合和簡單查詢
下回分解
附:索引的配置文檔
{
"settings":{
"number_of_shards":5,
"number_of_replicas":0
},
"mappings":{
"articles":{
"_routing":{
"required":true
},
"_all":{
"enabled":false
},
"_source":{
"enabled":false
},
"dynamic_date_formats":[
"yyyy-MM-dd",
"yyyyMMdd"
],
"dynamic":"false",
"properties":{
"articleid":{
"type":"long",
"store":"yes",
"index":"analyzed"
},
"title":{
"type":"string",
"store":"yes",
"index":"analyzed",
"fields":{
"title":{
"type":"string",
"index":"not_analyzed"
}
}
},
"author":{
"type":"string",
"store":"yes",
"index":"analyzed",
"fields":{
"author":{
"type":"string",
"index":"not_analyzed"
}
}
},
"content":{
"type":"string",
"store":"yes",
"index":"analyzed"
},
"postat":{
"type":"date",
"store":"yes",
"format":[
"yyyy-MM-dd",
"yyyyMMdd"
],
"index":"not_analyzed"
}
}
}
}
}
參考文檔:
Elasticsearch Reference [2.4] » Mapping
總結
以上是生活随笔為你收集整理的ElasticSearch 索引的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenCV直方图(直方图、直方图均衡,
- 下一篇: word文档中设置"粘贴为纯文