ES搭建、python操作ES、开发异常处理
程序员文章站
2022-07-05 18:15:27
...
python~ES文档
https://pypi.org/project/elasticsearch/
一、本地ES搭建、安装Elasticsearch
~ 安装elasticsearch-rtf # elasticsearch中文发行版,针对中文集成了相关插件,方便新手学习测试
~ 这里是github上的链接、执行bin里面的elasticsearch文件,windows用户应该是.bat文件,直接双击运行
~ 输出本地服务端口信息(127.0.0.1:9200)等信息,表示启动成功
二、安装Elasticsearch-head
~ 是谷歌浏览器的扩展应用,可在谷歌应用商店中查找安装,用来ES可视化
三、python 相关模块安装
~ pip install elasticsearch==5.2
~ pip install elasticsearch-dsl==5.1
~安装Elasticsearch-dsl插件,此插件是对原生的elasticsearch的高级封装,
~简化了elasticsearch的操作,可以基于此建立与本地elasticsearch服务器的连接
四、创建表结构
from elasticsearch_dsl import DocType,Nested,Date,Boolean,analyzer,Completion,Text,Keyword,Integer
from elasticsearch_dsl.connections import connections
# 创建服务器链接
connections.create_connection(hosts="172.25.33.184") # ES集群
# connections.create_connection(hosts="127.0.0.1") # 本地ES
# 定义数据类,继承DocType,定义各个字段数据类型,在from elasticsearch_dsl import中导入需要的数据类型,包括字符串,整型,布尔等等
class ArticleType(DocType):
# 城市 如 "北京"
city = Keyword() # Keyword 相当于String,不会分词,查询只作为一个整体
# 星级 05 五星级 04 四星级 03三星级02 两星及以下 00 无星级
type = Keyword()
# 酒店ID 格式为 OTA渠道酒店ID_渠道ID
hotel_id = Keyword()
hotel_name = Text(analyzer="ik_max_word") # Text会分词, ik_max_word最细力度的分词
hotel_address = Text(analyzer="ik_max_word")
room_num = Integer()
score = Keyword()
longitude = Keyword()
latitude = Keyword()
phone = Keyword()
search_url = Keyword()
price = Keyword()
# crawl_time = Date()
# 建立链接的index和doc,在类中建立类,必须是Meta类,用于传入index值和type(表)值
class Meta:
# 数据库名称和表名称
index = "jobbole"
doc_type = "aabbcc"
# 执行语句 创建表
if __name__ == '__main__':
# 调用init()方法建立映射(mappings)
ArticleType.init()
五、scrapy 写入ES
将数据写入到ES中
from ESTable import ArticleType
class ElasticsearchPipeline(object):
def process_item(self,item,spider):
# 将item转换为ES的数据
article = ArticleType()
article.city = item["city"] # Keyword 相当于String,不会分词,查询只作为一个整体
# 星级 05 五星级 04 四星级 03三星级02 两星及以下 00 无星级
article.type = item["type"]
# 酒店ID 格式为 OTA渠道酒店ID_渠道ID
article.hotel_id = item["ctrip_id"] + "_2"
article.hotel_name = item["search_name"] # Text会分词, ik_max_word最细力度的分词
article.hotel_address = item["search_address"]
article.room_num = int(item["room_num"])
article.score = item["score"]
article.longitude = item["longitude"]
article.latitude = item["latitude"]
article.phone = item["phone"]
article.search_url = item["search_url"]
article.price = item["price"]
article.save()
return item
附加:对异常的处理
~问题: elasticsearch_dsl.exceptions.IllegalOperation: Index object cannot have multiple types, doc already set, trying to assign article.
~根源: 这里是因为版本不匹配的问题
~解决(降低版本到5.x): pip install elasticsearch==5.2 和 pip install elasticsearch-dsl==5.1
上一篇: spring之事务管理器配置实例