目录
安装Elasticsearch
(elasticsearch中文发行版,针对中文集成了相关插件,方便新手学习测试。)
这里是github上的链接,可以使用git工具clone,或者直接下载zip,解压后的文件夹名称应该是elasticsearch-rtf-master
,cd进去,执行bin里面的elasticsearch文件,windows用户应该是.bat文件,直接双击运行。
输出本地服务端口信息(127.0.0.1:9200)等信息,表示启动成功
安装Elasticsearch-head
这里是github的链接
- (下载后,解压进入文件夹中)
cd elasticsearch-head
- (安装cnpm,淘宝的镜像,加速执行过程)
npm install cnpm
cnpm install
cnpm run start
安装kibana
我们去elasticsearch官网下载对应版本操作系统的kibana,kibana的版本号要和你的elasticsearch版本一致,并不一定是首页(最新版本)的那个,可以到历史发布文件里查找。下载后,进入到bin文件夹,执行kibana.bat。
安装Elasticsearch-dsl
pip install elasticsearch-dsl
项目的根路径建立models文件夹,新建es_type.py文件夹,我们在里面定义文章的类型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
#!/usr/bin/env python # -*- coding: utf-8 -*- # 引入elasticsearch的类型,DocType必须引入 from elasticsearch_dsl import DocType,Nested,Date,Boolean,analyzer,Completion,Text,Keyword,Integer #连接到elasticsearch服务器 from elasticsearch_dsl.connections import connections connections.create_connection(hosts=["localhost"]) # 定义字段 # 一定要继承DocType #伯乐在线文章类型 class ArticleType(DocType): # 字段的类型属性保存, title = Text(analyzer="ik_max_word") # ES的text类型,并设置字段的analyzer属性 url = Keyword() # 指定index与type class Meta: index = "jobbole" doc_type = "articletest" # 自动生成mapping if __name__ == "__main__": ArticleType.init() |
python连接elasticsearch报IllegalOperation异常
用python连接es数据库,结果报错如下:
elasticsearch_dsl.exceptions.IllegalOperation: Index object cannot have multiple types, doc already set, trying to assign article.
这里是因为版本不匹配的问题
查看es版本方法如下:
查看elasticsearch包与elasticsearch-dsl版本方法(pip list
)如下:
因为我的es是5.1.1的版本,对应的python包应该也是5.x的。先通过pip uninstall xxx卸载对应的包,然后指定版本安装:pip install elasticsearch==5.2
和 pip install elasticsearch-dsl==5.1
再运行代码就可以了
执行es_type.py,我们发现jobbole Index(数据库)已经创建好了
我们通过类初始化很容易的写入了元数据(mapping信息)
接下来我们在pipeline.py中创建一个pipeline来做数据的填充
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
# elasticsearch提供了数据转换python接口包elasticsearch-dsl # 导入我们定义好的elasticsearch数据模型 from models.es_types import ArticleType # 将数据写入到es中 class ElasticsearchPipeline(object): # 将item转换为es的数据 def process_item(self,item,spider): # 实例化自定义的elasticsearch数据模型 article = ArticleType() # 把item一一对应到 自定义的elasticsearch数据模型 article.title = item['title'] article.url = item['url'] # 数据保存到elasticsearch article.save() # 返回item,继续处理下一个item return item |
当然,不要忘了将我们的pipeline添加到settings.py文件中:
1 2 3 |
ITEM_PIPELINES = { 'ArticleSpider.pipelines.ElasticsearchPipeline':1 } |
将es数据转换,放到item里
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
# 导入我们定义好的elasticsearch数据模型 from models.es_types import ArticleType class JobBoleArticleItem(scrapy.Item): title = scrapy.Field() #类型只有scrapy提供Field url = scrapy.Field() url_object_id = scrapy.Field() #url的md5值 font_image_url = scrapy.Field() #封面图URL font_image_path = scrapy.Field() #下载封面图存储路径 def save_to_es(self): # 实例化自定义的elasticsearch数据模型 article = ArticleType() # 把item一一对应到 自定义的elasticsearch数据模型 article.title = self['title'] article.url = self['url'] # 数据保存到elasticsearch article.save() return |
pipelines.py,中可以从item直接转换数据:
1 2 3 4 5 6 7 8 |
# 将数据写入到es中 class ElasticsearchPipeline(object): # 将item转换为es的数据 def process_item(self,item,spider): item.save_to_es(); # 返回item,继续处理下一个item return item |