编程语言
首页 > 编程语言> > Python飞快移动 – 结合结果

Python飞快移动 – 结合结果

作者:互联网

感谢您抽出时间提前回答此问题.我对Python(3.6)和Whoosh(2.7.4)都比较陌生,所以请原谅我,如果我错过了一些明显的东西.

飞快移动2.7.4 – 结合结果错误

我试图按照How to Search > Combining Results中的Whoosh文档中的说明进行操作.但是,我真的迷失在这一部分:

# Get the terms searched for
termset = set()
userquery.existing_terms(termset)

当我运行我的代码时,它会产生这个错误:

‘set’ object has no attribute ‘schema’

什么地方出了错?

我也查看了有关Whoosh API的文档,但我对ixreader的作用感到更加困惑. (或者它是index.Index.reader()?)Shrugs

看看我的代码

架构

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)
                )

相关的字段名称是“#标签”和“正文”. Hashtags是每个文档的用户选择关键字,body是文档中的文本.相当不言自明,不是吗?

搜索功能

其中很大一部分直接取自Whoosh Doc.注意,dic只是一个包含查询字符串的字典.另外,应该注意的是,在userquery.existing_terms(termset)期间发生了错误,所以如果其余部分是bunk,我很抱歉,我还没有那么远.

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文件以及哪些页面包含搜索命中(例如,来自“.pdf”的第2页的文档) “有uid 1.2).换句话说,我想给用户一个包含搜索词的页码列表,也许包含点击率最高的页面.对于每个文件,具有主题标签(或关键字)的唯一文档是具有以零结尾的uid的文档(即,页面0,例如,对于“1.pdf”,uid 1.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需要一个读者,所以我先创建搜索者并给它的读者.

至于提升领域,机制是quite simple

schema = Schema(title = TEXT(field_boost = 2.0),body = TEXT).

添加足够高的提升以将hashtag文档置于顶部,并确保在body和hashtag字段上应用单个查询.

在提升或组合之间做出决定取决于您是否希望所有匹配的标签文档始终在任何其他匹配显示之前绝对位于顶部.如果是这样,请合并.相反,如果您更喜欢在相关性方面取得平衡,尽管对主题标签有更强的偏见,那就是提升.

标签:python,python-3-x,whoosh
来源: https://codeday.me/bug/20190710/1426630.html