在一个非常简单的情况下,我有三个文档,文件名分别为“Lark”,“Larker”和“Larking”(无文件扩展名)。在solr中,我索引了这三个文档,将文件名映射到“title”字段。当我搜索“Lark”时,将返回所有三个文档(这是我想要的),但是它们的得分都相同。我希望“ lark ”的得分最高,因为它与我的查询完全匹配,其他的紧随其后。
<field name="title" type="text_general" indexed="true" stored="true" multiValued="false"/>
<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
我相信他们获得相同分数的原因是因为在索引时间使用了
EdgeNGramFilterFactory
。每个文档的索引分别为“La”,“Lar”,“Lark”,其中两个文档(“Larker”和“Larking”)带有一些其他变体的索引。因此,实际上每个文档都与查询“Lark”完全匹配。我想以某种方式执行查询,其中术语“Lark”将返回所有三个文档,但标题为“Lark”的文档将比其他文档返回更高的位置。查询调试结果:
<lst name="debug">
<str name="rawquerystring">Lark</str>
<str name="querystring">Lark</str>
<str name="parsedquery">text:lark</str>
<str name="parsedquery_toString">text:lark</str>
<lst name="explain">
<str name="543d6ee4cbb33c26bbcf288b/xxnullxx/543d6ef9cbb33c26bbcf2892">
2.7104912 = (MATCH) weight(text:lark in 0) [DefaultSimilarity], result of:
2.7104912 = fieldWeight in 0, product of:
1.4142135 = tf(freq=2.0), with freq of:
2.0 = termFreq=2.0
3.8332133 = idf(docFreq=3, maxDocs=68)
0.5 = fieldNorm(doc=0)
</str>
<str name="543d6ee4cbb33c26bbcf288b/xxnullxx/543d6ef9cbb33c26bbcf2893">
2.7104912 = (MATCH) weight(text:lark in 1) [DefaultSimilarity], result of:
2.7104912 = fieldWeight in 1, product of:
1.4142135 = tf(freq=2.0), with freq of:
2.0 = termFreq=2.0
3.8332133 = idf(docFreq=3, maxDocs=68)
0.5 = fieldNorm(doc=1)
</str>
<str name="543d6ee4cbb33c26bbcf288b/xxnullxx/543d6ef9cbb33c26bbcf2894">
2.7104912 = (MATCH) weight(text:lark in 2) [DefaultSimilarity], result of:
2.7104912 = fieldWeight in 2, product of:
1.4142135 = tf(freq=2.0), with freq of:
2.0 = termFreq=2.0
3.8332133 = idf(docFreq=3, maxDocs=68)
0.5 = fieldNorm(doc=2)
</str>
最佳答案
为了增强精确匹配,您可以创建一个新字段,名为“exact_title”,其新类型为“text_exact”,其中没有EdgeNGramFilterFactory。
在您的模式中,您可以使用以下行:
<copyField source="title" dest="exact_title"/>
将标题复制到exact_title。
然后针对两个字段(标题和确切标题)运行查询。如果查询与确切的标题匹配,则具有该确切标题的文档将获得比其他文档更高的分数,并且将升至顶部。