我现在正在实施一些基于Solr的解决方案,而且我只是坚持一点。我试图采取类似这样的行为:IM extractor smooth wire 1.5x60cm
并将其拆分为:IM extractor smooth wire 1.5 60 cm
基于单词的部分可以很容易地工作,当然,多亏了StandardTokenizerFactory。轻松活泼的。贴点是尺寸。有时会有12mmx15mm,其中两个尺寸都具有与合格数字相关的规定测量类型(mm)。其他时候他们会像我的例子一样一起跑。
因此,WordDelimiterFilter似乎可以帮助将数字 - > alpha序列分解为12
和mm
。但问题是,它会将1.5
分为1
和5
,并将.
视为分隔符。
我已经尝试过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"/>
它实现了我的目标,但如果你有想法,我当然愿意接受任何更好的解决方法。
谢谢!
答案 0 :(得分:0)
试试这个
PS4
我会解释
PS4
内的RegEx是一个捕获组(您要保存的匹配项)
此([\d\.]+)x([\d\.]+)[ ]*cm
是一个字符类,这意味着您指定了一个与您的模式匹配的字符,在这种情况下,对于任何数字加()
加上转义点[]
的分隔符(您可以添加) /用逗号切换。
此字符类可以重复1 - 无穷大时间,由其后面的+号指定。
\d
是字面字符,然后我们重复第一个捕获组,后跟任意数量的空格,后跟'cm'