2010-03-12 137 views
3

我有關於Lucene的這個問題。Lucene通配符查詢

我有一個表單,我從中得到一個文本,我想在幾個字段中執行全文搜索。假設我從輸入中獲得文本「textToLook」。

我有一個Lucene分析器與幾個過濾器。其中之一是lowerCaseFilter,所以當我創建索引時,單詞將被小寫。

想象我想搜索到兩個字段FIELD1和FIELD2所以Lucene的查詢會是這樣的(注意,「textToLook」現在是「texttolook」):

field1: texttolook* field2:texttolook* 

在我的課堂我有什麼像這樣來創建查詢。當沒有通配符時,我工作。

String text = "textToLook"; 
String[] fields = {"field1", "field2"}; 
//analyser is the same as the one used for indexing 
Analyzer analyzer = fullTextEntityManager.getSearchFactory().getAnalyzer("customAnalyzer"); 
MultiFieldQueryParser parser = new MultiFieldQueryParser(fields, analyzer); 
org.apache.lucene.search.Query queryTextoLibre = parser.parse(text); 

這段代碼的查詢是:

field1: texttolook field2:texttolook 

,但如果我設置文本爲 「textToLook *」 我得到

field1: textToLook* field2:textToLook* 

,將無法正確找到爲指標是小寫字母。

我在Lucene網站閱讀:

「通配符,前綴和模糊 不是通過分析, 通過這是執行 操作,如詞幹和 lowercasing組件查詢」

我的問題不能通過設置行爲不區分大小寫解決因爲我的分析儀有其他字段,例如刪除一些後綴的單詞。

我想我可以通過獲取文本的方式來解決問題,然後我可以添加「*」,然後使用MultiFieldQueryParser構建查詢。所以在這個例子中我會得到「textToLower」,並在傳遞給這些過濾器後,我可以得到「texttolower」。在此之後,我可以製作「textotolower *」。

但是,有沒有什麼辦法通過我所有的分析儀的過濾器後得到我的文本變量的值?我怎樣才能得到我的分析儀的所有過濾器?這可能嗎?

感謝

回答

1

你可以使用QueryParser.setLowercaseExpandedTerms(真)?

http://wiki.apache.org/lucene-java/LuceneFAQ#Are_Wildcard.2C_Prefix.2C_and_Fuzzy_queries_case_sensitive.3F

**編輯**

好吧,我現在明白你的問題。實際上,您希望通配術語在通過通配符查詢運行之前被阻止。

你也可以繼承的QueryParser和覆蓋

protected Query getWildcardQuery(String field, String termStr) throws ParseException 

通過分析器被構造的WildcardQuery之前運行termStr。

雖然這可能不是用戶期望的。還有一個原因,他們已經決定不通過該分析儀運行的通配符項,佔常見問題解答:

之所以跳過分析 是,如果你正在尋找 「狗*」你不會希望「狗」 首先被歸類爲「狗」,因爲那個 然後會匹配「狗*」,這不是 預期的查詢。

+0

我已經看到了這個,但它不能解決問題。我有比小寫更多的過濾器。正如我所提到的其中一個消除後綴的單詞,所以如果我索引例如「可改變」它將索引作爲「改變」,所以如果我在查詢中搜索「變化」應該得到單詞的根(「改變「)並尋找」改變*「,這些詞將匹配。 – Javi 2010-03-12 16:25:27