Solr:使用Regex fragmenter提取段落

时间:2008-12-12 22:01:41

标签: regex solr highlighting

我将此消息发布到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个字符之间匹配,从单词字符开始,以。!?中的一个结尾。以下是典型结果的示例:

  

。检查这些照片。九只熊猫   小熊第一次在展出   周四在中国西南部。他们是   不到一岁。他们只是   最近停止了护理。有   这些人中只有1,600人离开了   中国中部山林,   中国养殖的另外120个   设施和动物园。他们是关于   在动物园居住在中国以外的地方。   它们几乎完全存在于竹子上。   他们可以活到30岁。和   这些小家伙最终会得到   更大。他们会成长

正如你所看到的,它是从一个句号开始,以一个单词字符结束!这几乎就像片段刚刚出来一样,正则表达式根本没有做任何事情,但是当我使用间隙分段器时结果是不同的。在上面的结果中,我没有看到任何理由为什么它不应该剥离前一个时期和后两个词,在slop和正则表达式模式中有足够的空间。请帮我弄清楚我做错了什么......

非常感谢,

标记

3 个答案:

答案 0 :(得分:3)

尝试:

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

您不应该需要\w

周围的第一个方括号

你应该逃离最后一点。

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

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

由于.匹配任何内容,您应该使用[^\.!\?]来匹配任何结束字符。

答案 1 :(得分:1)

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

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

点和问号不是字符类中的元字符,因此没有必要转义它们。 \ w可以自立。

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

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

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

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

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

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

答案 2 :(得分:0)

如果您使用WordDelimiterFilterFactory,似乎有问题。这里描述了问题http://www.mail-archive.com/solr-user@lucene.apache.org/msg30631.html

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