向WordDelimiterFilter添加非单词限额

时间:2015-05-16 14:22:27

标签: regex solr lucene

我现在正在实施一些基于Solr的解决方案,而且我只是坚持一点。我试图采取类似这样的行为:IM extractor smooth wire 1.5x60cm并将其拆分为:IM extractor smooth wire 1.5 60 cm

基于单词的部分可以很容易地工作,当然,多亏了StandardTokenizerFactory。轻松活泼的。贴点是尺寸。有时会有12mmx15mm,其中两个尺寸都具有与合格数字相关的规定测量类型(mm)。其他时候他们会像我的例子一样一起跑。

因此,WordDelimiterFilter似乎可以帮助将数字 - > alpha序列分解为12mm。但问题是,它会将1.5分为15,并将.视为分隔符。

我已经尝试过CharPatternReplacement以及将这些模式添加到受保护的单词中以供WordDelimiterFilter忽略(例如我有" QQ"使用模式(\d+)[.](\d+)替换数字之间的任何句点)但到目前为止我没有尝试过的任何东西让我进入目标标记化。

我可以在受保护的文字文件中使用正则表达式吗?是否有一个我未考虑的过滤器可以帮助我拆分mm但不拆分1.5

感谢您的任何想法!

更新 我提出了一个解决方案,但它并不像我希望的那样优雅。它只是像PatternReplace CharFilters的堆叠一样

<!-- space in place of mm -->
        <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="(\d+)(mm|MM)" replacement="$1 $2"/>
        <!-- space in place of in -->
        <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="(\d+)(in|IN)" replacement="$1 $2"/>
        <!-- space in place of cm -->
        <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="(\d+)(cm|CM)" replacement="$1 $2"/>

它实现了我的目标,但如果你有想法,我当然愿意接受任何更好的解决方法。

谢谢!

1 个答案:

答案 0 :(得分:0)

试试这个

PS4

我会解释

PS4内的RegEx是一个捕获组(您要保存的匹配项)

([\d\.]+)x([\d\.]+)[ ]*cm 是一个字符类,这意味着您指定了一个与您的模式匹配的字符,在这种情况下,对于任何数字加()加上转义点[]的分隔符(您可以添加) /用逗号切换。

此字符类可以重复1 - 无穷大时间,由其后面的+号指定。

\d是字面字符,然后我们重复第一个捕获组,后跟任意数量的空格,后跟'cm'