2013-10-28 41 views
1

我嘗試了許多lucene分析器,發現關鍵字分析器是我的要求的最佳匹配。我正在使用相同的關鍵字分析器來更新文檔並使用QueryParser搜索相同的文檔。 我想通過通配符搜索來搜索值。 例如:如果字段「國家」包含值「印度」 我可以搜索「ind *」,「ndi」,印度等相同的字段 我得到匹配的所有其他搜索除外完全匹配。 即。當我搜索確切的詞(國家:印度)時,我沒有得到任何匹配。 如果我改變「國家:印度*」或「國家:印度?」相同的查詢,我得到 比賽。 另外我還有一個疑問,如果有一個國家名稱「不」,我該如何搜索相同的。 我試過「國家:」不是「」和「國家:\不」。但都失敗了。 這兩種情況實際發生了什麼? 請幫忙。Lucene分析器用於簡單的直接字段搜索

回答

1

我懷疑你的國名後面有一些空格或其他無關字符。你既可以修剪輸入其添加到Lucene的前,或實現自定義關鍵字分析器,並添加TrimFilter,是這樣的:

public final class CustomKeywordAnalyzer extends Analyzer { 
    public CustomKeywordAnalyzer() { 
    } 

    @Override 
    protected TokenStreamComponents createComponents(final String fieldName, final Reader reader) { 
    Tokenizer tokenizer = new KeywordTokenizer(reader) 
    TokenStream filter = new TrimFilter(Version.LUCENE_43, tokenizer); 
    return new TokenStreamComponents(tokenizer, filter); 
    } 
} 

至於搜索「不」,它僅僅是小寫應適量因爲它不能被解釋爲布爾運算符(AND,ORNOT運算符必須是大寫,每the documentation)。儘管如此,這些詞將被標準英文StopFilter所捕獲,例如StandardAnalyzer所使用的詞。查詢時確定只使用KeywordAnalyzer嗎?

除非是,雖然,肯定的方式來避免查詢分析器保留字是隻繞過查詢分析器完全和構造查詢自己:

Query query = new TermQuery(new Term("country", userQuery)); 
+0

謝謝您的寶貴答案。雖然它不能完全解決我的問題。它幫助我理解了很多事情,以便我可以自己解決其他問題。 :) –