我在schema.xml中使用以下过滤器:
<filter class="solr.EdgeNGramFilterFactory" minGramSize="4" maxGramSize="15" side="front"/>
如何提高更长的ngrams?例如,当我搜索“bookpage”时,包含“bookpage”的文档的评级应该比只有“book”的文档高很多。
答案 0 :(得分:5)
我不知道基于术语长度动态提升的方法(即使用Function Query运算符)。我怀疑没有一个。
那就是说,我经常想要近似你正在寻找的逻辑:长期匹配需要更高的语义权重。
最常见的是,我会将文本值索引到两个不同的字段中。一个是没有ngrams的最小处理文本字段。另一个是类似的,但也用ngrams处理。
以下是我以这种方式使用的架构的一些示例摘录。对于针对此架构的搜索,我会在text
上大量提升text_ngram
字段。因此,针对text
字段的任何匹配都会极大地影响相关性,而针对text_ngram
的匹配仍然可以获得可能相关的结果。
<?xml version="1.0" encoding="UTF-8"?>
<schema name="Sunspot Customized NZ" version="1.0">
<types>
<!--
A text type with minimal text processing, for the greatest semantic
value in a term match. Boost this field heavily.
-->
<fieldType name="text" class="solr.TextField" omitNorms="false">
<analyzer>
<tokenizer class="solr.StandardTokenizerFactory" />
<filter class="solr.StandardFilterFactory" />
<filter class="solr.LowerCaseFilterFactory" />
</analyzer>
</fieldType>
<!--
Looser matches with NGram processing for substrings of terms and synonyms
-->
<fieldType name="text_ngram" class="solr.TextField" omitNorms="false">
<analyzer>
<tokenizer class="solr.StandardTokenizerFactory" />
<filter class="solr.StandardFilterFactory" />
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true" />
<filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="6" side="front" />
</analyzer>
</fieldType>
<!-- other stuff -->
</types>
<fields>
<!-- id, other scalar values -->
<!-- catch-all for the text and text_ngram types -->
<field name="text" stored="false" type="text" multiValued="true" indexed="true" />
<field name="text_ngram" stored="false" type="text_ngram" multiValued="true" indexed="true" />
<!-- various dynamicField definitions -->
<!-- sample dynamicField definitions for text and text_ngram -->
<dynamicField name="*_text" type="text" indexed="true" stored="false" multiValued="false" />
<dynamicField name="*_text_ngram" type="text_ngram" indexed="true" stored="false" multiValued="false" />
</fields>
<!-- copy text fields into my text and text_ngram catch-all fields -->
<copyField source="*_text" dest="text" />
<copyField source="*_text" dest="text_ngram" />
</schema>
这不是您正在寻找的,但您可以使用类似的方法。
例如,创建一个中间NGram处理字段类型的小集合 - 比如长度为1-3,4-6,7-9 - 并相应地增加它们的增强。