在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为不同字段指定不同分词器(转)的更多相关文章

  1. Lucene.net(4.8.0)+PanGu分词器问题记录一:分词器Analyzer的构造和内部成员ReuseStategy

    前言:目前自己在做使用Lucene.net和PanGu分词实现全文检索的工作,不过自己是把别人做好的项目进行迁移.因为项目整体要迁移到ASP.NET Core 2.0版本,而Lucene使用的版本是3 ...

  2. Lucene.net(4.8.0) 学习问题记录五: JIEba分词和Lucene的结合,以及对分词器的思考

    前言:目前自己在做使用Lucene.net和PanGu分词实现全文检索的工作,不过自己是把别人做好的项目进行迁移.因为项目整体要迁移到ASP.NET Core 2.0版本,而Lucene使用的版本是3 ...

  3. 【lucene系列学习四】使用IKAnalyzer分词器实现敏感词和停用词过滤

    Lucene自带的中文分词器SmartChineseAnalyzer不太好扩展,于是我用了IKAnalyzer来进行敏感词和停用词的过滤. 首先,下载IKAnalyzer,我下载了 然后,由于IKAn ...

  4. Lucene 6.0下使用IK分词器

    Lucene 6.0使用IK分词器需要修改修改IKAnalyzer和IKTokenizer. 使用时先新建一个MyIKTokenizer类,一个MyIkAnalyzer类: MyIKTokenizer ...

  5. Apache Lucene(全文检索引擎)—分词器

    目录 返回目录:http://www.cnblogs.com/hanyinglong/p/5464604.html 本项目Demo已上传GitHub,欢迎大家fork下载学习:https://gith ...

  6. Lucene.net(4.8.0) 学习问题记录一:分词器Analyzer的构造和内部成员ReuseStategy

    前言:目前自己在做使用Lucene.net和PanGu分词实现全文检索的工作,不过自己是把别人做好的项目进行迁移.因为项目整体要迁移到ASP.NET Core 2.0版本,而Lucene使用的版本是3 ...

  7. lucene 分词器

    分词器 作用:切分关键词的. 在什么地方使用到了:在建立索引和搜索时. 原文:An IndexWriter creates and maintains an index. 1,切分: An Index ...

  8. solr配置相关:约束文件及引入ik分词器

    schema.xml: solr约束文件 Solr中会提前对文档中的字段进行定义,并且在schema.xml中对这些字段的属性进行约束,例如:字段数据类型.字段是否索引.是否存储.是否分词等等 < ...

  9. 【Lucene3.6.2入门系列】第04节_中文分词器

    package com.jadyer.lucene; import java.io.IOException; import java.io.StringReader; import org.apach ...

随机推荐

  1. Composite 模式的实现

    实现要点: 1.组合模式采用树形结构来实现普遍存在的对象容器,从而将“一对多”的关系转化“一对一”的关系,使得客户代码可以一致地处理对象和对象容器,无需关心处理的是单个的对象,还是组合的对象容器. 2 ...

  2. 原生js实现回到顶部

    网页可见区域宽: document.body.clientWidth;网页可见区域高: document.body.clientHeight;网页可见区域宽: document.body.offset ...

  3. LGDT/LIDT-加载全局/中断描述符表寄存器

    将源操作数中的值加载到全局描述符表寄存器 (GDTR) 或中断描述符表寄存器 (IDTR).源操作数指定 6 字节内存位置,它包含全局描述符表 (GDT) 或中断描述符表 (IDT) 的基址(线性地址 ...

  4. pojo和JavaBean的区别

    javabean可以处理业务,pojo不可以. pojo就是get 和set 例如: Student{ id; name; get();... set();...} javabean可以实现业务逻辑 ...

  5. js获取屏幕(设备)宽高

    平常获取设备的宽高无非就那几 <script language="javascript"> var h = ""; h += " 网页可见 ...

  6. linux 下面 opcache 拓展

    PHP 5.5.0 及后续版本中已经绑定了 OPcache 扩展,只需要在编译安装的时候, 如果你使用--disable-all参数 禁用了默认扩展的构建, 那么必须使用--enable-opcach ...

  7. [HOWTO] Install Sphinx for A Script Pro

    Hi, Here's a small howto on installing Sphinx Search (http://sphinxsearch.com/) and configuring it t ...

  8. Win10的革新与突破

    7月29号win10全球发布,作为微软最后一款操作系统,它会有那些令人期待的革新,作为一个互联网后现代时代,这款操作系统又会融入什么特别元素? 抱着期待,更新了win10后,我花了大概一天的时间,亲身 ...

  9. instancetype 与 id for Objective-C

    instancetype.id.NSObject的区别 - simalone   1.instancetype只能用于方法的返回类型,而id用处和NSObject *类似. 2.instancetyp ...

  10. 关于html5

    html5   是用来  将 js  和 css  结合起来 从而实现 各种功能 javascript 用来定义 html5   页面的逻辑 css 来定义 html5 中的显示样式