簡體   English   中英

Python飛快移動 - 結合結果

[英]Python Whoosh - Combining Results

感謝您抽出時間提前回答此問題。 我對Python(3.6)和Whoosh(2.7.4)都比較陌生,所以請原諒我,如果我錯過了一些明顯的東西。

飛快移動2.7.4 - 結合結果錯誤

我正在嘗試按照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)期間發生了錯誤,所以如果其余部分是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等)中獲取頁面,並將每個頁面的文本作為單獨的“文檔”存儲在嗖嗖索引中(即字段“body”)。 每個“文檔”也標有唯一ID(uid),允許我獲取搜索結果並確定它來自的pdf文件以及哪些頁面包含搜索命中(例如,來自“.pdf”的第2頁的文檔) “有uid 1.2)。 換句話說,我想給用戶一個包含搜索詞的頁碼列表,也許包含點擊率最高的頁面。 對於每個文件,唯一具有主題標簽(或關鍵字)的文檔是uid以零結尾的文檔(即頁面0,例如uid 1.0表示“1.pdf”)。 頁面零也可能有也可能沒有“正文”(例如發布日期,作者姓名,摘要等)。 我之所以這樣做,是為了防止一個文檔中包含更多頁面的文檔在頁面數量明顯減少的情況下顯着排名較高,因為關鍵字在每個“文檔”(即頁面)上多次重復。

最后,我只是希望代碼使用主題文本中的搜索命中文檔上的標簽來提升文檔。 我想到的只是提升標簽字段,但我不確定它的機制是什么,文檔建議不要這樣做。

建議和更正將不勝感激。 再次感謝你!

鏈接中的代碼看起來不合適。 它也給了我同樣的錯誤。 嘗試重新排列代碼,如下所示:

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

至於提升領域,機制很簡單

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

添加足夠高的提升以將hashtag文檔置於頂部,並確保在body和hashtag字段上應用單個查詢。

在提升或組合之間做出決定取決於您是否希望所有匹配的標簽文檔始終在任何其他匹配顯示之前絕對位於頂部。 如果是這樣,請合並。 相反,如果您更喜歡在相關性方面取得平衡,盡管對主題標簽有更強的偏見,那就是提升。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM