欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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