Solr-将分析器的结果写入不同字段

Solr-将分析器的结果写入不同字段,solr,field,analyzer,Solr,Field,Analyzer,我已经阅读了一些教程并浏览了Solr文档。但有一件事我不清楚。让我解释一下: 让我们假设以下文档应编入索引: <doc> <field name="id">R12345</field> <field name="title">My title</field> <field name="content">My Content</field> </doc> 我的想法是使用一个分析器来进行分析

我已经阅读了一些教程并浏览了Solr文档。但有一件事我不清楚。让我解释一下:

让我们假设以下文档应编入索引:

<doc>
  <field name="id">R12345</field>
  <field name="title">My title</field>
  <field name="content">My Content</field>
</doc>
我的想法是使用一个分析器来进行分析。分析器的结果将像往常一样写入索引中的字段“id”(仅为原始文本的副本),但结果“Resolve”或“Contribute”应写入另一个字段

我的基本问题是:如何在分析器中实现这一点?为了使其更复杂,索引字段“docType”应该是可搜索的,并且必须在搜索结果中可用。字段id和docType的模式看起来如何

提前谢谢
Tobias

如果只需要索引值,那么模式方法就足够了。创建执行必要处理的新字段类型,创建新类型的字段,并设置复制字段以从
id
复制值:

<fieldType name="doctypeField" class="solr.TextField">
  <analyzer type="index">
    <tokenizer class="solr.KeywordTokenizerFactory"/>
    <filter class="solr.PatternReplaceFilterFactory" pattern="([CR]).*" replacement="$1" replace="all" />
    <filter class="solr.PatternReplaceFilterFactory" pattern="C" replacement="Contribute" replace="all" />
    <filter class="solr.PatternReplaceFilterFactory" pattern="R" replacement="Resolve" replace="all" />
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.KeywordTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

<field name="doctype" type="doctypeField" indexed="true" stored="false" required="false" />

<copyField source="id" dest="doctype"/>


您可能需要注意的是,您不会从中获得存储值。如果需要,那么在将文档提供给Solr之前,应该先计算docType值——例如,在SQL查询中创建文档,如果您的内容源是SQL,等等。

谢谢您的快速回答。如果我理解正确,是否不直接复制到索引,而是在分析器运行之前将源内容复制到目标字段,然后将分析器结果保存在索引中?好主意,好答案,非常感谢。也可以使用Java源代码将分析器中的值写入自定义索引字段吗;首先进行现场复制,然后进行分析。如果要创建自定义分析器,请参见:
<fieldType name="doctypeField" class="solr.TextField">
  <analyzer type="index">
    <tokenizer class="solr.KeywordTokenizerFactory"/>
    <filter class="solr.PatternReplaceFilterFactory" pattern="([CR]).*" replacement="$1" replace="all" />
    <filter class="solr.PatternReplaceFilterFactory" pattern="C" replacement="Contribute" replace="all" />
    <filter class="solr.PatternReplaceFilterFactory" pattern="R" replacement="Resolve" replace="all" />
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.KeywordTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

<field name="doctype" type="doctypeField" indexed="true" stored="false" required="false" />

<copyField source="id" dest="doctype"/>