【问题标题】:Performing EXACT match on SOLR search在 SOLR 搜索上执行精确匹配
【发布时间】:2026-02-19 01:55:02
【问题描述】:

我正在实施 SOLR 搜索。当我输入例如 Richard Chase 我得到 索引中的所有 Richards 和所有 Chase,如 Johnny Chase 等。实际上我只想返回与 Richard 和 Chase 都匹配的所有名称。

我的配置设置是

<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" enablePositionIncrements="true" />
    <!-- in this example, we will only use synonyms at query time
    <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
    -->
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

我的查询搜索文本字段

文本:理查德·蔡斯

任何想法我做错了什么?

【问题讨论】:

  • 还有一件事……搜索需要匹配案例,例如 Richard John Chase 或 Richard Chase 先生
  • 一方面说你想要 exact 匹配,然后接受“Richard John Chase”有点误导。 “理查德·蔡斯”!=“理查德·约翰·蔡斯”。对于 Solr 中的精确匹配,请参阅*.com/a/29105025/1389219

标签: solr


【解决方案1】:

您使用的是StandardTokenizerFactory,它遵循Word Boundary rules

这意味着你的单词会被空格分开。

如果你想要一个真正的完全匹配,即

Richard Chase 返回只包含 Richard Chase 的文档,那么你应该 KeywordTokenizerFactory

但正如你提到的,你想要 Richard John Chase 而不是 Johnny Chase,它告诉我你想要 Richard Chase 的匹配项.

您可以搜索Richard AND Chase 或将schema.xml 中的默认运算符更改为AND 而不是OR。请注意,此设置是全局设置。

【讨论】:

  • 是的,就是这样 - 我将拆分我的搜索词,然后使用 AND 构建我的查询。谢谢!
【解决方案2】:

您必须使用 PhraseQuery (text:"Richard Chase") 来获取 RicahardChase 彼此靠近的文档。如果您还想查找 Richard X. Chase,您可以使用 text:"richard chase"~1

http://www.solrtutorial.com/solr-query-syntax.html

【讨论】:

  • 这不会返回 exact 匹配项,因为会返回“Richard Chase Jr”之类的结果。
  • @vegemite4me,当然它也会返回这样的文件。在任何全文搜索系统中,精度和召回率之间总是存在权衡。如果您想在附近没有任何其他标记的情况下找到完全匹配,您始终可以使用 KeywordTokenizer 或只是 StrField 将命名实体放到另一个字段中。
【解决方案3】:

对于精确匹配,您可以在 solrconfig.xml 中将查询解析器的 mm(Minimum "Should" Match) 参数设置为 100%

<str name="mm">100%</str>

这指定了查询中必须匹配的最小子句数。或者您可以在请求中的查询时覆盖此参数(q.mm)

【讨论】:

    【解决方案4】:

    另一种选择是使用 copyField 将 text 的值复制到 string 类型字段,

    <field name="text_orig" type="string" />
    <copyField source="text" dest="text_orig" maxChars="1024"/>
    

    当您只需要进行完全匹配时,请在查询中使用text_orig 字段:

    text_orig:"Richard Chase"
    

    由于字符串类型不会被分析并且会按原样存储,因此只有精确查询会匹配它们。

    【讨论】: