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