我有一个字段“描述”,我正在搜索此文件的文本,具有默认的相似性评分。说,我已经搜索了“你好男人”,我得到的结果就像“你好芒果”,“你好男人怎么样”,“你好男人10”,“你好男人”,“你好男人”。所有这些都是预期的结果,但我想在部分匹配的最顶部显示完全匹配(这里是“你好男人”)。为了获得打字错误的结果,我在索引和查询时使用了nGramFilterFactory,这是必需的。我唯一担心的是完全匹配不会出现在顶部。
请建议我们如何做到这一点或我需要采取何种方法。请帮忙。
答案 0 :(得分:1)
您应该在schema.xml
中定义另一个不对您的数据进行任何分析的字段。在您的情况下,最简单的方法可能是执行以下操作:
<field name="exact_description" type="string" indexed="true" stored="false" multiValued="true" />
<copyField source="originalColumnName" dest="exact_description" docValues="true" />
使用string
类型会使Solr无法为您的数据进行标记或其他任何操作。
然后,在构建查询时,您可以在查询的其余部分之前添加以下内容:
exact_description:"hello man"^100.0
确保您在^100.0
上加注(exact_description
),因此完全匹配将被强制显示在搜索结果的顶部。
创建新字段时,请确保将其基于尚未对其执行任何分析的字段。例如,在我的架构中,我有一个名为exact_match
的字段,该字段从以下内容复制而来:
<field name="match" type="string" indexed="false" stored="true" required="false" omitNorms="true" />
现在,我可以在搜索中使用match
进行完全匹配,因为match
只是一个字符串,但出于规范原因,我必须像这样创建exact_match
:
<field name="exact_match" type="string" indexed="true" stored="false" multiValued="true" />
<copyField source="match" dest="exact_match" docValues="true" />