Solr复制字段复制到另一个字段

时间:2018-08-07 10:42:31

标签: java apache search solr lucene


我有以下配置:

...

<field name="spellcheck" type="text_spell" indexed="true" stored="true" multiValued="true" />
<field name="spellcheck_de" type="text_spell_de" indexed="true" stored="true" multiValued="true" />
<field name="spellcheck_en" type="text_spell_en" indexed="true" stored="true" multiValued="true" />
<field name="spellcheck_fr" type="text_spell_fr" indexed="true" stored="true" multiValued="true" />
<field name="spellcheck_ja" type="text_spell" indexed="true" stored="true" multiValued="true" />
<field name="spellcheck_zh" type="text_spell" indexed="true" stored="true" multiValued="true" />
<field name="spellcheck_pt" type="text_spell_pt" indexed="true" stored="true" multiValued="true" />
<field name="spellcheck_it" type="text_spell_it" indexed="true" stored="true" multiValued="true" />
<field name="spellcheck_low" type="text_spell" indexed="true" stored="true" multiValued="true" />
<field name="spellchecksearch" type="text_spell_en" indexed="true" stored="false" multiValued="true" />

<copyField source="spellcheck_en" dest="spellcheck_low" />
<copyField source="spellcheck_low" dest="spellchecksearch" />
...

spellcheck_en 字段已经填充,并且已正确复制到 spellcheck_low 字段中,并且已正确建立索引(使用卢克索引查看器,我看到该字段的索引不为空)。但是, spellcheck_low 的副本似乎不起作用,因为 spellchecksearch 为空。注意: spellcheck_en spellcheck_low 字段均已索引和存储,而 spellchecksearch 则不存储而仅被索引。

为什么会这样呢?您可以弄清楚字段副本的工作原理,非常感谢:)

2 个答案:

答案 0 :(得分:2)

copyField指令不会作为图形进行评估-最初为source字段提交的值也用于填充dest给出的字段。

由于没有为spellcheck_low字段提交任何值,因此copyField指令最终复制了一个空值(..或根本没有执行)。

对于您来说,spellcheck_en字段必须有两个目的地:

<copyField source="spellcheck_en" dest="spellcheck_low" />
<copyField source="spellcheck_en" dest="spellchecksearch" />

这将与您尝试实现的相同,因为任何复制操作都将在任何处理或建立索引之前发生(更新处理器IIRC除外)。

答案 1 :(得分:1)

spellchecksearch为空,因为未存储。当一个字段被索引但没有存储时,它仅可用于搜索,但其值保持为空。并且它不会在值中返回。 有关详细信息,您可以阅读- Solr index vs stored

我认为,如果您对spellchecksearch字段进行索引并存储,您的问题将得到解决。