Solr:结合PatternTokenizerFactory和PathHierarchyTokenizerFactory?

时间:2014-08-02 00:05:34

标签: csv solr tokenize taxonomy

简而言之:

schema.xml 中我想声明分析器 PatternTokenizer 拆分字段,然后我想要那些值由 PathHierarchyTokenizer 处理。

(Path Tokenizer将" a / b / c"等路径分解为[a,a / b,a / b / c])

问题的更长版本:

我的整体数据不是CSV,但我有一个包含逗号分隔值的字段;从逻辑上讲,它就像一个多值字段,但它只是作为一个分隔字符串传入。

这些单独的值恰好是带有斜杠分隔符的分类路径。

所以文档可能如下:

<doc>
  <field name="id">12345</field>
  <field name="title">This is the Title</field>
  <field name="taxo_paths">A/B/C,D/E,F/G/H/I</field>
</doc>

首先,它应该通过 PatternTokenizer pattern=","将字段 taxo_paths 拆分为这些代币:

  • A / B / C
  • d / E
  • F / G / H / I

然后 PathHierarchy 应该发挥作用并将它们变成:

  • A
  • A / B
  • A / B / C
  • d
  • d / E
  • ˚F
  • F / G
  • F / G / H
  • F / G / H / I

Path Hierarchy tokenizer非常酷!

我们假设我无法控制数据的来源。并假设我们不想使用任何自定义Java过滤器或标记器。此外,我意识到在PathHierarchyTokenizer中有一个巧妙的例子,它实际上只是通过将一个标记的标记偏移设置为1并且休息为0来创建同义词;让我们假设我现在不关心这个。

2 个答案:

答案 0 :(得分:0)

这是一种可能的方法。

我们必须放弃其中一个标记器,因为分析器链只能有一个标记器。这个解决方案放弃solr.PathHierarchyTokenizerFactory(抱歉,我放弃了你最喜欢的标记器;))。

一旦我们在逗号上使用solr.PatternTokenizerFactory分割了令牌,我们将使用edge N-gram filter后跟Pattern Replace过滤器来删除以正斜杠结尾的令牌,最后修剪零 - 长度令牌。

这是fieldType定义:

<fieldType name="text_ptn" class="solr.TextField" positionIncrementGap="100">
  <analyzer>
      <tokenizer class="solr.PatternTokenizerFactory" 
                 pattern="," 
                 group="-1"/>
      <filter class="solr.EdgeNGramFilterFactory" 
              minGramSize="1" 
              maxGramSize="100" 
              side="front"/>
      <filter class="solr.PatternReplaceCharFilterFactory" 
              pattern="^.*/$" 
              replacement=""/>
      <filter class="solr.LengthFilterFactory" 
              min="1" 
              max="10"/>
  </analyzer>
</fieldType>

这是我的Solr 4.2分析输出的样子:

enter image description here

编辑:只有当分类中的组件术语是单个字符时,此解决方案才有效。

答案 1 :(得分:0)

实现这一目标的一种方法是在分析器链之前拆分昏迷,特别是在UpdateRequestProcessor中。不幸的是,我不知道URP正在进行分裂,只有joining。{/ p>