2016-09-23 29 views
1

我在寫索引器的界面和設計方法:如何解析搜索字符串沒有字段限制在lucene中?

List<MyDocument> search(String query, int start, int end); 

這種方法就像jdbc搜索方法:傳遞一個sql串並返回。

但是,當我試圖用lucene來實現,我沒有找到一種方法來解析查詢字符串到查詢對象。

我知道QueryParser和MultiFieldQueryParser,但他們需要預先準備好指定要搜索的字段。在我的界面中,哪些字段將被搜索不預先知道。

例如:

(title: help) AND (author: me) AND (content: plz)

title領域,authorcontent是預先未知的。如何在lucene中搜索這些未知域的查詢?

有什麼辦法可以幫到我嗎?

回答

0

QueryParser的字段參數是默認字段。也就是說,當查詢中沒有明確提供一個字段時,它將使用該字段。所以,如果我給它「默認」爲我的默認域,然後通過它:title:help AND stuff也就是說,是這樣的:

QueryParser parser = new QueryParser("default", new StandardAnalyzer()); 
Query query = parser.parse("title:help AND stuff"); 

它會解釋,由於:title:help AND default:stuff

語法您提供將按照您的意圖工作,無論您傳遞QueryParser的默認字段如何。

+0

您的示例提供了兩個字段,標題和默認值。如果我處理這個字符串,我必須至少爲QueryParser指定「標題」。問題是我不知道哪個字段會通過,或者你的意思是我必須編寫一個語法分析器並分析出「title」這個詞... – FredSuvn

+0

對於查詢:'(title:help)AND(author:me )AND(content:plz)',默認的字段參數***不重要***。您不*需要將標題,作者或內容傳遞給解析器,以便在查詢字符串中使用它們。 – femtoRgon

+0

我關心的是解析查詢字符串,而不是查詢字符串本身。構造一個QueryParser對象應該指定一個字段,我的問題是如何從查詢字符串中解析出需要的字段。我希望lucene具有可以自動分析sql字符串的jdbc等API。 – FredSuvn