Solr 中的前后 EdgeNGrams
Front and back EdgeNGrams in Solr
我想使用 EdgeNGramFilterFactory 从正面和背面生成边缘 NGram。前面我用的是
<filter class="solr.EdgeNGramFilterFactory" maxGramSize="20" minGramSize="4"/>
后面,我正在使用
<filter class="solr.ReverseStringFilterFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="4" maxGramSize="15"/>
<filter class="solr.ReverseStringFilterFactory"/>
但是当它们在单个分析器中一起使用时,第二组过滤器工厂作用于第一个 EdgeNGramFilterFactory 的输出。
是否可以在单个分析器中生成前后 EdgeNGrams?或者我是否必须创建单独的分析器并使用 copyField
创建一个包含前后 EdgeNGrams 的字段?
更新
以下评论中要求的示例模式
<fieldType name="text_suggest_edge" class="solr.TextField">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="12"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="12"/>
</analyzer>
</fieldType>
<fieldType name="text_suggest_edge_end" class="solr.TextField">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.ReverseStringFilterFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="12"/>
<filter class="solr.ReverseStringFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.ReverseStringFilterFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="12"/>
<filter class="solr.ReverseStringFilterFactory"/>
</analyzer>
</fieldType>
<field name="item_name_edge" type="text_suggest_edge" indexed="true" stored="false" multiValued="true"/>
<field name="item_name_edge_end" type="text_suggest_edge_end" indexed="true" stored="false" multiValued="true"/>
<copyField source="item_name" dest="item_name_edge"/>
<copyField source="item_name" dest="item_name_edge_end"/>
更新 2:包括示例输入和预期输出
输入字符串
Washington
所需的边 Ngram
Was
、Wash
、Washi
、……Washington
、ashington
、shington
、hington
。 .. gton
, ton
如果您创建自定义版本的 EdgeNGramFilterFactory(在 java 中,然后将其插入您的 schema.xml),则可以在单个分析器链中完成此操作,从后面创建额外的 ngram .
否则,您将需要将 copyField 复制到具有单独链的附加字段中。
老实说,第一个选项太麻烦了,但肯定是有可能的。
我想使用 EdgeNGramFilterFactory 从正面和背面生成边缘 NGram。前面我用的是
<filter class="solr.EdgeNGramFilterFactory" maxGramSize="20" minGramSize="4"/>
后面,我正在使用
<filter class="solr.ReverseStringFilterFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="4" maxGramSize="15"/>
<filter class="solr.ReverseStringFilterFactory"/>
但是当它们在单个分析器中一起使用时,第二组过滤器工厂作用于第一个 EdgeNGramFilterFactory 的输出。
是否可以在单个分析器中生成前后 EdgeNGrams?或者我是否必须创建单独的分析器并使用 copyField
创建一个包含前后 EdgeNGrams 的字段?
更新 以下评论中要求的示例模式
<fieldType name="text_suggest_edge" class="solr.TextField">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="12"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="12"/>
</analyzer>
</fieldType>
<fieldType name="text_suggest_edge_end" class="solr.TextField">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.ReverseStringFilterFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="12"/>
<filter class="solr.ReverseStringFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.ReverseStringFilterFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="12"/>
<filter class="solr.ReverseStringFilterFactory"/>
</analyzer>
</fieldType>
<field name="item_name_edge" type="text_suggest_edge" indexed="true" stored="false" multiValued="true"/>
<field name="item_name_edge_end" type="text_suggest_edge_end" indexed="true" stored="false" multiValued="true"/>
<copyField source="item_name" dest="item_name_edge"/>
<copyField source="item_name" dest="item_name_edge_end"/>
更新 2:包括示例输入和预期输出
输入字符串
Washington
所需的边 Ngram
Was
、Wash
、Washi
、……Washington
、ashington
、shington
、hington
。 .. gton
, ton
如果您创建自定义版本的 EdgeNGramFilterFactory(在 java 中,然后将其插入您的 schema.xml),则可以在单个分析器链中完成此操作,从后面创建额外的 ngram .
否则,您将需要将 copyField 复制到具有单独链的附加字段中。
老实说,第一个选项太麻烦了,但肯定是有可能的。