【问题标题】:Solr: Combining PatternTokenizerFactory and PathHierarchyTokenizerFactory?Solr:结合 PatternTokenizerFactory 和 PathHierarchyTokenizerFactory?
【发布时间】:2014-08-02 00:05:34
【问题描述】:

简而言之:

schema.xml 我想声明一个 analyzerPatternTokenizer 分解一个字段,然后我想拥有那些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 将字段 taxo_paths 拆分为这些标记 pattern=",":

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

那么PathHierarchy应该发挥它的魔力并将它们变成:

  • 一个
  • 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 来创建同义词;假设我现在也不关心这个。

【问题讨论】:

  • 所以您面临的主要问题是solr.PatternTokenizerFactorysolr.PathHierarchyTokenizerFactory 都是分词器,您只能在分析器链中指定一个分词器,对吧?
  • @arun 是的,就是这样。我真的认为如果打包为过滤器,两者都会很有用,我可以想象将两者与其他逻辑混合和匹配的场景。

标签: csv solr tokenize taxonomy


【解决方案1】:

这是一种可能的方法。

我们必须放弃一个分词器,因为一个分析器链只能有一个分词器。这个解决方案放弃了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 分析输出的样子:

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

【讨论】:

  • 天哪,我应该明确指出它们是可变长度的字母数字和空格,并且只是使用“A”、“B”和“C”作为任意标签,但无论如何感谢!令我恼火的是,两者都仅作为标记器打包,似乎其中任何一个都可以用作标记过滤器。从长远来看,我可能会尝试重构它们并将其作为 JIRA 补丁提交,但是直到/如果它们被打包为标准发行版的一部分,对于易于使用/部署来说仍然会很麻烦;对于忙碌的客户来说,折叠自定义补丁或罐子比一些编码人员意识到的更麻烦;-)
  • 尝试询问 solr 用户组。那里的人非常有帮助(但在 stackoverflow 上不那么活跃)。
【解决方案2】:

一种方法是在分析器链之前以 coma 拆分,特别是在 UpdateRequestProcessor 中。不幸的是,我不知道 URP 会拆分,只有一个会拆分 joining

【讨论】:

  • 我一直在想同样的事情。 CloneFieldUpdateProcessor 就在附近,但不完全是。
猜你喜欢
  • 2011-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-07
相关资源
最近更新 更多