1. 程式人生 > >[Elasticsearch] 索引管理 (一)

[Elasticsearch] 索引管理 (一)

索引管理

我們已經瞭解了ES是如何在不需要任何複雜的計劃和安裝就能讓我們很容易地開始開發一個新的應用的。但是,用不了多久你就會想要仔細調整索引和搜尋過程來更好的適配你的用例。

幾乎所有的定製都和索引(Index)以及其中的型別(Type)相關。本章我們就來討論用於管理索引和型別對映的API,以及最重要的設定。

建立索引

到現在為止,我們已經通過索引一份文件來完成了新索引的建立。這個索引是使用預設的設定建立的,新的域通過動態對映(Dynamic Mapping)的方式被新增到了型別對映(Type Mapping)中。

現在我們對這個過程擁有更多的控制:我們需要確保索引被建立時擁有合適數量的主分片(Primary Shard),並且在索引任何資料之前,我們需要設定好解析器(Analyzers)以及對映(Mappings)。

因此我們需要手動地去建立索引,將任何需要的設定和型別對映傳入到請求正文中,就像下面這樣:

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

事實上,如果你想阻止索引被自動建立,可以通過新增下面的設定到每個節點的config/elasticsearch.yml檔案中:

action.auto_create_index: false

將來,我們會討論如何使用索引模板(Index Template)

來預先定義自動生成的索引。這個功能在索引日誌資料的時候有用武之地:索引的名字中會包含日期,每天都有一個有著合適配置的索引被自動地生成。


刪除索引

使用下面的請求完成索引的刪除:

DELETE /my_index

你也可以刪除多個索引:

DELETE /index_one,index_two
DELETE /index_*

你甚至還可以刪除所有的索引:

DELETE /_all

索引設定

雖然索引的種種行為可以通過索引模組的參考文件介紹的那樣進行配置,但是……

TIP

ES中提供了一些很好的預設值,只有當你知道它是幹什麼的,以及為什麼要去修改它的時候再去修改。

兩個最重要的設定:

number_of_shards

一個索引中含有的主分片(Primary Shard)的數量,預設值是5。在索引建立後這個值是不能被更改的。

number_of_replicas

每一個主分片關聯的副本分片(Replica Shard)的數量,預設值是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
}

配置解析器

第三個重要的索引設定就是解析(Analysis),可以利用已經存在的解析器(Analyzer)進行配置,或者是為你的索引定製新的解析器。

解析和解析器中,我們介紹了一些內建的解析器,它們用來將全文字串轉換成適合搜尋的倒排索引(Inverted Index)。

對於全文字串欄位預設使用的是standard解析器,它對於多數西方語言而言是一個不錯的選擇。它包括:

  • standard分詞器。它根據詞語的邊界進行分詞。
  • standard token過濾器。用來整理上一步分詞器得到的tokens,但是目前是一個空操作(no-op)。
  • lowercase token過濾器。將所有tokens轉換為小寫。
  • stop token過濾器。移除所有的stopwords,比如a,the,and,is等

預設下stopwords過濾器沒有被使用。可以通過建立一個基於standard解析器的解析器並設定stopwords引數來啟用。要麼提供一個stopwords的列表或者告訴它使用針對某種語言預先定義的stopwords列表。

在下面的例子中,我們建立了一個名為es_std的解析器,它使用了預先定義的西班牙語中的stopwords列表:

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
}

下面的部分結果顯示了西班牙語中的stopword El已經被正確地移除了:

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