gpt4 book ai didi

solr - 用于索引和查询的 Lucene 自定义分析器

转载 作者:行者123 更新时间:2023-12-02 04:31:33 25 4
gpt4 key购买 nike

我正在开发 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>

最佳答案

Analysis package documentation解释如何使用 CharFilter。您可以将阅读器包装在重写的 initReader 方法中。

我假设您的 WordDelimiterFilter 的问题是您不知道如何设置您正在使用的配置选项?您可以通过将适当的常量与二进制 and (&) 组合来构造要传递到构造函数的 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 ,但坦白说,我不知道如何使用它。

关于solr - 用于索引和查询的 Lucene 自定义分析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22988749/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com