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

时间:2018-10-19 04:16:12

标签: apache solr solrj solrcloud solr4

我想在查询期间在SOLR中忽略特殊字符。 例如 : 假设我们在SOLR中有一个文档,其内容为:我叫A-B-C

内容:A-B-C 重新调谐文档 但是 content:ABC 不返回任何文档。

我的要求是content:ABC应该退还该一份文件。 所以基本上我想在查询期间忽略它。

2 个答案:

答案 0 :(得分:2)

要在令牌之间有特殊字符时将它们串联起来(即A-B-C应该与ABC匹配,而不仅仅是A),可以使用PatternReplaceCharFilter。这将使您可以用空字符串替换所有这些字符,从而有效地将ABC赋予分析过程的下一步。

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

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

在索引编制和查询时都应执行此操作(只要您也希望用户也能够查询A-B-C)。如果您想对这些匹配进行不同的评分,请使用具有不同分析链的多个字段-例如,保留一个字段仅对空白进行标记化,如果在{{1上有一个匹配项,则将其提高到更高的水平(使用qf=text_ws^5 other_field) }}。

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

答案 1 :(得分:1)

在这里您必须具有字段内容的字段类型。

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

在这里,您可以使用"A-B-C"来创建内容ABC, A-B-C"Word Delimiter Token Filter"的索引。

使用catenateWords。添加为catenateWords = 1。 它将如下工作: “热点传感器”→“热点传感器”。在您的情况下为“ 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

进行搜索