Elasticsearch【mappings】類型配置操作


在介紹ES的更新操作的時候,說過,ES的索引創建是很簡單的,沒有必要多說,這里是有個前提的,簡單是建立在ES默認的配置基礎之上的。

 

比如,當ES安裝完畢后,我們就可以通過curl命令完成index,type以及文檔的創建。這些創建過程,都是建立在ES的默認配置上的,這里主要說的配置指的是ES的分析器以及數據字段類型。ES的強大之處在於,我們向文檔添加字段時,可以不用指定各個field的數據類型,也不用配置這些field在搜索的時候,采用什么analyzer進行分詞(ES默認采用的是standard analyzer)。

 

在進行本博文案例分析前,有必要說下,ES支持的數據類型:

  • 簡單數據類型: string, date, long, double,integer,boolean 以及ip等等
  • 層級結構類型:JSON型的object,嵌套類型 (都是JSON)
  • 特殊結構類型:geo_point, geo_shape以及completion。

這些數據類型,可以在創建索引的時候,指定。在此,需要講解一下mapping的含義,按照官方的文檔描述:

1 Mapping is the process of defining how a document, and the fields it contains, are stored and indexed. For instance, use mappings to define:
2 
3 > which string fields should be treated as full text fields.
4 > which fields contain numbers, dates, or geolocations.
5 > whether the values of all fields in the document should be indexed into the catch-all _all field.
6 > the format of date values.
7 > custom rules to control the mapping for dynamically added fields.

也就是說,這個mapping有點類似我們定義MySQL的數據庫表結構的時候,需要指定每個字段的名字,其數據類型一樣。當然,這個定義過程,也指明了這個表結構一共含有多少個字段了。對於ES而言,就相當於指定了一個document有多少field,每個field的數據類型,注意,這個比MySQL定義表過程,還多了一個有用的操作,就是指定每個字段可用的分析器(analyzer). 當然,不指定的話,就是采用默認的standard analyzer,當然你也可以指定某個字段不需要分析器(not_analyzed).

 

下面,再來說說分析器analyzer。

ES系統默認提供了很多的分析器,最著名的是standard analyzer。另外,還有下面的一些分析器,這些分析器,可以進入官網進行深入研究。

這些分析器中,重點在於如何對待搜索的目標進行分詞(token)。

 

下面,將通過一個簡單的例子,來說說mapping的操作,以及基於standard analyzer自定義一個自己的分析器csh_analyaer:

 1 [root@localhost ~]# curl -XPUT "localhost:9210/test" -d '
 2 {
 3   "settings": {
 4 >    "analysis": {
 5 >       "analyzer": {                         #配置分析器  6 >          "csh_analyzer": {                  #分析器的名字是csh_analyer,這個是系統沒有的,我自己定義的一個,可以取一個不和已有的分析器重名的名字  7 >              "type": "standard",            #這個分析器的類型是基於系統自帶的標准的standard分析器  8 >              "stopwords": "_english_"       #禁用詞,或者說無效詞范圍定義來自_english_列表
 9 >          }
10 >       }
11 >    }
12 >  },
13 >  "mappings": {
14 >     "user": {                              #定義test索引下的一個type為user 15 >        "properties": {                     #開始定義這個type的屬性值(也可以用fields) 16 >           "first_name": {                  #字段名為first_name 17 >              "type": "string",             #數據類型為string 18 >              "analyzer": "standard"       #分析器用系統默認的standard
19 >           },
20 >           "last_name": {                   #字段名字為last_name 21 >               "type": "string",            #字段類型為string 22 >               "analyzer": "csh_analyzer"   #分析器為自定義的csh_analyzer
23 >           },
24 >           "job": {                         #字段名字為job 25 >               "type": "string",            #字段類型 26 >               "analyzer": "csh_analyzer"   #分析器為自定義的csh_analyzer
27 >           }
28 >        }
29 >      }
30 >   }
31 > }'

獲取索引的mapping信息:

 1 [root@localhost ~]# curl "localhost:9210/test/?mappings&pretty"
 2 {
 3   "test" : {
 4     "aliases" : { },
 5     "mappings" : {
 6       "user" : {
 7         "properties" : {
 8           "first_name" : {
 9             "type" : "string",
10             "analyzer" : "standard"
11           },
12           "job" : {
13             "type" : "string",
14             "analyzer" : "csh_analyzer"
15           },
16           "last_name" : {
17             "type" : "string",
18             "analyzer" : "csh_analyzer"
19           }
20         }
21       }
22     },
23     "settings" : {
24       "index" : {
25         "creation_date" : "1477538406319",
26         "uuid" : "czFz6sMzQHSKcvEb4o_yYg",
27         "analysis" : {
28           "analyzer" : {
29             "csh_analyzer" : {
30               "type" : "standard",
31               "stopwords" : "_english_"
32             }
33           }
34         },
35         "number_of_replicas" : "1",
36         "number_of_shards" : "5",
37         "version" : {
38           "created" : "2040199"
39         }
40       }
41     },
42     "warmers" : { }
43   }
44 }

 

現在,是不是有個疑問,這個mapping或者說里面的settings有什么用呢,其實,主要是在搜索的時候,ES系統內部自己用的。我們不給index指定mapping或不進行settings設置,其實在很多時候也工作的很好。但是,對於操作的數據對象,我們自己了解的信息一定不會比ES系統猜測的信息全和准確。所以,我們自己在工程應用中,最好還是要自己給自己的索引做settings和mappings的設置

 

看一下例子,針對上面我們建立的索引test,進行測試,看看字段在分詞的時候,是不是我們想要的結果:

 1 [root@localhost ~]# curl -XPOST "localhost:9210/test/_analyze?pretty" -d '{
 2 "field": "first_name",
 3 "text": "the shihu"
 4 }'
 5 {
 6   "tokens" : [ {
 7     "token" : "the",
 8     "start_offset" : 0,
 9     "end_offset" : 3,
10     "type" : "<ALPHANUM>",
11     "position" : 0
12   }, {
13     "token" : "shihu",
14     "start_offset" : 4,
15     "end_offset" : 9,
16     "type" : "<ALPHANUM>",
17     "position" : 1
18   } ]
19 }

看到沒,上面操作的數據,field是first_name,分析的字符串text為"the shihu", 最后得到的結果是兩個分詞(token),一個是the,一個是shihu。還記得么,first_name對應的analyzer是standard。而standard分析器分詞的依據之一就是把目標內容拆分成一個個的單詞,分割器可以是空格,逗號等標點符號,請求看官方文檔Standard Analyzer

 

再看另外一個測試例子:

 1 [root@localhost ~]# curl -XPOST "localhost:9210/test/_analyze?pretty" -d '{
 2 "field": "last_name",
 3 "text": "the shihu"
 4 }'
 5 {
 6   "tokens" : [ {
 7     "token" : "shihu",
 8     "start_offset" : 4,
 9     "end_offset" : 9,
10     "type" : "<ALPHANUM>",
11     "position" : 1
12   } ]
13 }

這個操作中的field是last_name,分析的字符串依然是“the shihu”,但是最后看到的結果中只有一個token,只有shihu,沒有了the這個詞。區別在於這個last_name的analyzer是用的自定義的csh_analyzer,而這個是基於standard的自定義分析器,stopwords改成了_english_,這個里面應該是包含了the這種英文分詞常見的詞,這個詞是大概率出現的詞,按照信息論的概念,信息量與概率的大小成反比,所以the這種大概率的詞含有很小的信息量,通常不作為搜索返回結果,所以在分詞列表中去掉了

 

到此,ES的mappings相關的介紹,就拋磚結束了,其間順便也講解了點分析器,希望對理解ES工作原理的伙伴有點幫助!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM