![](/img/trans.png)
[英]Rails 4 solr sunspot in production environment schema.xml isn't being read
[英]How does Sunspot modify Solr's schema.xml? Does it modify it at all?
如果我错了,请告诉我,但我认为solr只需要schema.xml中已经提到过的字段。 所以,如果我有一个名为'title'的字段,我需要在模式中提到它。
在Sunspot的文档中没有提到修改schema.xml。 我只是想知道Sunspot如何修改schema.xml,允许自定义字段输入索引。
我也知道Sunspot使用RSolr来做事情。 因此,如果有办法修改架构并使用RSolr将数据从DB重新加载到Solr,请告诉我。
正如karmajunkie所暗示的那样,Sunspot使用自己的标准模式。 我将在这里详细介绍它的工作原理。
出于本讨论的目的,Solr模式主要由两部分组成:类型定义和字段定义。
type
定义通过指定类型名称,类型的Java类以及某些类型(特别是文本)的情况来设置类型,这是XML的从属块,用于配置如何处理该类型。
field
定义允许您定义字段的名称以及该字段中包含的值类型的名称。 这允许Solr将文档中字段的名称与其类型以及少数其他选项相关联,从而如何在索引中处理该字段的值。
Solr还支持dynamicField
定义,而不是静态字段名称,允许您指定其中包含glob的模式。 传入字段的名称可以与这些模式匹配,以确定其类型。
Sunspot的模式有一些内部使用字段的field
定义,例如ID和模型名称。 此外,Sunspot自由使用dynamicField
定义来根据类型建立命名约定。
这种字段命名约定的使用允许Sunspot定义一个配置DSL,用于创建从模型到准备由Solr索引的XML文档的映射。
例如,模型中的这个简单配置块......
searchable do
text :body
end
...将由Sunspot用于创建body_text
的字段名称。 此字段名称与架构中以下dynamicField
定义的*_text
模式匹配:
<dynamicField name="*_text" type="text" indexed="true" stored="false" multiValued="true"/>
这会将带有后缀_text
任何字段映射到Sunspot对text
类型的定义。 如果您查看Sunspot的schema.xml,您将看到许多其他类型和选项的类似约定。 例如, :stored => true
选项通常会在该类型的后缀上添加一个s
(例如, _texts
)。
根据我对客户和我自己的项目的经验,有两个很好的案例来修改Sunspot的架构。 首先,根据应用程序可能需要的不同功能更改text
字段的分析器。 其次,为了更精细的Solr分析仪应用,创建全新的类型(通常基于文本类型)。
例如,扩展搜索匹配与“模糊”搜索可以通过匹配特殊的基于文本的字段来完成,该字段也使用语言词干或NGrams。 原始text
字段中的标记可用于填充拼写检查,或用于提升完全匹配。 当更严格的匹配失败时,自定义text_ngram
或text_en
的标记可用于扩大搜索结果。
Sunspot的DSL提供了一个最终功能,用于将字段映射到这些自定义字段。 一旦设置了type
及其相应的dynamicField
定义,就可以使用Sunspot的:as
选项来覆盖基于约定的名称生成。
例如,为上面添加一个自定义ngram
类型,我们可能会使用以下Ruby代码再次使用NGrams处理正文:
searchable do
text :body
text :body_ngram, :as => 'body_ngram'
end
太阳黑子有一个库存模式,有点调整太阳黑子集成,坚持开发人员最不惊讶的原则 - 例如,股票solrconfig.xml设置为关闭自动提交,即使在生产中你想要打开它。 模式实际上与类型而不是字段有关 - 请参阅下面的链接以获取有关如何创建新字段类型的示例。 如果字段符合现有类型之一,则对字段建立索引是微不足道的。 例如:
class Blog
searchable do
text :title
end
end
在搜索过程中,你会做这样的事情:
class BlogSearch
def self.search(options={})
Sunspot.search(Blog) do
with(:title, options[:title]) if options[:title].present?
end
end
end
太阳黑子的维基有很多额外的文档。 这是一个添加自定义类型以允许ngram搜索的示例:
https://github.com/outoftime/sunspot/wiki/Wildcard-searching-with-ngrams
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.