首页 技术 正文
技术 2022年11月7日
0 收藏 543 点赞 872 浏览 2042 个字

在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

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,964
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,486
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,331
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,114
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,747
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,781