在 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>
这将创建多个索引,您将能够使用 ABC
和 A-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
) =].
这不会改变字段实际存储的内容,因此返回的数据仍然相同 - 只是匹配的执行方式。
我想在 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>
这将创建多个索引,您将能够使用 ABC
和 A-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
) =].
这不会改变字段实际存储的内容,因此返回的数据仍然相同 - 只是匹配的执行方式。