Python飞快移动 - 结合结果

时间:2017-11-10 17:32:10

标签: python python-3.x whoosh

感谢您抽出时间提前回答此问题。我对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'对象没有属性'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)期间发生了错误,所以如果剩下的就是下铺,我很抱歉,我还没有那么远。

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等)中获取页面,并将每个页面的文本作为单独的“文档”存储在嗖嗖索引中(即字段“body”)。每个“文档”也标有唯一ID(uid),允许我获取搜索结果并确定它来自的pdf文件以及哪些页面包含搜索命中(例如,来自“.pdf”的第2页的文档) “有uid 1.2)。换句话说,我想给用户一个包含搜索词的页码列表,也许包含点击率最高的页面。对于每个文件,具有主题标签(或关键字)的唯一文档是具有以零结尾的uid的文档(即,页面0,例如,对于“1.pdf”,uid 1.0)。页面零也可能有也可能没有“正文”(例如发布日期,作者姓名,摘要等)。我之所以这样做,是为了防止一个文档中包含更多页面的文档在页面数量明显减少的情况下显着排名较高,因为关键字在每个“文档”(即页面)上多次重复。

最终,我只想让代码使用主题文本中的搜索命中文件上的标签来提升文档。我想过只是提高了#标签字段,但我不确定它的机制是什么,文档建议不要这样做。

建议和更正将不胜感激。再次感谢你!

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)

添加足够高的提升以将主题标签文档置于顶部,并确保对正文和主题标签字段均应用单个查询。

在增强还是合并之间进行选择取决于您是否希望所有匹配的主题标签文档始终始终位于所有其他匹配项显示之前的顶部。如果是这样,请合并。相反,如果您希望在相关性上取得平衡,尽管对标签的偏见更大,请提高。