在lucene使用過程中如果要對同一IndexWriter中不同Document不同Field中使用不同的analyzer我們該如何實現呢?
通過對《lucene in action》的閱讀發現是可以解決這一問題的lucene可以正對整個IndexWriter對象或者每一個document對象或者特定Field使用不同的分析器
Analyzer analyzer = new StandardAnalyzer();
IndexWriter writer = new IndexWriter(direcotry analyzer true); //
Document doc = new Document();
docadd(new Field(title this is title FieldStoreCOMPRESSFieldIndexTOKENIZEDFieldTermVectorWITH_POSITIONS_OFFSETS));
docadd(new Field(content this is content FieldStoreCOMPRESSFieldIndexTOKENIZEDFieldTermVectorWITH_POSITIONS_OFFSETS));
writeraddDocument(doc); //這是大部分情況下使用的一個方法
其實還有另外一個方法原型如下
lucene自帶文檔寫道
addDocument(Document doc Analyzer analyzer) Adds a document to this index using the provided analyzer instead of the value of getAnalyzer()
所以我們還可以寫成這樣
writeraddDocument(doc analyzer); // 這裡的analyzer是指另外一個你指定的analyzer不同於上面的StandardAnalyzer
那麼如何針對特定Field使用不同分析器呢lucene包裡面有個PerFieldAnalyzerWrapper類解決了這一問題這是lucene的文檔裡面的一段話
lucene自帶文檔寫道
Example usage:
PerFieldAnalyzerWrapper aWrapper = new PerFieldAnalyzerWrapper(new StandardAnalyzer());
aWrapperaddAnalyzer(firstname new KeywordAnalyzer()); aWrapperaddAnalyzer(lastname new KeywordAnalyzer());
In this example StandardAnalyzer will be used for all fields except firstname and lastname for which KeywordAnalyzer will be used
A PerFieldAnalyzerWrapper can be used like any other analyzer for both indexing and query parsing PreFieldAnalyzerWrapper類的構造函數中需要一個默認的分析器作為參數為了給不同的Field指定不同的analyzer就需要調用該類的addAnalyzer()方法上面的E文相信大家都能看懂的就不需要我來翻譯了我的英語很差著急啊呵呵
也就是說大家以前初始化分析器的時候用這一句:
Analyzer analyzer = new StandardAnalyzer();
現在可以改用
PerFieldAnalyzerWrapper analyzer = new PerFieldAnalyzerWrapper(new StandardAnalyzer());
然後如果需要特定域的分析器就調用addAnalyzer方法
analyzeraddAnalyzer(fieldname new KeywordAnalyzer());
對了最後說一下PerFieldAnalyzerWrapper類也是在orgapacheluceneanalysis包下面的只需要import orgapacheluceneanalysisPerFieldAnalyzerWrapper;
From:http://tw.wingwit.com/Article/program/Java/hx/201311/25894.html