Solr的:使用正则表达式分段器提取段落
-
21-08-2019 - |
题
我张贴了这个消息,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岁。和 这些小家伙最终会得到 大得多。他们会成长
你可以看到,它开始用了一段,并就一个字字符结尾!这几乎就像如果碎片刚刚走出,他们将和正则表达式是没有做任何事情,但结果是不同的,当我使用的差距分段器。在上面的结果,我看不出有任何理由为什么它不应该剥离出来前段时期和最后两个词,有足够的空间在坡和正则表达式模式。请帮我找出我做错了......
非常感谢,
标记
解决方案
尝试:
\w[^\.!\?]{400,600}[\.!\?]
您不应该需要大约\w
第一方括号
和你应该逃脱最后的点。
我不认为.*
之前另一量词({400,600}
)是一个不错的主意,因此.{400,600}
由于?
是在正则表达式的特殊字符,你也应该逃避它。
和自.
匹配任何东西,你倒是应该以匹配任何使用[^\.!\?]
的但的你结束字符。
其他提示
我从来没有听说过你与(SOLR)是工作的工具,但在你的正则表达式的量词是绝对错误的。此正则表达式匹配402和602之间的字符,其中,所述第一个是字字符,最后是三个标点字符之一:
\w.{400,600}[.!?]
在点和问号是不是一个字符类中的元字符,所以没有点逃避它们。 \ W可以独立存在。
由于点也是3个标点字符匹配,你的正则表达式匹配尽可能多的字符可能(最多602),然后给回,以确保最后一个是你的3个标点符号之一。
如果您要短版印刷的优先级,使用惰性限定符:
\w.{400,600}?[.!?]
如果你希望你的正则表达式匹配只有一句话,用一个否定的字符类:
\w[^.!?]{400,600}[.!?]
所有上述假定的Solr使用Perl风格的正则表达式。像\ w和东西{} 400,600不会在所有的正则表达式的口味工作。
有似乎是一个问题,如果您使用的是WordDelimiterFilterFactory
。问题是这里所描述的 HTTP://www.mail- archive.com/solr-user@lucene.apache.org/msg30631.html
如上面的链路所描述的,一个解决方案可能是preserveOriginal="1"
添加到WordDelimiterFilterFactory
。我想这和它的工作对我来说。然而,(新的被向SOLR)不知道是否有任何缺点这种方法(除了增加索引的大小)。