在lucene使用过程中,如果要对同一IndexWriter中不同 Document,不同Field中使用不同的analyzer,我们该如何实现呢?
通过对《lucene in action》的阅读,发现是可以解决这一问题的。lucene可以正对整个IndexWriter对象或者每一个document对象或者特定 Field使用不同的分析器。
Java代码 复制代码
Analyzer analyzer = new StandardAnalyzer();
IndexWriter writer = new IndexWriter(direcotry, analyzer, true); //
Document doc = new Document();
doc.add(new Field("title", "this is title", Field.Store.COMPRESS,Field.Index.TOKENIZED,Field.TermVector.WITH_POSITIONS_OFFSETS));
doc.add(new Field("content", "this is content", Field.Store.COMPRESS,Field.Index.TOKENIZED,Field.TermVector.WITH_POSITIONS_OFFSETS));
writer.addDocument(doc); //这是大部分情况下使用的一个方法
其实还有另外一个方法,原型如下:
lucene自带文档 写道
addDocument(Document doc, Analyzer analyzer)
Adds a document to this index, using the provided analyzer instead of the value of getAnalyzer().
所以我们还可以写成这样:
Java代码 复制代码
writer.addDocument(doc, analyzer);
// 这里的analyzer是指另外一个你指定的analyzer,不同于上面的StandardAnalyzer
那 么如何针对特定Field使用不同分析器呢,lucene包里面有个PerFieldAnalyzerWrapper类,解决了这一问题,这是 lucene的文档里面的一段话:
lucene自带文档 写道
Example usage:
PerFieldAnalyzerWrapper aWrapper = new PerFieldAnalyzerWrapper(new StandardAnalyzer());
aWrapper.addAnalyzer("firstname", new KeywordAnalyzer());
aWrapper.addAnalyzer("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文相信大家都能看懂的,就不需要我来翻译了,我的英语很差,着急啊,呵呵。
也就是说大家以前初始化分析器的时候用这一句:
Java代码 复制代码
Analyzer analyzer = new StandardAnalyzer();
现在可以改用
Java代码 复制代码
PerFieldAnalyzerWrapper analyzer = new PerFieldAnalyzerWrapper(new StandardAnalyzer());
然 后如果需要特定域的分析器就调用addAnalyzer方法
Java代码 复制代码
analyzer.addAnalyzer("fieldname", new KeywordAnalyzer());
对了,最后说一下,PerFieldAnalyzerWrapper类也是在org.apache.lucene.analysis包下面的,只需要
Java代码 复制代码
import org.apache.lucene.analysis.PerFieldAnalyzerWrapper;
就行了
转:http://hi.baidu.com/lewutian/blog/item/42bf84ceeef3ba35b600c8e7.html
Lucene为不同字段指定不同分词器(转)
转载上一篇:黑马程序员-字符串缓冲区
下一篇:java volatile的使用
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
Lucene笔记14-Lucene的分词-分词器的原理讲解
14
分词器 字符串 首字母 其他 -
基于高版本Lucene的中文分词器(IK分词器)的DEMO
缘起日前项目中需要用到Lucene.且需要中文分词,看了下IK分词器,但是IK分词器貌似只支持到lucene的3.X。后期的版本就不支持了,在网上找了一部分资料,自己写了一个demo.因为中间有不少坑,所以特此记录。关于Demodemo采用的lucene的版本是6.4.0。
lucene高版本IK分词器 高版本IK分词器 lucene教程 中文分词教程 高版本IKAnalyzer -
Lucene为不同字段指定不同分词器(转)
在lucene使用过程中,如果要对同一IndexWriter中不同 Document,不同Field中使用不同的analyzer,我们该如何实现呢?通过对《lucene in action》的阅
analyzer lucene java代码 sed apache