在此统一解答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:012020-06-12
相似问题