在 SOLR 查询期间忽略特殊字符

Ignoring special characters during query time in SOLR

我想在 SOLR 查询期间忽略特殊字符。 例如 : 假设我们在 SOLR 中有一个文档 content:My name is A-B-C .

content:A-B-C 返回文档 但是 content:ABC 没有 return 任何文档。

我的要求是 content:ABC 应该 return 那一份文件。 所以基本上我想忽略它 - 在查询期间。[​​=10=]

此处您的字段内容必须有一个字段类型。

字段类型可以有 2 个独立的分析器。一个用于索引,一个用于查询。

在这里,您可以使用 "Word Delimiter Token Filter" .

创建内容 "A-B-C" 的索引,例如 ABC, A-B-C

使用catenateWords。添加为 catenateWords = 1。 它将按如下方式工作: "hot-spot-sensor’s" → "hotspotsensor"。在你的情况下 "A-B-C"。它将生成 "ABC"

这是它的例子Word Delimiter Filter

用法:

<analyzer type="index">
  <tokenizer class="solr.WhitespaceTokenizerFactory"/>
  <filter class="solr.WordDelimiterGraphFilterFactory" preserveOriginal="true" catenateWords="1"/>
</analyzer>

<analyzer type="query">
  <tokenizer class="solr.WhitespaceTokenizerFactory"/>
</analyzer>

这将创建多个索引,您将能够使用 ABCA-B-C

进行搜索

要在标记之间有特殊字符时将它们连接起来(即 A-B-C 应该匹配 ABC 而不仅仅是 A),您可以使用 PatternReplaceCharFilter.这将允许您用空字符串替换所有这些字符,有效地将 ABC 改为分析过程的下一步。

<analyzer>
  <charFilter class="solr.PatternReplaceCharFilterFactory"
             pattern="[^a-zA-Z0-9 ]" replacement=""/>
  <tokenizer ...>
  [...]
</analyzer>

这将保留所有常规的 ascii 字母、数字和空格,同时用空字符串替换任何其他字符。您可能需要调整该字符组以包含更多内容,但这取决于您的原始内容及其处理方式。

这应该在索引和查询时完成(只要您希望用户也能够查询 A-B-C)。如果您想对这些匹配项进行不同的评分,请使用具有不同分析链的多个字段 - 例如,保留一个字段仅对空格进行标记化,然后如果您在 [=11] 上有匹配项,则将其提高(使用 qf=text_ws^5 other_field) =].

这不会改变字段实际存储的内容,因此返回的数据仍然相同 - 只是匹配的执行方式。