我将此消息发布到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和正则表达式模式中有足够的空间。请帮我弄清楚我做错了什么......
非常感谢,
标记
答案 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来说是新手)我不知道这种方法是否有任何缺点(除了增加索引大小)。