zoukankan      html  css  js  c++  java
  • Lucene为不同字段指定不同分词器(转)

    在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 

  • 相关阅读:
    Nginx使用
    nginx常见配置详解
    配置yum源
    nginx常见使用方式和日志功能
    SpringCloud学习篇《一》
    myeclipse的各种背景:黑色,护眼,欢迎围观
    java基础二 <流程控制语句, 方法,数组,java内存结构> 未完待续...
    fastjson解析超长json串以及转成list,map等方法实例
    Linux下权限的修改-JDK的配置-文件的常见操作
    java面试基础大全,绝对经典<126-170><转>
  • 原文地址:https://www.cnblogs.com/zhwl/p/3493841.html
Copyright © 2011-2022 走看看