简而言之:
在 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 拆分为这些代币:
然后 PathHierarchy 应该发挥作用并将它们变成:
Path Hierarchy tokenizer非常酷!
我们假设我无法控制数据的来源。并假设我们不想使用任何自定义Java过滤器或标记器。此外,我意识到在PathHierarchyTokenizer中有一个巧妙的例子,它实际上只是通过将一个标记的标记偏移设置为1并且休息为0来创建同义词;让我们假设我现在不关心这个。
答案 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分析输出的样子:
编辑:只有当分类中的组件术语是单个字符时,此解决方案才有效。
答案 1 :(得分:0)
实现这一目标的一种方法是在分析器链之前拆分昏迷,特别是在UpdateRequestProcessor中。不幸的是,我不知道URP正在进行分裂,只有joining。{/ p>