日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

ElasticSearch 索引

發布時間:2023/12/13 综合教程 36 生活家
生活随笔 收集整理的這篇文章主要介紹了 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 索引的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。