天天看點

Elasticsearch之建立索引、删除索引、索引設定、配置分析器、自定義分析器。建立索引删除索引索引設定配置分析器自定義分析器建立自定義分析器

建立索引

通過添加一個文檔的方式建立一個索引。這個索引使用預設設定,新的屬性通過動态映射添加到分類中。現在我們需要對這個過程有更多的控制:我們需要確定索引被建立在适當數量的分片上,在索引資料之前設定好分析器和類型映射。

為了達到目标,我們需要手動建立索引,在請求中加入所有設定和類型映射,如下所示:

Elasticsearch之建立索引、删除索引、索引設定、配置分析器、自定義分析器。建立索引删除索引索引設定配置分析器自定義分析器建立自定義分析器

事實上,你可以通過在config/elasticsearch.yml 中添加下面的配置來防止自動建立索引。

action.auto_create_index:false

NOTE:自動預先配置索引,這在索引日志資料時尤其有效:你将日志資料索引在一個以日期結尾的索引上,第二天,一個新的配置好的索引會自動建立好。

删除索引

使用以下的請求來删除索引:

DELETE /my_index

你也可以用下面的方式删除多個索引

DELETE /index_one,index_two

DELETE /index_*

你甚至可以删除所有索引

DELETE /_all

索引設定

你可以通過很多種方式來自定義索引行為,但是:

提示:Elasticsearch提供了優化好的預設配置。除非你明白這些配置的行為和為什麼要這麼做,請不要修改這些配置。

下面是兩個最重要的設定:

number_of_shards

定義一個索引的主分片個數,預設值是“5”。這個配置在索引建立後不能修改。

number_of_replicas

每個主分片的複制分片個數,預設是“1”。這個配置可以随時在活躍的索引上修改。

例如,我們可以建立隻有一個主分片,沒有複制分片的小索引。

PUT /my_temp_index

{

"setting" : {

"number_of_shards" : 1,

"number_of_replicas" : 0

}

}

然後,我們可以用 update-index-settings API動态修改複制分片個數:

PUT /my_temp_index/_settings

{

"number_of_replicas" : 1

}

配置分析器

第三個重要的索引設定是 analysis 部分,用來配置已存在的分析器或建立自定義分析器來定制化你的索引。

standard 分析器是用于全文字段的預設分析器,對于大部分西方語言來說是一個不錯的選擇。它考慮了以下幾點:

  • standard 分詞器,在詞層級上分割輸入的文本。
  • standard 表征過濾器,被設計用來整理分詞器觸發的所有表征(但是目前什麼都沒做)。
  • lowercase 表征過濾器,将所有表征轉換為小寫。
  • stop 表征過濾器,删除所有可能會造成搜尋歧義的停用詞,如 a, the, and, is。

預設情況下,停用詞過濾器是被禁用的。如需啟用它,你可以通過建立一個基于standard分析器的自定義分析器,并且設定stopwords參數。可以提供一個停用詞清單,或者使用一個特定語言的預定停用詞清單。 在下面的例子中,我們建立了一個新的分詞器,叫做 es_std,并使用預定義的西班牙語停用詞: PUT /spanish_docs { "settings" : { "analysis" : { "analyzer" : { "es_std" : { "type" : "standard" , "stopwords" : "_spanish" } } } } } es_std分析器不是全局的,它僅僅存在于我們定義的 spanish_docs索引中。為了用 analyze API來測試他,我們需要使用特定的索引名。 GET /spanish_docs/_analyze?analyzer=es_std El veloz zorro marrón 下面簡化的結果中顯示停用詞 El 被正确的删除了:

Elasticsearch之建立索引、删除索引、索引設定、配置分析器、自定義分析器。建立索引删除索引索引設定配置分析器自定義分析器建立自定義分析器

自定義分析器

雖然Elasticsearch内置了一系列的分析器,但是真正的強大之處在于定制你自己的分析器。你可以通過在配置檔案中組合字元過濾器、分詞器和表征過濾器,來滿足特定資料的需求。 分析器是三個順序執行的元件的結合(字元過濾器、分詞器、表征過濾器)。 字元過濾器 字元過濾器是讓字元串在被分詞前變得更加“整潔”。例如,如果我們的文本是HTML格式,他可能會包含一些我們不想被索引的HTML标簽,諸如<p> 或<div>。 我們可以使用 html_strip 字元過濾器來删除所有的HTML标簽,并且将HTML實體轉換成對應的Unicode字元,比如将&Aacute;轉成Á。 一個分析器可能包含零到多個字元過濾器。 分詞器 一個分析器必須包含一個分詞器。分詞器将字元串分割成單獨的詞(terms)或表征(tokens)。standard分析器使用 standard 分詞器将字元串分割成單獨的字詞,删 除大部分标點符号,但是現存的其他分詞器會有不同的行為特征。 例如,keyword 分詞器輸出和它接收到的相同的字元串,不做任何分詞處理。【whitespace 分詞器】隻通過空格來分割文本。【pattern 分詞器】可以通過正規表達式 來分割文本。 表征過濾器 分詞結果的表征流會根據各自的情況,傳遞給特定的表征過濾器。 表征過濾器可能修改、添加或删除表征。我們已經提過 lowercase 和 stop 表征過濾器,但是Elasticsearch中有更多的選擇。stemmer 表征過濾器将單詞轉化為他們的 根形态(root form)。ascii_folding 表征過濾器會删除音符号,比如從très轉為tres。 ngram 和 edge_ngram 可以讓表征更适合特殊比對情況或自動完成。

建立自定義分析器

與索引設定一樣,我們預先配置好 es_std 分析器,我們可以在 analysis 字段下配置字元過濾器、分詞器和表征過濾器:

Elasticsearch之建立索引、删除索引、索引設定、配置分析器、自定義分析器。建立索引删除索引索引設定配置分析器自定義分析器建立自定義分析器

作為例子,我們來配置一個這樣的分析器: 1、用html_strip 字元過濾器去除所有的HTML标簽。 2、将&替換成 and,使用一個自定義的 mapping字元過濾器。 "char_filter" : { "&_to_and" : { "type" : "mapping", "mapping" : [ "&=>and" ] } } 1、使用standard 分詞器分割單詞 2、使用lowercase 表征過濾器将詞轉為小寫 3、用stop 表征過濾器去除一些自定義停用詞 "filter" : { "my_stopwords" : { "type" : "stop", "stopwords" : [ "the" , "a" ] } } 根據以上描述來将預定義好的分詞器和過濾器組合成我們的分析器: "analyzer" : { "my_analyzer" : { "type" : "custom", "char_filter" : ["html_strip" , "&_to_and"] , "tokenizer" : "standard", "filter" : [ "lowercase" , "my_stopwords" ] } } 用下面的方式可以将以上請求合并成一條: PUT /my_index  { "settings" : { "analysis" : { "char_filter" : { "&_to_and" : { "type" : "mapping" , "mapping" : [ "&=>and" ] }}, "filter" : { "my_stopwords" : { "type" : "stop", "stopwords" : [ "the" , "a" ] }}, "analyzer" : { "my_analyzer" : { "type" : "custom", "char_filter" : [ "html_strip", "&_to_and" ], "tokenizer" : "standard", "filter" : [ "lowercase", "mystopwords" ] } } } } } 建立索引後,用 analyze API 來測試新的分析器: GET /my_index/_analyze?analyzer=my_analyzer The quick & brown fox 下面的結果證明我們的分析器能正常工作了:

Elasticsearch之建立索引、删除索引、索引設定、配置分析器、自定義分析器。建立索引删除索引索引設定配置分析器自定義分析器建立自定義分析器

除非我們告訴Elasticsearch在哪裡使用,否則分析器不會起作用。我們可以通過下面的映射将它應用在一個string類型的字段上: PUT /my_index/_mapping/my_type { "properties" : { "title" : { "type" : "string", "analyzer" : "my_analyzer" } } }

繼續閱讀