感谢您抽出时间提前回答这个问题。我对 Python (3.6) 和 Whoosh (2.7.4) 都比较陌生,所以如果我遗漏了一些明显的东西,请原谅我。
Whoosh 2.7.4 — 组合结果错误
我正在尝试按照 How to Search > Combining Results 上的 Whoosh 文档中的说明进行操作。但是,我真的迷失在这一节中:
# 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)
)
相关的字段名是“hashtag”和“body”。 Hashtags 是用户为每个文档选择的关键字,body 是文档中的文本。不言自明,不是吗?
搜索功能
其中大部分内容直接来自 Whoosh Doc。注意, 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 等)中获取页面,并将每个页面的文本作为单独的“文档”存储在 whoosh 索引(即“正文”字段)中。每个“文档”也标有唯一的 ID (uid),允许我获取搜索结果并确定它来自哪个 pdf 文件以及哪些页面包含搜索结果(例如“1.pdf”的第 2 页的文档"具有 uid 1.2)。换句话说,我想给用户一个包含搜索词的页码列表,也许还有点击次数最多的页面。对于每个文件,唯一具有主题标签(或关键字)的文档是 uid 以零结尾的文档(即页面零,例如“1.pdf”的 uid 1.0)。第 0 页也可能有也可能没有“正文”(例如发布日期、作者姓名、摘要等)。我这样做是为了防止一个页面较多的文档与另一个页面明显较少的文档相比,由于关键字在每个“文档”(即页面)上的多次重复而被显着排在更高的位置。
最终,我只希望代码将带有主题标签的文档提升到仅在正文中搜索命中的文档。我曾想过只增加主题标签字段,但我不确定它的机制是什么,并且文档对此提出了建议。
建议和更正将不胜感激。再次感谢你!
最佳答案
您链接中的代码在我看来不正确。它也给了我同样的错误。尝试按如下方式重新排列您的代码:
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)
。添加足够高的提升以将主题标签文档置于顶部,并确保对正文和主题标签字段应用单个查询。
在提升或组合之间做出决定取决于您是否希望所有匹配的主题标签文档始终在任何其他匹配项显示之前绝对位于顶部。如果是这样,合并。相反,如果您更喜欢在相关性方面取得平衡,尽管对主题标签有更强的偏见,请提升。
关于Python Whoosh - 组合结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47228237/