在太阳黑子(Solr)中为不同字段索引不同字段

时间:2011-08-20 17:51:14

标签: solr sunspot sunspot-rails

我想设置我的索引,以便语音匹配结果的重量低于常规匹配。

为此,我在schema.xml中为文本创建了两个不同的fieldType集:

<fieldType name="text" class="solr.TextField" omitNorms="false">
  <analyzer>
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StandardFilterFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.ISOLatin1AccentFilterFactory"/>
    <filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="false"/>
  </analyzer>
</fieldType>
<fieldType name="text_phonetic" class="solr.TextField" omitNorms="false">
  <analyzer>
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StandardFilterFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.ISOLatin1AccentFilterFactory"/>
    <filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="false"/>
    <filter class="solr.PhoneticFilterFactory" encoder="DoubleMetaphone" inject="true"/>
  </analyzer>
</fieldType>

并创建了一个使用语音工厂的dynamcicField:

<dynamicField name="*_phonetic" stored="false" type="text_phonetic" multiValued="true" indexed="true"/>

现在在我的模型中我可以做类似的事情:

text :name, :as => :name_phonetic

它工作正常。

我的问题是,设置一堆字段以使用常规文本字段索引和语音字段的最佳方法是什么,对第一个字段有更高的提升?我可以在我的模型中复制我的所有索引行,但有没有办法让我直接在带有构造的模式中执行此操作并在sunspot全文查询中使用它?

1 个答案:

答案 0 :(得分:2)

如您所知,您可以复制searchable块中的行,以便以多种不同方式索引您要编入索引的字段。我实际上推荐这个,因为你实际上维护了一些更细粒度的字段(如下所示),并且你有一些很好的Sunspot助手,比如内联:boost选项。

也就是说,您也可以在架构中使用Solr的copyField指令。它看起来像这样:

<copyField source="source_field" dest="dest_field" maxChars="N" />

源字段名称可以是模式,但您的目标必须是单个字段。此外,我认为目的地必须定义为自己的field,而不是与dynamicField匹配的名称。

考虑到这些限制,您可以在架构中设置类似的内容:

<fields>
  ...
  <field name="all_text_phonetic" stored="false" type="text_phonetic" multiValued="true" indexed="true"/>
  ...
</fields>

<copyField source="*_text" dest="all_text_phonetic" />
<copyField source="*_texts" dest="all_text_phonetic" />

要保持字段的粒度,可以为每个传入字段设置copyField指令。但是,与searchable块中创建单独的行相比,您可能存在更多重复。

所以这是一个折腾。但那些是你的选择。