2

我将此消息发布到 Solr 邮件列表,但我也在此处尝试,以防附近有 Solr 专家潜伏。

我正在尝试使用正则表达式分段器并且很难获得我想要的结果。我正在尝试获取以单词字符开头并以标点符号结尾的片段,但由于某种原因,返回给我的片段似乎非常不灵活,尽管我已经提供了很大的斜率。以下是我正在使用的相关参数,也许有人可以帮助指出我哪里出错了:

<str name="hl.fragsize">500</str>
<str name="hl.fragmenter">regex</str>
<str name="hl.regex.slop">0.8</str>
<str name="hl.regex.pattern">[\w].*{400,600}[.!?]</str>
<str name="hl">true</str>
<str name="q">chinese</str>

这应该匹配 400-600 个字符,以单词字符开头并以 .!? 之一结尾。以下是典型结果的示例:

. 检查这些图片。周四,九只熊猫幼崽在中国西南地区首次展出。他们还不到一岁。他们最近才停止哺乳。中国中部山区森林里只剩下1600只这些家伙,中国的繁育设施和动物园里还有120只。他们大约有 20 岁,住在中国以外的动物园里。它们几乎完全存在于竹子上。他们可以活到30岁。这些小家伙最终会变得更大。他们会成长

如您所见,它以句点开头并以单词字符结尾!就好像片段只是按原样出现,而正则表达式根本没有做任何事情,但是当我使用间隙片段器时结果会有所不同。在上面的结果中,我看不出有什么理由不应该去掉前面的句号和最后两个词,在 slop 和正则表达式模式中有足够的空间。请帮我弄清楚我做错了什么......

非常感谢,

标记

4

3 回答 3

3

尝试:

\w[^\.!\?]{400,600}[\.!\?]

你不应该需要第一个方括号\w

你应该避开最后一个点。

而且我认为.*在另一个量词 ( {400,600}) 之前不是一个好主意,因此.{400,600}

由于?是正则表达式中的特殊字符,您也应该对其进行转义。

因为.匹配任何东西,你应该使用[^\.!\?]它来匹配除了的结尾字符之外的任何东西。

于 2008-12-12T22:15:42.040 回答
1

我从未听说过您正在使用的工具(Solr),但是您的正则表达式中的量词肯定是错误的。此正则表达式将匹配 402 到 602 个字符,其中第一个是单词字符,最后一个是三个标点字符之一:

\w.{400,600}[.!?]

点和问号不是字符类中的元字符,因此转义它们没有意义。\w 可以独立存在。

由于点也匹配 3 个标点字符,因此您的正则表达式将匹配尽可能多的字符(最多 602 个),然后返回以确保最后一个是您的 3 个标点字符之一。

如果您想优先考虑较短的运行,请使用惰性量词:

\w.{400,600}?[.!?]

如果您希望您的正则表达式仅匹配一个句子,请使用否定字符类:

\w[^.!?]{400,600}[.!?]

以上所有假设 Solr 使用 Perl 风格的正则表达式。像 \w 和 {400,600} 这样的东西并不适用于所有正则表达式。

于 2008-12-13T12:55:24.433 回答
0

如果您使用的是WordDelimiterFilterFactory. 此处描述了该问题http://www.mail-archive.com/solr-user@lucene.apache.org/msg30631.html

如上面链接中所述,一种解决方案可能是添加preserveOriginal="1"到您的WordDelimiterFilterFactory. 我试过这个,它对我有用。但是,(对 SOLR 来说是新手)我不知道这种方法是否有任何缺点(除了增加索引大小)。

于 2011-06-28T08:58:46.787 回答