【问题标题】:Adding non-word allowances to WordDelimiterFilter向 WordDelimiterFilter 添加非单词津贴
【发布时间】:2015-07-28 09:34:53
【问题描述】:

我现在正在实施一些基于 Solr 的解决方案,但我被困在一个点上。我正在尝试采用这样的方式:IM extractor smooth wire 1.5x60cm 并将其拆分为:IM extractor smooth wire 1.5 60 cm

当然,多亏了 StandardTokenizerFactory,基于单词的部分很容易工作。轻松活泼的。症结在于尺寸。有时会有 12 毫米 x 15 毫米,其中两个尺寸都有与合格编号相关的规定测量类型 (mm)。其他时候,它们会像我的示例一样一起运行。

因此,WordDelimiterFilter 似乎可以派上用场,帮助将 numeric->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"/>

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

谢谢!

【问题讨论】:

    标签: regex solr lucene


    【解决方案1】:

    试试这个

    ([\d\.]+)x([\d\.]+)[ ]*cm
    

    我会解释的

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

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

    这个字符类可以重复 1 - 无限次,由它后面的 + 号指定。

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

    【讨论】:

      猜你喜欢
      • 2018-06-30
      • 1970-01-01
      • 2014-09-18
      • 2022-11-28
      • 2023-01-18
      • 1970-01-01
      • 2014-02-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多