知识大全 lucene中对不同的域使用不同的分析器
Posted 分析器
篇首语:从来好事天生俭,自古瓜儿苦后甜。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 lucene中对不同的域使用不同的分析器相关的知识,希望对你有一定的参考价值。
在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();
doc add(new Field( title this is title Field Store PRESS Field Index TOKENIZED Field TermVector WITH_POSITIONS_OFFSETS));
doc add(new Field( content this is content Field Store PRESS 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()
所以我们还可以写成这样
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文相信大家都能看懂的 就不需要我来翻译了 我的英语很差 着急啊 呵呵
也就是说大家以前初始化分析器的时候用这一句:
Analyzer analyzer = new StandardAnalyzer();
现在可以改用
PerFieldAnalyzerWrapper analyzer = new PerFieldAnalyzerWrapper(new StandardAnalyzer());
然后如果需要特定域的分析器就调用addAnalyzer方法
analyzer addAnalyzer( fieldname new KeywordAnalyzer());
cha138/Article/program/Java/hx/201311/25894相关参考