【问题标题】:Lucene Custom Analyzer for indexing and query用于索引和查询的 Lucene 自定义分析器
【发布时间】:2014-04-10 12:57:06
【问题描述】:

我正在开发 lucene 4.7 并尝试迁移我们在 solr 配置中使用的分析器之一。

 <analyzer> 
  <charFilter class="solr.HTMLStripCharFilterFactory"/>
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>  
    <filter class="solr.WordDelimiterFilterFactory" 
            generateWordParts="1" 
            generateNumberParts="1" 
            catenateWords="1"
            catenateNumbers="1"
            catenateAll="0"
            splitOnCaseChange="0"
            splitOnNumerics="0"
            preserveOriginal="1"
    />
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.PorterStemFilterFactory"/>
  </analyzer>

但是,我只是不知道如何在上面的配置中使用 HTMLStripCharFilterFactory 和 WordDelimiterFilterFactory。另外,对于我在 solr 中的查询,我的分析器如下,我怎样才能在 lucene 中实现同样的效果。

 <analyzer type="query">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.StopFilterFactory"
            ignoreCase="true"
            words="stopwords.txt"
            />
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.PorterStemFilterFactory"/>
  </analyzer>

【问题讨论】:

    标签: solr lucene


    【解决方案1】:

    Analysis package documentation 解释了如何使用CharFilter。您将阅读器包装在您覆盖的 initReader 方法中。

    我假设您的WordDelimiterFilter 的问题是您不知道如何设置您正在使用的配置选项?您可以通过将适当的常量与二进制和 (&amp;) 组合来构造一个 int 以传递给构造函数。如:

    int config = WordDelimiterFilter.GENERATE_NUMBER_PARTS & WordDelimiterFilter.GENERATE_WORD_PARTS; //etc.
    

    所以,最终你可能会得到类似的结果:

    //StopwordAnalyzerBase grants you some convenient ways to handle stop word sets.
    public class MyAnalyzer extends StopwordAnalyzerBase {
    
        private final Version version = Version.LUCENE_47;
        private int wordDelimiterConfig;
    
        public MyAnalyzer() throws IOException {
            super(version, loadStopwordSet(new FileReader("stopwords.txt"), matchVersion));
            //Might as well load this config up front, along with the stop words
            wordDelimiterConfig = 
                WordDelimiterFilter.GENERATE_WORD_PARTS &
                WordDelimiterFilter.GENERATE_NUMBER_PARTS &
                WordDelimiterFilter.CATENATE_WORDS &
                WordDelimiterFilter.CATENATE_NUMBERS &
                WordDelimiterFilter.PRESERVE_ORIGINAL;
        }
    
        @Override
        protected TokenStreamComponents createComponents(String fieldName, Reader reader) {
            Tokenizer source = new WhitespaceTokenizer(version, reader);
            TokenStream filter = new WordDelimiterFilter(source, wordDelimiterConfig, null);
            filter = new LowercaseFilterFactory(version, filter);
            filter = new StopFilter(version, filter, stopwords);
            filter = new PorterStemFilter(filter);
            return new TokenStreamComponents(source, filter);
        }
    
        @Override
        protected Reader initReader(String fieldName, Reader reader) {
            return new HTMLStripCharFilter(reader);
        }
    }
    

    注意:我已将StopFilter 移至LowercaseFilter 之后。这使得它不区分大小写,只要您的停用词定义都是小写的。不知道这是否由于WordDelimiterFilter 而有问题。如果是这样,有一个loadStopwordSet method that support case insensitivity,但坦率地说,我不知道如何使用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-27
      • 1970-01-01
      • 2013-04-29
      • 1970-01-01
      • 2020-12-01
      相关资源
      最近更新 更多