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

时间:2010-10-19 07:14:49

标签: solr field analyzer

我已阅读了几篇教程并浏览了Solr文档。但有一点我不清楚。让我解释一下:

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

<doc>
  <field name="id">R12345</field>
  <field name="title">My title</field>
  <field name="content">My Content</field>
</doc>

与此文档相反,索引应包含一个名为“docType”的额外字段。应使用“完成规则”填充此额外索引字段。这背后的想法:

如果id以字符“R”开头,则将字符串“Resolve”写入索引中的字段docType。如果id以字符“C”开头,则将字符串“Contribute”写入索引中的字段docType。

上述文件应该在索引中提供,并带有以下字段:

id=R12345
title=My Title
content=My Content
docType=Resolve

我的想法是为此使用分析器。然后,分析器的结果将像往常一样写入索引中的字段“id”(仅原始文本的副本),但结果“Resolve”或“Contribute”应写在另一个字段中。

我的基本问题是:如何在分析器(Java snipped)中实现这一目标?为了使其更复杂,索引字段“docType”应该是可搜索的,并且必须在搜索结果中可用。架构id和docType的架构如何?

提前致谢 托拜厄斯

1 个答案:

答案 0 :(得分:6)

如果您只需要索引值,那么架构方法就足够了。创建一个新的字段类型,执行必要的处理,创建新类型的字段,并设置复制字段以复制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查询中创建它。