在此统一解答es5提升到es7后的诸多问题,只是个人一点心得

来源:15-2 es完成搜索建议-搜索建议字段保存 - 2

大话CSS

2020-06-11

第一:定义ArticleType,es7已经废除doc_type这个属性,所以大家无需在问如何设置doc_type,官方的解答是一个index里面只允许一个type,也就是默认的_doc,此时index已经成了旧版本的type,你可以这样理解,index成了表,额而且继承的也不再是doc_type,而是document。代码如下:

class ArticleType(Document):
    """
    Cnblogs
    """
    # 增加自动补全功能
    suggest = Completion(analyzer="ik_max_word")
    title = Text(analyzer="ik_max_word")
    create_date = Date()
    url = Keyword()
    # url太多太长,用md5加密的方式缩短
    url_object_id = Keyword()
    front_image_url = Keyword()
    front_image_path = Keyword()
    digg_nums = Integer()
    comment_nums = Integer()
    fav_nums = Integer()
    tags = Text(analyzer="ik_max_word")
    content = Text(analyzer="ik_max_word")

    class Index:
        name = 'blog'
        下面可以添加settings进行副本和分片操作,具体参考官方文档
     

第二: item里面es的连接问题
es = connections.create_connection(ArticleType._get_connection()),大家可以追下源码,可以看到
ArticleType----->Document,在Document下面有三个类方法,代码如下:

    @classmethod
    def _get_using(cls, using=None):
        return using or cls._index._using

    @classmethod
    def _get_connection(cls, using=None):
        return get_connection(cls._get_using(using))

    @classmethod
    def _default_index(cls, index=None):
        return index or cls._index._name

对比bobby老师曾经代码:

es = connections.create_connection(ArticleType._doc_type.using)

个人感觉这句话只是起到建立连接的作用,也许里面直接hosts也是可行的,测试其实是可以的,但可能会有隐患,我们对比三个类方法,可以看出,_get_connection明显是获取连接的意思,而且里面也调用了_get_using(using),所以我大胆假设,小心求证,得出以下结论:

es = connections.create_connection(ArticleType._get_connection())

测试后可行,但是我并没有通读所有源码,只是个人看法

第三:对比bobby老师与我的代码

es.indices.analyze(index=index, body={"analyzer": "ik_max_word", "text": text}, params={'filter' : ["lowercase"]})

words = es.indices.analyze(index=index, analyzer="ik_max_word", params={'filter':["lowercase"]}, body=text)

大家可以明显看出,差异出现在body上面,修改,但是这里有一个小问题一直没解决,也就是filter,总是出现filter_path的错误提示,我个人怀疑,已经没有filter这个函数了,找了挺多资料,不清楚params里面究竟如何写,但一定是可以大小写设置的,这里大家可以留言

第四:

gen_suggests(ArticleType._doc_type.index, ((article.title,10),(article.tags, 7)))

gen_suggests(ArticleType._default_index(), ((article.title, 10), (article.tags, 7)))

这里明显可以看出是想拿到index的名字,还是那三个类方法,_default_index()可以拿到,测试通过

最终在取消params里面filter后,数据成功存入es

图片描述

希望大家可以一直使用最新版本,师傅领进门,修行靠个人。解决问题,也是一种学习,个人对比过诸多爬虫课程,bobby老师无疑是其中的佼佼者,感谢分享。

写回答

1回答

大话CSS

提问者

2020-06-11

补充内容:更正SearchSuggest

旧版本

suggestions = s.execute_suggest()

for match in suggestions.my_suggest[0].options:

新版本

suggestions = s.execute()
for match in suggestions.suggest["my_suggest"][0].options:

0
1
bobby
赞一个。
2020-06-12
共1条回复

Scrapy打造搜索引擎 畅销4年的Python分布式爬虫课

带你彻底掌握Scrapy,用Django+Elasticsearch搭建搜索引擎

5796 学习 · 6290 问题

查看课程