es的mapping参数-fields

es的mapping参数-fields

    概要

    在es中,一个字段可能运用于不同的场景,但是某个字段类型的使用场景是有局限的

    下面,我们先来看一段es查询语句:

 1  $must = [
 2             "bool" => [
 3                 "should" => [
 4                     [
 5                         "range" => [
 6                             "user_id.raw" => [
 7                                 "gt" => 0
 8                             ]
 9                         ]
10                     ],
11                     [
12                         "bool" => [
13                             "filter" => [
14                                 [
15                                     "term" => [
16                                         'user_id' => 0
17                                     ]
18                                 ],
19                                 ...
20                             ]
21                         ]
22                     ],
23                 ],
24                 "minimum_should_match" => 1
25             ]
26         ];

 

    由上面的es查询语句可以看到,user_id用于不同的过滤规则,我们看下es索引中关于此字段的定义:

    

     Fields的作用

    在es中,一个字段可能运用于不同的场景,但是某个字段类型的使用场景是有局限的。这就是mapping参数-fields的设计用途所在。

    fields:多字段特性   让一个字段拥有多个子字段类型,使得一个字段能够被多个不同的索引方式进行索引。

    例一:

 1 PUT index_name
 2 {
 3   "mappings": {         # 设置 mappings
 4     "properties": {     # 属性,固定写法
 5       "city": {         # 字段名
 6         "type": "text", # city 字段的类型为 text
 7         "fields": {     # 多字段域,固定写法
 8           "raw": {      # 子字段名称
 9             "type":  "keyword"  # 子字段类型
10           }
11         }
12       }
13     }
14   }
15 }

   说明:fields可以让同一文本有多种不同的索引方式,比如上面所示一个String类型的字段city,可以使用text类型做全文检索,使用keyword类型做聚合和排序。   

   例二:

 1 PUT index_name
 2 {
 3   "mappings": {
 4     "properties": {
 5       "title": {               # 字段名称
 6         "type": "text",        # 字段类型
 7         "analyzer": "english", # 字段分词器
 8         "fields": {            # 多字段域,固定写法
 9           "std": {             # 子字段名称
10             "type": "text",    # 子字段类型
11             "analyzer": "standard"  # 子字段分词器
12            }
13         }
14       }
15     }
16   }
17 }

    例三:

 1 PUT index_name
 2 {
 3   "mappings": {         # 设置 mappings
 4     "properties": {     # 属性,固定写法
 5       "user_id": {         # 字段名
 6         "type": "keyword", # user_id 字段的类型为 keyword
 7         "fields": {     # 多字段域,固定写法
 8           "raw": {      # 子字段名称
 9             "type":  "integer"  # 子字段类型
10           }
11         }
12       }
13     }
14   }
15 }

   说明:fields可以让同一文本有多种不同的索引方式,比如上面所示一个String类型的字段user_id,可以使用keyword类型做聚合和排序,使用integer来做范围查询,又由于integer作为范围较小的数据类型, 字段的长度也相对较短,使用它可以提高索引和搜索的效率。

 

 

   参考链接:https://www.cnblogs.com/codeshell/p/14445420.html

 

posted @ 2022-07-31 22:37  欢乐豆123  阅读(6016)  评论(0编辑  收藏  举报