【问题标题】:Indexing different fields with different fieldtype in Sunspot (Solr)在 Sunspot (Solr) 中用不同的字段类型索引不同的字段
【发布时间】:2011-08-20 17:51:13
【问题描述】:

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

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

【问题讨论】:

    标签: solr sunspot sunspot-rails


    【解决方案1】:

    正如您所注意到的,您可以在 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 块中创建单独的行相比,您可能会有更多重复。

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

    【讨论】:

    • 好吧,看起来这实际上是最好的方法。感谢 cmets
    猜你喜欢
    • 2019-07-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-22
    相关资源
    最近更新 更多