ElasticSearch数据导入和搜索的流程简析
2017-07-22 本文已影响573人
红薯爱帅
数据导入流程
1,原始数据
以Mysql为例,就是一个数据表,表结构如下:
CREATE TABLE `twitter_tweet` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`tweet_id` varchar(200) DEFAULT NULL,
`user_id` varchar(200) CHARACTER SET utf8 DEFAULT NULL,
`user_screen_name` varchar(200) CHARACTER SET utf8 DEFAULT NULL,
`tweet` longtext CHARACTER SET utf8,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;
2,创建映射
- ES支持多种数据类型,例如text, keyword, date, long, double, boolean, ip,在创建mapping的时候需要指定每一个field的类型以及对应的分析器。
- 其中,有一些数据类型不支持分析器,例如keyword, date, long, double等,text(V5版本以上,V2等低版本是string)支持分析器。
"mappings": {
"user": {
"properties": {
"friends_count": {
"type": "integer"
},
"user_created_at": {
"format": "yyyy-MM-dd HH:mm:ss||strict_date_optional_time||epoch_millis",
"type": "date"
},
"user_name": {
"analyzer": "st_chinese",
"type": "text"
},
"user_screen_name": {
"analyzer": "st_chinese",
"type": "text"
},
"favourites_count": {
"type": "integer"
},
"description": {
"analyzer": "st_chinese",
"type": "text"
},
"type": {
"type": "keyword"
},
"is_protected": {
"type": "short"
}
}
}
}
3,分析器
- 在创建mapping的同时,需要声明分析器,例如中文简繁体、英语时态切词等。
- 如下图,有两个样例,不同分析器对原始的切词效果不一样,也直接影响存储的大小,影响查询的效率。
4,倒排索引
- 一个倒排索引由文档中,所有不重复词的词条构成,对于其中每个词,有一个包含它的文档列表,如下图所示。
- 根据分析器得到的结果,生成倒排索引,倒排索引的存储格式如下图所示。
数据搜索流程
1,分析器
- 通过搜索词语所在字段指定的分析器,对搜索词语进行切词。
2,倒排索引
- 通过倒排索引,匹配相关性,按照相关性返回对应的document列表,完成搜索。