Elasticsearch中的映射方式—簡潔版教程

1_3-6A9nJFXMmU34IEaDc4dg.png個人個人Elasticsearch系列文章,逐漸更新中,歡迎關注
0A.關於Elasticsearch及實例應用
00.Solr與ElasticSearch對比
01.ElasticSearch能作什麼?
02.Elastic Stack功能介紹
03.如何安裝與設置Elasticsearch API
04.若是經過elasticsearch的head插件創建索引_CRUD操做
05.Elasticsearch多個實例和head plugin使用介紹
06.當Elasticsearch進行文檔索引時,它是如何工做的?
07.Elasticsearch中的映射方式—簡潔版教程數據庫

另外對於入門小白,我強烈推薦這篇Elasticsearch手把手搭建指南給你,新手碰到的坑,這裏都已經寫了答案。segmentfault

介紹
在這個簡短的博客中,我將解釋Elasticsearch中的映射以及一些常見的有用最佳實踐。在本系列博客後面的Elasticsearch中學習分析/分析器時,對映射有一個很好的瞭解將很方便。
映射
映射不過是Elasticsearch中文檔的架構。正如我以前在階段01的博客之一中提到的那樣,Elasticsearch的架構較少。這意味着,與其餘數據庫(例如MongoDb或MySql)不一樣,在將文檔索引到Elasticsearch以前,無需預約義文檔的架構。那麼這是如何工做的呢?簡而言之,Elasticsearch具備檢測文檔字段類型並生成模式並將其應用於整個索引的內置功能。固然,這裏有一些事情要注意,可是咱們稍後會在本博客中再次討論。首先讓咱們看看在索引示例文檔時映射是如何存在的。
步驟1
建立沒有任何文檔的索引。架構

curl -XPUT localhost:9200/testindex-0202

對於上面的命令,咱們將獲得如下響應:app

{
  「acknowledged」: true,
  」shards_acknowledged」: true,
  」index」: 」testindex-0202"
}

如今,讓咱們經過使用以下所示的「獲取映射」 API來查看是否對其應用了任何映射:curl

curl -XGET localhost:9200/testindex-0202/_mapping

上面的命令將致使如下響應:elasticsearch

{
  「testindex-0202」: {
    「mappings」: {
    }
  }
}

從響應中能夠看到,「映射」部分爲空,這意味着在此階段沒有應用任何映射。學習

第2步
如今將文檔索引到建立的索引,以下所示:測試

curl -XPUT localhost:9200/testindex-0202/testtype/1 — d ‘{
 「name」: 」ArunPMohan」,
 」age」: 31,
 」married」: true
}’

如您在上面的文檔中看到的,我有三個字段,字段的類型是字符串(對於「名稱」字段),整數(對於「年齡」字段)和布爾值(對於「已婚」字段)。當咱們鍵入此命令時,它不會致使任何錯誤,這僅表示Elasticsearch已自動檢測到字段類型。上面的用於爲文檔創建索引的命令從Elasticsearch產生如下輸出:url

{
  「_index」: 」testindex-0202",」_type」:」testtype」,」_id」:」1",
  」_version」: 1,
  」result」: 」created」,
  」_shards」: {
    「total」: 2,
    」successful」: 1,
    」failed」: 0
  },
  」created」: true
}

如今,在建立文檔以後,咱們可使用「 GET mapping」 API來查看映射更改。所以,應用如下命令:spa

curl -XGET localhost:9200/testindex-0202/_mapping

響應以下所示:

{
  「testindex-0202」: {
    「mappings」: {
      「testtype」: {
        「properties」: {
          「age」: {
            「type」: 「long」
          },
          「married」: {
            「type」: 「boolean」
          },
          「name」: {
            「type」: 「text」,
            「fields」: {
              「keyword」: {
                「type」: 「keyword」,
                「ignore_above」: 256
              }
            }
          }
        }
      }
    }
  }
}

在上述回覆中,請注意「映射」部分。這裏,映射下的第一個對象是「 testtype」。「 testtype」指示索引的類型。在「測試類型」下方,咱們有「屬性」對象,該對象保存字段及其類型的列表。您能夠看到「年齡」字段的類型爲「長」,「已婚」字段的類型爲「布爾」,「名稱」字段的類型爲「文本」。「文本」類型表示字段爲「字符串」類型。在名稱字段下,咱們還有另外一個部分稱爲「字段」。在之後的博客中,咱們將看到更多關於「字段」部分的信息,如今,它默認包含字符串/文本字段就足夠了。

關於Mappings的認識
讓咱們看一下一些重要的事情,這些事情將有助於咱們更多地瞭解映射。

1.更新映射。
在Elasticsearch中,會有多種類型,每種類型都有本身的映射。一旦爲一個類型下的字段數生成了映射,就不能修改它。就是說,若是一個文檔包含10個字段,則會生成10個映射,而咱們之後將沒法對其進行修改。若是咱們要修改它,咱們須要刪除索引,而後手動應用修改後的映射,而後爲數據從新索引。
這裏要注意的另外一重要事情是,若是咱們嘗試修改現有映射,則上述狀況是正確的,可是對於新字段,咱們可以更新映射。也就是說,若是咱們在文檔之間添加第11個字段,則映射將相應地自動更新。爲了使事情更加清楚,讓咱們將新文檔索引到「 testindex-0202」。在新文檔的此處,除了「姓名」,「年齡」和「已婚」字段外,咱們還包括一個稱爲「國家」的新字段。讓咱們像下面這樣作:

curl -XPUT localhost:9200/testindex-0202/testtype/2 -d ‘{
 「name」: 」AlexJohn」,
 」age」: 32,
 」married」: true,
 」country」: 」Italy」
}’

如今像咱們以前同樣操做GET映射API。在結果中,您能夠看到還有一個名爲「國家」的字段。
2.常見錯誤
處理映射時,最多見的錯誤之一是更改字段的現有類型。讓咱們本身看看這個錯誤,並加深瞭解。

testindex-0202

到目前爲止,在索引「 」中,咱們已經索引了2個文檔。兩個文檔的「年齡」字段具備相同的類型,且類型爲「長」。如今,讓咱們嘗試爲文檔編制索引,以下所示:

curl -XPUT localhost:9200/testindex-0202/testtype/3 -d ‘{
 「name」: 」LexaMathew」,
 」age」: 」twenty」,
 」married」: false,
 」country」: 」Italy」
}’

請注意,這裏的年齡以字符串類型給出,表示它是一個字符串字段。上述要求的迴應以下:

{
  「error」: {
    「root_cause」: [
      {
        「type」: 」mapper_parsing_exception」,
        」reason」: 」failedtoparse[
          age
        ]」
      }
    ],
    」type」: 」mapper_parsing_exception」,
    」reason」: 」failedtoparse[
      age
    ]」,
    」caused_by」: {
      「type」: 」number_format_exception」,
      」reason」: 」Forinputstring: \」twenty\」」
    }
  },
  」status」: 400
}

在以上響應中,咱們能夠

mapper_parsing_exception

在「年齡」字段中看到錯誤「 」。這代表此處的指望字段是另外一種類型,而不是字符串。在這種狀況下,請使用適當的類型爲文檔從新編制索引或檢查數據,以查看是否有任何數據修改須要進行並相應地更改數據格式/映射。
3.應用自定義映射
到目前爲止,咱們已經看到了映射的自動生成,即映射僅由elasticsearch生成。如今,最多見的用例是應用咱們本身的映射。這能夠經過在Elasticsearch中使用PUT映射API來完成,以下所示:
首先建立一個名稱爲「 testindex-0202a」 的索引

curl -XPUT localhost:9200/testindex-0202a

如今,使用以下所示的PUT映射API:

curl -XPUT localhost:9200/testindex-0202a/_mapping/testtype -d ‘{
  「properties」: {
    「name」: {
      「type」: 」text」
    }
  }
}’

這將建立一個以「名稱」做爲字符串/文本字段的映射。如今,索引爲「 testindex-0202a」和類型爲「 testtype」的任何文檔都應具備「文本」類型的「名稱」字段。

4.應用映射的最佳實踐
實際上,發生的事情是字段的數據類型可能在不一樣的時間點發生變化。所以,須要兩次迭代才能肯定文檔字段的結構/類型。所以,咱們可能須要不斷更改索引的數據類型/結構或映射。一般建議的作法是建立一個Shell腳本,該腳本將首先刪除現有索引,而後將映射應用於該索引。這種作法的優勢是,刪除現有索引而後經過建立新索引來修改映射將很是容易,從而爲咱們節省了大量時間。

結論在此博客中,咱們介紹了Elasticsearch映射的基礎知識,例如Elasticsearch映射的應用,一些最佳實踐以及如何將自定義映射應用於Elasticsearch索引。在接下來的博客中,咱們將詳細介紹Elasticsearch分析和分析器。

相關文章
相關標籤/搜索