2013-03-18 44 views
1

我正在使用whoosh來索引超過200,000本書。但我遇到了一些問題。 whoosh查詢解析器返回NullQuery的單詞,如「C#」,「C++」中包含元字符以及其他一些短單詞。這個詞在一些文檔的標題和正文中使用,所以我不使用它們的關鍵字類型。我想問題是在分析或查詢分析階段的搜索或索引,但我不能盲目地觸摸我的數據。任何人都可以幫助我解決這個問題。 TNX。whoosh不搜索諸如「C#」之類的短詞

'\ w + [#+ \ W] *'

這將使:

我用的是符合我的要求,這裏是正則表達式正則表達式模式建立一個StandardAnalyzer固定的問題將字段標記爲成功完成,並且搜索進行得很順利。 但是當我使用「some query ++ *」或「some ## *」這樣的查詢時,解析後的查詢將是單個每個查詢,只是'*'。我還發現這與我的分析儀無關,這是Whoosh的默認行爲。所以這裏是我的新問題:這是行爲正確還是錯誤?

注意:從查詢解析器中刪除WildcardPlugin解決了這個問題,但我還需要WildcardPlugin。


現在我用下面的代碼:

from whoosh.util import rcompile 
#for matching words like: '.NET', 'C++' and 'C#' 
word_pattern = rcompile('(\.|[\w]+)(\.?\w+|#|\+\+)*') 
#i don't need words shorter that two characters so i don't change the minsize default 
analyzer = analysis.StandardAnalyzer(expression=word_pattern) 

...現在在我的架構:

... 
title = fields.TEXT(analyzer=analyzer), 
... 

這將解決我的第一個問題,是的。但主要的問題在於搜索。我不想讓用戶使用Every查詢或*進行搜索。但是當我解析像C++*這樣的查詢時,我最終得到了一個Every(*)查詢。我知道有一些問題,但我無法弄清楚它是什麼。

回答

2

我有同樣的問題,發現StandardAnalyzer()默認使用minsize=2。所以在你的模式中,你必須另外告訴它。

schema = whoosh.fields.Schema(
    name = whoosh.fields.TEXT(stored=True, analyzer=whoosh.analysis.StandardAnalyzer(minsize=1)), 
    # ... 
) 
+0

感謝您的回答kichik。是的,您通過更改「StandardAnalizer」的minsize和expression參數是正確的,我們可以更改用於索引的接受令牌。但我改變了我的問題。 – 2013-05-04 20:32:46

+1

嗯...現在有人能夠找出解決原始問題的方法?如果你打開一個新的問題而不是完全改變這個問題,情況會更好。 – kichik 2013-05-04 23:02:33

相關問題