2013-03-05 73 views
6

我是Lucene的新手,並嘗試使用QueryParser解析原始字符串到Query爲什麼Lucene QueryParser需要分析器

我在想,爲什麼QueryParser.Parse()方法需要分析器參數?

如果某種與查詢做,那麼Analyzer應定期Query對象處理,以及時指定分析(TermQueryBooleanQuery等),如果沒有,爲什麼QueryParser需要它?

回答

10

索引時,Lucene將文本劃分爲原子單位(標記)。在這個階段中可能會發生許多事情(例如,降級,干擾,停用詞的刪除等)。最終結果是一個術語。

然後,當您查詢時,Lucene將完全相同的算法應用於查詢,以便它可以將術語與術語匹配。

問:爲什麼TermQuery需要分析儀?
答:QueryParser對象解析查詢字符串並生成TermQuery(也可以生成其他類型的查詢,例如PhraseQuery)。 TermQuery已經包含與它們在索引中相同形狀的術語。如果你(作爲程序員)完全確定你在做什麼,你可以自己創建一個TermQuery - 但是這假設你知道查詢解析的確切順序,並且你知道在索引中條目的樣子。

問:爲什麼BooleanQuery需要分析儀?
答:BooleanQuery只是使用運算符(AND/OR/MUST/SHOULD等)加入其他查詢。沒有任何其他疑問,它本身並不是很有用。

這是一個簡化的答案。我強烈推薦閱讀Introduction to Information Retrieval書;它包含基於Lucene(和其他類似框架)編寫的理論。本書免費在線提供。

+0

謝謝,但它不能解釋爲什麼指定分析器只需要解析查詢字符串,而不是查詢時。 – haim770 2013-03-05 14:40:02

+0

編輯我的答案,讓我知道如果它不夠清楚或錯過任何東西。 – mindas 2013-03-05 14:48:07