SOLR:带有词干提取的 SynonymFilterFactory
SOLR: SynonymFilterFactory with stemming
如果我理解正确,SynonymFilterFactory 不会以任何方式阻止同义词。因此,无论pluralization/tensing.
如何,如果他们想要良好的回忆,就必须在他们的同义词文件中非常详尽地使用复数和时态。
我看到 SynonymFilterFactory 有一个可选参数,它可以接受分析器。
analyzer: (optional; default: WhitespaceTokenizerFactory) The name of the analyzer class to use when parsing the synonyms file. If analyzer is specified, then tokenizerFactory may not be, and vice versa.
我怀疑像这样嵌套所需的分析器是否有效:
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory" />
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" />
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.SnowballPorterFilterFactory" />
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true" >
<analyzer>
<tokenizer class="solr.WhitespaceTokenizerFactory" />
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.SnowballPorterFilterFactory" />
<filter class="solr.RemoveDuplicatesTokenFilterFactory" />
</analyzer>
</filter>
<filter class="solr.RemoveDuplicatesTokenFilterFactory" />
</analyzer>
我怀疑编译扩展分析器 .jar 并将其放在 SOLR 的 lib 文件夹中可能是唯一的方法。有没有办法在配置中定义一个命名分析器,或者其他方法来实现这个目标?
这并没有回答我最初的问题(关于如何仅通过配置来做到这一点),而是我最终使用的解决方案,以防其他人想要这样做。
首先,自定义分析器将用于预处理来自同义词过滤器的同义词(最重要的是,使用 Snowball 阻止它们):
public class SnowballAnalyzer extends Analyzer {
/**
* Creates a
* {@link org.apache.lucene.analysis.Analyzer.TokenStreamComponents} which
* tokenizes text when given a reader.
*
* @return A
* {@link org.apache.lucene.analysis.Analyzer.TokenStreamComponents}
* built from an {@link WhitespaceTokenizer} filtered with
* {@link LowerCaseFilter} and English {@link SnowballFilter}.
*/
@Override
protected TokenStreamComponents createComponents(String fieldName) {
Tokenizer source = new WhitespaceTokenizer();
TokenStream filter = new LowerCaseFilter(source);
filter = new SnowballFilter(filter, "English");
return new TokenStreamComponents(source, filter);
}
}
这被提取为 .jar 并部署到您的 SOLR 主目录的 lib 目录中。接下来,确保告诉 SOLR 在同义词过滤器中使用此分析器(通常在 schema.xml 或托管模式中):
<fieldType name="stemmedText" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
<filter class="solr.WordDelimiterFilterFactory" catenateNumbers="1" generateNumberParts="1" generateWordParts="1" catenateAll="0" catenateWords="1"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.SnowballPorterFilterFactory"/>
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
<filter class="solr.WordDelimiterFilterFactory" catenateNumbers="0" generateNumberParts="1" generateWordParts="1" catenateAll="0" catenateWords="0"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.SnowballPorterFilterFactory"/>
<filter class="solr.SynonymFilterFactory" expand="true" analyzer="your.package.SnowballAnalyzer" ignoreCase="true" synonyms="synonyms.txt"/>
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
</fieldType>
最后,在您想要的任何字段上使用上述类型:
<field name="keywords" type="stemmedText" indexed="true" stored="false"/>
在这个例子中,文档的关键字字段将在索引中被提取。当在该字段上完成查询时,该术语将被提取 然后 用于查找同义词(已经由自定义分析器预先提取)。结果是包含 "incomplete" 个同义词列表(复数、时态)的同义词文件获得匹配的机会更高。
具体例子
同义词文件条目:[dog,doggy,dogs,canids,canid,puppy,pups,pup]
搜索词:小狗(注意它不在同义词列表中)
已解析的查询:SynonymQuery(Synonym(keywords:canid keywords:dog keywords:doggi keywords:pup keywords:puppi))
如果我理解正确,SynonymFilterFactory 不会以任何方式阻止同义词。因此,无论pluralization/tensing.
如何,如果他们想要良好的回忆,就必须在他们的同义词文件中非常详尽地使用复数和时态。我看到 SynonymFilterFactory 有一个可选参数,它可以接受分析器。
analyzer: (optional; default: WhitespaceTokenizerFactory) The name of the analyzer class to use when parsing the synonyms file. If analyzer is specified, then tokenizerFactory may not be, and vice versa.
我怀疑像这样嵌套所需的分析器是否有效:
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory" />
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" />
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.SnowballPorterFilterFactory" />
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true" >
<analyzer>
<tokenizer class="solr.WhitespaceTokenizerFactory" />
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.SnowballPorterFilterFactory" />
<filter class="solr.RemoveDuplicatesTokenFilterFactory" />
</analyzer>
</filter>
<filter class="solr.RemoveDuplicatesTokenFilterFactory" />
</analyzer>
我怀疑编译扩展分析器 .jar 并将其放在 SOLR 的 lib 文件夹中可能是唯一的方法。有没有办法在配置中定义一个命名分析器,或者其他方法来实现这个目标?
这并没有回答我最初的问题(关于如何仅通过配置来做到这一点),而是我最终使用的解决方案,以防其他人想要这样做。
首先,自定义分析器将用于预处理来自同义词过滤器的同义词(最重要的是,使用 Snowball 阻止它们):
public class SnowballAnalyzer extends Analyzer {
/**
* Creates a
* {@link org.apache.lucene.analysis.Analyzer.TokenStreamComponents} which
* tokenizes text when given a reader.
*
* @return A
* {@link org.apache.lucene.analysis.Analyzer.TokenStreamComponents}
* built from an {@link WhitespaceTokenizer} filtered with
* {@link LowerCaseFilter} and English {@link SnowballFilter}.
*/
@Override
protected TokenStreamComponents createComponents(String fieldName) {
Tokenizer source = new WhitespaceTokenizer();
TokenStream filter = new LowerCaseFilter(source);
filter = new SnowballFilter(filter, "English");
return new TokenStreamComponents(source, filter);
}
}
这被提取为 .jar 并部署到您的 SOLR 主目录的 lib 目录中。接下来,确保告诉 SOLR 在同义词过滤器中使用此分析器(通常在 schema.xml 或托管模式中):
<fieldType name="stemmedText" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
<filter class="solr.WordDelimiterFilterFactory" catenateNumbers="1" generateNumberParts="1" generateWordParts="1" catenateAll="0" catenateWords="1"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.SnowballPorterFilterFactory"/>
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
<filter class="solr.WordDelimiterFilterFactory" catenateNumbers="0" generateNumberParts="1" generateWordParts="1" catenateAll="0" catenateWords="0"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.SnowballPorterFilterFactory"/>
<filter class="solr.SynonymFilterFactory" expand="true" analyzer="your.package.SnowballAnalyzer" ignoreCase="true" synonyms="synonyms.txt"/>
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
</fieldType>
最后,在您想要的任何字段上使用上述类型:
<field name="keywords" type="stemmedText" indexed="true" stored="false"/>
在这个例子中,文档的关键字字段将在索引中被提取。当在该字段上完成查询时,该术语将被提取 然后 用于查找同义词(已经由自定义分析器预先提取)。结果是包含 "incomplete" 个同义词列表(复数、时态)的同义词文件获得匹配的机会更高。
具体例子
同义词文件条目:[dog,doggy,dogs,canids,canid,puppy,pups,pup]
搜索词:小狗(注意它不在同义词列表中)
已解析的查询:SynonymQuery(Synonym(keywords:canid keywords:dog keywords:doggi keywords:pup keywords:puppi))