2

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

为此,我在我的 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 全文查询中使用它?

4

1 回答 1

2

正如您所注意到的,您可以searchable为您希望以多种不同方式编制索引的字段复制块中的行。我实际上建议这样做,因为您实际上维护了一些更精细的字段(如下所示),并且您有一些不错的 Sunspot 助手,例如 inline:boost选项。

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

<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

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

于 2011-08-20T22:26:11.410 回答