【问题标题】:SOLR - remove all other results if exact match is foundSOLR - 如果找到完全匹配,则删除所有其他结果
【发布时间】:2018-07-30 09:28:36
【问题描述】:

我正在使用 EgdeNGramFilterFactory 来匹配产品 EAN 代码。

如果找到确切的现有 EAN,是否有可能删除所有其他结果? Solr 总是首先显示最相关的 EAN,我只想尽可能只显示那个。

我已经阅读了很多关于 stackoverflow 的答案,但他们都提到了 boost,这对我来说不是问题。结果分数还可以,就我而言,如果找到完全匹配,则完全删除所有其他结果。

当前行为:

EAN 列表:12345、12347、12389

搜索:123,结果:12345、12347、12389

搜索:12345,结果:12345、12347、12389

想要的行为:

搜索:123,结果:12345、12347、12389

搜索:12345,结果:12345

<field name="ean" type="string" indexed="true" stored="true"/>

<field name="SuggestEan" type="text_suggest_edge_ngram_single" indexed="true" stored="true"/>
<copyField source="ean" dest="SuggestEan" maxChars="30000"/>

<fieldType name="text_suggest_edge_ngram_single" class="solr.TextField">
    <analyzer>
        <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
        <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="\W+" replacement=""/>
        <tokenizer class="solr.KeywordTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.EdgeNGramFilterFactory" maxGramSize="30" minGramSize="3"/>
    </analyzer>
</fieldType>

QF: ean^10 SuggestEan^8

【问题讨论】:

  • 有什么理由不能在调用 Solr 的控制器中处理它?由于它是完全匹配,因此进行比较而不显示更多条目应该最多几行代码。
  • 我想充分利用 Solr 配置,因此我不必进一步处理结果。但到目前为止,这似乎确实是唯一的解决方案。谢谢。
  • 您也可以进行两个查询 - 因为完全匹配是针对一个只会返回单个文档的字段,所以在任何情况下都应该非常快。
  • MatsLindh 请将此添加为答案,以便我关闭问题。这确实是最好的方法,因为完全匹配查询非常快。

标签: solr match


【解决方案1】:

要么在进行 Solr 调用的控制器中处理它(精确匹配的直接比较只需要 == 和 if 子句),要么执行两个查询 - 一个检索精确匹配和一个做定期搜索。

如果第一次搜索成功(这是直接匹配,在大多数情况下将是快速索引查找),请不要进行第二次查询。

【讨论】:

    【解决方案2】:

    您可以创建自定义后过滤器或自定义搜索组件。但正如 MatsLindh 建议的那样,在 Solr 客户端中执行此操作可能是最简单的。

    【讨论】:

    • 谢谢,我会听从 MatsLindth 的建议。现在写 JAVA 组件对我来说有点过头了,因为我主要使用 PHP 编程 :)
    猜你喜欢
    • 2019-05-17
    • 2018-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-28
    • 1970-01-01
    • 2021-01-12
    • 1970-01-01
    相关资源
    最近更新 更多