1. 程式人生 > >ES創建mapping時字段別名

ES創建mapping時字段別名

query ext rep repl 內容 image ppi keyword index

ES默認是動態創建索引和索引類型的mapping的,但是在學習的時候還能這樣用,在生產中一定是手動制定mapping!在生產中經常會遇到這樣的需求,想用某個字段進行統計,又想對該字段進行模糊查詢,解決這種需求的方法就是對該字段創建別名!

mapping結構如下:

 1 {
 2     "settings" : {
 3         "index" : {
 4             "analysis" : {
 5                 "filter" : {
 6                     "english_keywords" : {
7 "type" : "keyword_marker", 8 "keywords" : [ 9 "topsec" 10 ] 11 }, 12 "english_stemmer" : { 13 "type" : "stemmer", 14 "language" : "english" 15
}, 16 "english_possessive_stemmer" : { 17 "type" : "stemmer", 18 "language" : "possessive_english" 19 }, 20 "english_stop" : { 21 "type" : "stop", 22
"stopwords" : "_english_" 23 } 24 }, 25 "analyzer" : { 26 "default" : { 27 "tokenizer" : "keyword" 28 }, 29 "english" : { 30 "type" : "custom", 31 "filter" : [ 32 "lowercase", 33 "english_stop" 34 ], 35 "tokenizer" : "standard" 36 }, 37 "ik" : { 38 "filter" : ["lowercase"], 39 "type" : "custom", 40 "tokenizer" : "ik_max_word" 41 }, 42 "html" : { 43 "filter" : [ 44 "lowercase", 45 "english_stop" 46 ], 47 "char_filter" : [ 48 "html_strip" 49 ], 50 "type" : "custom", 51 "tokenizer" : "standard" 52 }, 53 "lower" : { 54 "filter" : "lowercase", 55 "type" : "custom", 56 "tokenizer" : "keyword" 57 } 58 } 59 }, 60 "number_of_shards" : "1", 61 "number_of_replicas" : "0" 62 } 63 }, 64 "mappings" : { 65 "test" : { 66 "_all" : { 67 "enabled" : false 68 }, 69 "properties" : { 70 "name" : { 71 "type" : "keyword" 72 }, 73 "age" : { 74 "type" : "keyword", 75 "fields" : { 76 "cn" : { 77 "analyzer" : "ik", 78 "type" : "text" 79 } 80 } 81 }, 82 83 "address" : { 84 "type" : "text" 85 } 86 } 87 } 88 } 89 }

字段age的"type" : "keyword",不分詞,然後起個別名cn,對它使用ik分詞器進行分詞!插入四條數據

技術分享圖片

用age字段對數據進行統計的時候,需要用不分詞的age,並且需要使用全匹配規則,語句:

 1 {
 2   "query": {
 3     "bool": {
 4       "must": [
 5         {
 6           "term": {
 7             "age": "北京市海澱區西二旗中關村西門"
 8           }
 9         }
10       ],
11       "must_not": [],
12       "should": []
13     }
14   },
15   "from": 0,
16   "size": 10,
17   "sort": [],
18   "aggs": {}
19 }

結果:

技術分享圖片

使用age的分詞age.cn進行統計是有問題的,運行的結果說明對age的別名age.cn進行分詞,查詢條件必須匹配分詞器對age的內容進行分詞的結果進行匹配,

 1 {
 2   "query": {
 3     "bool": {
 4       "must": [
 5         {
 6           "term": {
 7             "age.cn": "北京市海澱區西二旗中關村西門"
 8           }
 9         }
10       ],
11       "must_not": [],
12       "should": []
13     }
14   },
15   "from": 0,
16   "size": 10,
17   "sort": [],
18   "aggs": {}
19 }

結果:

技術分享圖片

 1 {
 2   "query": {
 3     "bool": {
 4       "must": [
 5         {
 6           "term": {
 7             "age.cn": "北京市"
 8           }
 9         }
10       ],
11       "must_not": [],
12       "should": []
13     }
14   },
15   "from": 0,
16   "size": 10,
17   "sort": [],
18   "aggs": {}
19 }

結果:

技術分享圖片

如果使用match來統計的話也會有問題,會把不正確的數據也統計出來,使用 match進行統計會把查詢條件與內容進行匹配,根據匹配度進行打分,分數高的說明匹配度高,會排在上面

 1 {
 2   "query": {
 3     "bool": {
 4       "must": [
 5         {
 6           "match": {
 7             "age.cn": "北京市海澱區西二旗中關村"
 8           }
 9         }
10       ],
11       "must_not": [],
12       "should": []
13     }
14   },
15   "from": 0,
16   "size": 10,
17   "sort": [],
18   "aggs": {}
19 }

結果:

技術分享圖片

下面就是按匹配度打分排名的結果

 1 {
 2   "query": {
 3     "bool": {
 4       "must": [
 5         {
 6           "match": {
 7             "age.cn": "北京市昌平區"
 8           }
 9         }
10       ],
11       "must_not": [],
12       "should": []
13     }
14   },
15   "from": 0,
16   "size": 10,
17   "sort": [],
18   "aggs": {}
19 }

結果:

技術分享圖片

總結:統計就用term,不分詞,全匹配;模糊查詢就用match,分詞,不用全匹配!

若有不正之處,請諒解和批評指正,不勝感激!!!!!歡迎大家留言討論!!!

ES創建mapping時字段別名