ES创建mapping时字段别名

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,分词,不用全匹配!

若有不正之处,请谅解和批评指正,不胜感激!!!!!欢迎大家留言讨论!!!

时间: 2024-10-10 17:45:04

ES创建mapping时字段别名的相关文章

Spark2.2+ES6.4.2(三十二):ES API之ndex的create(创建index时设置setting,并创建index后根据avro模板动态设置index的mapping)/update/delete/open/close

要想通过ES API对es的操作,必须获取到TransportClient对象,让后根据TransportClient获取到IndicesAdminClient对象后,方可以根据IndicesAdminClient对象提供的方法对ES的index进行操作:create index,update index(update index settings,update index mapping),delete index,open index,close index. 准备工作(创建Transpor

关闭ES动态创建mapping

使用ES的默认配置会使我们在索引不存在于mapping中的字段时,会自动创建. 这无疑会给我们带来困扰. 在我们不想要某个字段被搜索的时候,我们可以在开始关闭动态创建mapping. 执行如下操作: PUT /test_xzy/_mapping/data { "dynamic":false } 然后查看mapping: GET /test_xzy/_mappings/data 得到: { "test_xzy": { "mappings": { &

MySQL 创建表时,设置时间字段自己主动插入当前时间

MySQL 创建表时,设置时间字段自己主动插入当前时间 DROP TABLE IF EXISTS `CONTENT`; CREATE TABLE `CONTENT` ( `ID` char(20) NOT NULL, `CURRENT_TIME` timestamp not null default current_timestamp, PRIMARY KEY (`ID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

MySQL 创建表时,设置时间字段自动插入当前时间

MySQL 创建表时,设置时间字段自动插入当前时间 DROP TABLE IF EXISTS `CONTENT`; CREATE TABLE `CONTENT` ( `ID` char(20) NOT NULL, `CURRENT_TIME` timestamp not null default current_timestamp, PRIMARY KEY (`ID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

sqlite3自增key设定(创建自增字段)

在用sqlite设计表时,每个表都有一个自己的整形id值作为主键,其实可以不指定这 么一个id值,sqlite内部本来就会为每个表加上一个 rowid,这个rowid可以当成一个隐含的字段使用,但是由sqlite引擎来维护的,在 3.0以前rowid是32位的整数,3.0以后是 64位的整数,为什么不直接使用这个内部的rowid作为每个表的id主键呢. 相关的文档在这里:?http://www.sqlite.org/autoinc.html?http://www.sqlite.org/faq.h

(转)mysql创建表时反引号的作用

(转)mysql创建表时反引号的作用 试用navicat工具查看现网mysql建表语句时,发现表名和字段名都是反引号引起来的 1 2 3 4 5 6 7 8 9 10 11 CREATE TABLE `tab_notice_title_tv` (   `i_id` int(11) NOT NULL AUTO_INCREMENT,   `c_opcom_key` varchar(32) DEFAULT NULL,   `c_view_type` int(11) DEFAULT '1' COMMEN

12.创建关系时的级联操作

--- 创建关系时的级联操作 alter table student with nocheck --不检查现有数据 add constraint FK_Grade_Student_GradeId foreign key(gradeid) references grade(gradeid) on delete set null --[ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ] --on--在做何种操作的时候做相应的处理

phpMyAdmin中mysql的创建数据库时的编码的问题

转载自新浪博客    Sean 一. mysql中utf8编码的utf8_bin,utf8_general_cs,utf8_general_ci的区别 utf8_general_ci 不区分大小写,这个你在注册用户名和邮箱的时候就要使用. utf8_general_cs 区分大小写,如果用户名和邮箱用这个 就会照成不良后果 utf8_bin: compare strings by the binary value of each character in the string 将字符串每个字符串

在oracle中创建自动增长字段

参考http://www.cnblogs.com/jerrmy/archive/2013/03/13/2958352.html oracle在创建表时和其他的数据库有点不一样,如SQL SERVER可以在int类型的字段后加上identity(1,1),该字段就会从1开始,按照+1的方式自增,将这个字段设置为主键,有利于我们进行数据的插入操作.MySql中可以使用"auto_increment"即可.但是oracle有点麻烦,需要使用序列和触发器达到目的. 首先我们创建一个员工表. c