Csv Solr:结合PatternTokenizerFactory和PathierarchyTokenizerFactory?

Csv Solr:结合PatternTokenizerFactory和PathierarchyTokenizerFactory?,csv,solr,tokenize,taxonomy,Csv,Solr,Tokenize,Taxonomy,简而言之: 在schema.xml中,我想声明一个分析器,用模式标记器拆分一个字段,然后我想让那些值由PathHierarchyTokenizer处理 (路径标记器将类似“a/b/c”的路径分解为[a,a/b,a/b/c]) 问题的较长版本: 我的总体数据不是CSV,但有一个字段包含逗号分隔的值;从逻辑上讲,它类似于一个多值字段,但它只作为一个分隔字符串传入 这些单独的值恰好是带有斜杠分隔符的分类路径 因此,文档可能看起来像: <doc> <field name="id"&

简而言之:

schema.xml中,我想声明一个分析器,用模式标记器拆分一个字段,然后我想让那些值由PathHierarchyTokenizer处理

(路径标记器将类似“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>

12345
这是标题
A/B/C、D/E、F/G/H/I
首先,它应该通过模式标记器将字段taxo_路径拆分为这些标记
pattern=“,”

  • A/B/C
  • 付款交单
  • F/G/H/I
然后,PathHierarchy应该发挥它的魔力,将它们变成:

  • A
  • A/B
  • A/B/C
  • D
  • 付款交单
  • F
  • F/G
  • F/G/H
  • F/G/H/I
路径层次标记器非常酷


假设我无法控制数据的输入方式。假设我们不想使用任何自定义Java过滤器或标记器。此外,我还意识到PathierarchyTokenizer中有一个微妙之处,它实际上是通过只将其中一个标记的标记偏移量设置为1,将其余标记设置为0来创建同义词;让我们假设我现在也不关心这个问题。

这里有一种可能的方法

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

一旦我们用逗号上的
solr.PatternTokenizerFactory
拆分了令牌,我们将使用后跟过滤器的方法删除以正斜杠结尾的令牌,最后删除零长度令牌

以下是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分析输出:


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

一种方法是在分析器链之前的coma上拆分,特别是在UpdateRequestProcessor中。不幸的是,我没有意识到URP正在进行拆分,只有一个这样做。

因此,您面临的主要问题是
solr.PatternTokenizerFactory
solr.pathierarchyTokenizerFactory
都是标记化器,您只能在analyzer链中指定一个标记化器,对吗?@arun-yup,就是这样。我真的认为,如果将两者打包为过滤器,它们都会很有用,我可以想象将两者与其他逻辑混合和匹配的场景。哦,天哪,我应该特别声明它们是可变长度的字母数字和空格,并且只是使用“A”、“B”和“C”作为任意标签,但无论如何,谢谢!让我恼火的是,两者都只打包为令牌化器,似乎其中任何一个都可以用作令牌过滤器。从长远来看,我可能会尝试重构它们并将其作为JIRA补丁提交,但直到/如果它们被打包为标准发行版的一部分,对于易于使用/部署来说仍然是一件麻烦事;对于繁忙的客户机,在自定义补丁或jar中折叠比一些编码人员意识到的更麻烦;-)尝试询问solr用户组。那里的人很有帮助(但在stackoverflow上不是很活跃)。我一直在想同样的事情。CloneFieldUpdateProcessor就在附近,但不完全在附近。