在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; |