elasticsearch —索引原理(九)

1.操作索引

創建了一個新的索引 ,這個索引採用的是默認的配置,新的字段通過動態映射的方式被添加到類型映射。現在對這個建立索引的過程做更多的控制:我們想要確保這個索引有數量適中的主分片,並且在我們索引任何數據 之前 ,分析器和映射已經被建立好。

爲了達到這個目的,我們需要手動創建索引,在請求體裏面傳入設置或類型映射,如下所示:

PUT /my_index
{
    "settings": { ... any settings ... },
    "mappings": {
        "type_one": { ... any mappings ... },
        "type_two": { ... any mappings ... },
        ...
    }
}

如果你想禁止自動創建索引,你 可以通過在 config/elasticsearch.yml 的每個節點下添加下面的配置:

action.auto_create_index: false

如果你想要避免意外的大量刪除, 你可以在你的 elasticsearch.yml 做如下配置:

action.destructive_requires_name: true

這個設置使刪除只限於特定名稱指向的數據, 而不允許通過指定 _all 或通配符來刪除指定索引庫。你同樣可以通過 Cluster State API 動態的更新這個設置。

2.索引設置

Elasticsearch 提供了優化好的默認配置。
下面是兩個 最重要的設置:

number_of_shards
每個索引的主分片數,默認值是 5 。這個配置在索引創建後不能修改。
number_of_replicas
每個主分片的副本數,默認值是 1 。對於活動的索引庫,這個配置可以隨時修改。
例如,我們可以創建只有 一個主分片,沒有副本的小索引:

PUT /my_temp_index
{
    "settings": {
        "number_of_shards" :   1,
        "number_of_replicas" : 0
    }
}

然後,我們可以用 update-index-settings API 動態修改副本數:

PUT /my_temp_index/_settings
{
    "number_of_replicas": 1
}

3.配置分析器

第三個重要的索引設置是 analysis 部分,用來配置已存在的分析器或針對你的索引去創建新的自定義分析器

在analysis中,我們介紹了一些內置的分析器,用於將全文字符串轉換爲適合搜索的倒排索引。

standard 分析器是用於全文字段的默認分析器,它包括了以下幾點:

  • standard 分詞器,通過單詞邊界分割輸入的文本。
  • standard 語彙單元過濾器,目的是整理分詞器觸發的語彙單元(但是目前什麼都沒做)。
  • lowercase 語彙單元過濾器,轉換所有的語彙單元爲小寫。
  • stop 語彙單元過濾器,刪除停用詞—​對搜索相關性影響不大的常用詞,如 a , the , and , is 。

默認情況下,stop 過濾器是被禁用的。如需啓用它,你可以通過創建一個基於 standard 分析器的自定義分析器並設置 stopwords 參數。 可以給分析器提供一個停用詞列表,或者告知使用一個基於特定語言的預定義停用詞列表。

在下面的例子中,我們創建了一個新的分析器,叫做 es_std , 並使用預定義的_spanish_停用詞列表:

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 已被正確的移除:

{
  "tokens" : [
    { "token" :    "veloz",   "position" : 2 },
    { "token" :    "zorro",   "position" : 3 },
    { "token" :    "marrón",  "position" : 4 }
  ]
}

4.自定義分析器

雖然Elasticsearch帶有一些現成的分析器,然而在分析器上Elasticsearch真正的強大之處在於,你可以通過在一個適合你的特定數據的設置之中組合字符過濾器分詞器詞彙單元過濾器來創建自定義的分析器。
一個 分析器 就是在一個包裏面組合了三種函數的一個包裝器, 三種函數按照順序被執行:

  • 字符過濾器
    字符過濾器 用來 整理 一個尚未被分詞的字符串。例如,如果我們的文本是HTML格式的,它會包含像 < p > 或者 < div > 這樣的HTML標籤,這些標籤是我們不想索引的。我們可以使用 html清除 字符過濾器 來移除掉所有的HTML標籤,並且像把 Á 轉換爲相對應的Unicode字符 Á 這樣,轉換HTML實體。

一個分析器可能有0個或者多個字符過濾器。

  • 分詞器
    一個分析器 必須 有一個唯一的分詞器。 分詞器把字符串分解成 單個詞條 或者 詞彙單元。 標準 分析器裏使用的 標準 分詞器 把一個字符串根據單詞邊界分解成單個詞條,並且移除掉大部分的標點符號,然而還有其他不同行爲的分詞器存在。

例如, 關鍵詞 分詞器 完整地輸出 接收到的同樣的字符串,並不做任何分詞。 空格 分詞器 只根據空格分割文本 。 正則 分詞器 根據匹配正則表達式來分割文本 。

  • 詞單元過濾器
    經過分詞,作爲結果的 詞單元流 會按照指定的順序通過指定的詞單元過濾器 。

詞單元過濾器可以修改、添加或者移除詞單元。我們已經提到過 lowercasestop 詞過濾器 ,但是在 Elasticsearch 裏面還有很多可供選擇的詞單元過濾器。 詞幹過濾器 把單詞 遏制 爲 詞幹。 ascii_folding 過濾器移除變音符,把一個像 “très” 這樣的詞轉換爲 “tres” 。 ngramedge_ngram 詞單元過濾器 可以產生 適合用於部分匹配或者自動補全的詞單元。
首先,我們需要解釋一下怎樣創建自定義的分析器:
創建一個自定義分析器
和我們之前配置 es_std 分析器一樣,我們可以在 analysis 下的相應位置設置字符過濾器、分詞器和詞單元過濾器:

PUT /my_index
{
    "settings": {
        "analysis": {
            "char_filter": { ... custom character filters ... },
            "tokenizer":   { ...    custom tokenizers     ... },
            "filter":      { ...   custom token filters   ... },
            "analyzer":    { ...    custom analyzers      ... }
        }
    }
}

作爲示範,讓我們一起來創建一個自定義分析器吧,這個分析器可以做到下面的這些事:

使用 html清除 字符過濾器移除HTML部分。
使用一個自定義的 映射 字符過濾器把 & 替換爲 " and " :

"char_filter": {
    "&_to_and": {
        "type":       "mapping",
        "mappings": [ "&=> and "]
    }
}

使用 標準 分詞器分詞。
小寫詞條,使用 小寫 詞過濾器處理。
使用自定義stop過濾器移除自定義的stopwords列表中包含的詞:

"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",
                    "mappings": [ "&=> and "]
            }},
            "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" ]
            }}
}}}

索引被創建以後,使用 analyze API 來 測試這個新的分析器:

GET /my_index/_analyze?analyzer=my_analyzer
The quick & brown fox

下面的縮略結果展示出我們的分析器正在正確地運行:

{
  "tokens" : [
      { "token" :   "quick",    "position" : 2 },
      { "token" :   "and",      "position" : 3 },
      { "token" :   "brown",    "position" : 4 },
      { "token" :   "fox",      "position" : 5 }
    ]
}

這個分析器現在是沒有多大用處的,除非我們告訴 Elasticsearch在哪裏用上它。我們可以像下面這樣把這個分析器應用在一個 string 字段上:

PUT /my_index/_mapping/my_type
{
    "properties": {
        "title": {
            "type":      "string",
            "analyzer":  "my_analyzer"
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章