感谢您抽出宝贵的时间提前回答这个问题。我是比较新的Python的两(3.6)和嗖(2.7.4),所以请原谅我,如果我失去了一些东西明显。
我试图遵循嗖文档中的说明这里How to Search > Combining Results。不过,我真的失去了在本节:
# Get the terms searched for
termset = set()
userquery.existing_terms(termset)
当我跑我的代码,它会产生这样的错误:
“设置”对象有没有属性“模式”
什么地方出了错?
我也看了成关于这个Whoosh API的文档,但我得到了更多的困惑ixreader的作用。 (或者是index.Index.reader()?)耸了耸肩
架构
schema = Schema(uid=ID(unique=True, stored=True), # unique ID
indice=ID(stored=True, sortable=True),
title=TEXT,
author=TEXT,
body=TEXT(analyzer=LanguageAnalyzer(lang)),
hashtag=KEYWORD(lowercase=True, commas=True,
scorable=True)
)
相关的字段名是“井号标签”和“体”。主题标签是每个文档的用户选择关键词,和身体是文档中的文本。不言自明,不是吗?
搜索功能
这在很大程度上是直接从嗖文件解除。注意,DIC仅仅是包含查询字符串的字典。此外,应该注意的是,在userquery.existing_terms(termset)发生错误,因此,如果它的其余部分是骗人的鬼话,我的道歉,我还没有得到那么远。
try:
ix = index.open_dir(self.w_path, indexname=lang)
qp = QueryParser('body', schema=ix.schema)
userquery = qp.parse(dic['string'])
termset = set()
userquery.existing_terms(termset)
bbq = Or([Term('hashtag', text) for fieldname, text
in termset if fieldname == 'body'])
s = ix.searcher()
results = s.search(bbq, limit=5)
allresults = s.search(userquery, limit=10)
results.upgrade_and_extend(allresults)
for r in results:
print(r)
except Exception as e:
print('failed to search')
print(e)
return False
finally:
s.close()
我的代码的目标
我正在从不同的文件(PDF,EPUB等)的页面和存储每个页面的文本在嗖指数独立的“文件”(即场“主体”)。每个“文件”还标有一个唯一的ID(UID),让我把搜索结果和确定PDF文件所来自和页面包含搜索到的内容从“次数1.pdf第2页(例如,文档“具有UID 1.2)。换句话说,我希望给用户包含搜索词,也许点击率最高的页面页码的列表。对于每个文件,有#标签(或关键字)的唯一文件是在零(为“次数1.pdf”,即零页,例如UID 1.0)一个UID结束该文档。第零可能会或可能不会有一个“身体”太多(例如发布日期,作者姓名,摘要等)。我这样做是为了防止更多的页面一个文档是显着较高的排名从另一个与在每个“文件”(即页面),因为该关键字的多次重复的相当少的页面。
最后,我只想代码来提升并且加上了文件与文件只搜索命中正文中。我想到了刚刚助推主题标签领域,而不是,但我不知道的是,力学是什么,文件建议反对这一点。
建议和修正将不胜感激。再次感谢你!
从你的链接代码不看我的权利。它也给了我同样的错误。尝试重新安排你的代码如下:
try:
ix = index.open_dir(self.w_path, indexname=lang)
qp = QueryParser('body', schema=ix.schema)
userquery = qp.parse(dic['string'])
s = ix.searcher()
allresults = s.search(userquery, limit=10)
termset = userquery.existing_terms(s.reader())
bbq = Or([Term('hashtag', text) for fieldname, text in termset if fieldname == 'body'])
results = s.search(bbq, limit=5)
results.upgrade_and_extend(allresults)
for r in results:
print(r)
except Exception as e:
print('failed to search')
print(e)
return False
finally:
s.close()
existing_terms
需要reader
所以我首先创建searcher
并给予其reader
它。
至于提高一个领域,机制是quite simple:
schema = Schema(title=TEXT(field_boost=2.0), body=TEXT)
。
添加足够高的提升带来主题标签文档顶端并一定要在身体和#标签字段应用于单个查询。
提高或组合之间进行选择取决于你是否希望所有匹配的主题标签文档始终,绝对顶部任何其他比赛中表现出了。如果是这样,结合起来。相反,如果你喜欢罢工相关的平衡虽然与井号标签更强的偏见,提高。