在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. Java GC 日志输出分析

    搜到的几篇讲GC日志的文章,学到了很多东西.但是有些错误或者不够精确的地方. 因此自己尝试着总结一下. 先写个程序,然后结合程序解释每句话的意思. 运行参数 -Xms200M -Xmx200M -Xm ...

  2. 在CentOS 7中轻松安装Atomic应用(atomicapp)

    sudo yum install docker atomic etcd kubernetes sudo systemctl enable docker.service sudo systemctl s ...

  3. string相关

    1.find相关 string s="abcd"; size_t pos0 = s.find_first_of("dcb");         1    //返 ...

  4. springMVC整合jedis+redis,以注解形式使用

    前两天写过 springMVC+memcached 的整合,我从这个基础上改造一下,把redis和springmvc整合到一起. 和memcached一样,redis也有java专用的客户端,官网推荐 ...

  5. 深入解析.NET框架

    一.AOP框架        Encase 是C#编写开发的为.NET平台提供的AOP框架.Encase 独特的提供了把方面(aspects)部署到运行时代码,而其它AOP框架依赖配置文件的方式.这种 ...

  6. wndows常用命令

    1. 远程桌面 mstsc (Microsoft terminal services client)

  7. android中使用intent来实现Activity带数据跳转

    大家都知道startActivity()是用来切换跳转Activity的.如果想要在另个Activity中出书数据的话.只需要在源activity中使用intent.putExtra()方法传出数据. ...

  8. SharePoint ListTemplateType enumeration

    from microsoft http://msdn.microsoft.com/en-us/library/office/microsoft.sharepoint.client.listtempla ...

  9. Zabbix的集中式监控

    相对于传统的ZABBIX硬件系统级监控(CPU,内存,硬盘,网卡),应用级的监控就显得有些复杂了. 如果对不同的应该来不同的应用,配置会很多的. 如果我们能在一个指定的AGENT上监控所有的APACH ...

  10. 用它解决大问题啦,STRACE应用

    脚本是沙沙,辉哥和我在去年解决一个PHP时弄出来的...强! 简单而实用. 抓到的TRC文件放在TRC目录下. 如果有异常的进程或输出,可以在里面详细的分析.. #!/bin/bash mkdir t ...