刚刚发现Solr 5不需要预定义模式文件,它会根据正在执行的索引生成模式。我想知道这在后台是如何工作的?
这是否是一个好习惯?有没有办法禁用它?
从版本 4.3 开始,Solr 中就有无模式功能。但它现在可能更稳定,因为它的并发问题已在 4.10 中修复。
它也称为托管模式。当您将 Solr 配置为使用托管模式时,Solr 使用特殊的 UpdateRequestProcessor 来拦截文档索引请求并猜测字段类型。
Solr 从您的schema.xml
文件开始,并默认创建一个名为的新文件,managed-schema
以存储所有推断的架构信息。Solr 在检测到架构更改时会自动覆盖此文件。
然后,如果要更改Schema ,则应使用Schema API 。另请参阅无模式模式文档。
停止 Solr:$ bin/solr stop
转到server/solr/mycore/conf
,其中“mycore”是您的核心/集合的名称。
编辑solrconfig.xml
:
<schemaFactory class="ManagedIndexSchemaFactory">
并评论整个元素<schemaFactory class="ClassicIndexSchemaFactory"/>
并取消注释<initParams>
引用add-unknown-fields-to-the-schema
并注释掉整个元素的元素<initParams>...</initParams>
重命名managed-schema
为schema.xml
,你就完成了。
您现在可以再次启动 Solr:$ bin/solr start
,转到http://localhost:8983/solr/#/mycore/documents并检查 Solr 现在是否拒绝索引具有尚未在 中指定的新字段的文档schema.xml
。
这取决于你想要什么。如果您想强制执行特定的文档结构(例如,根据您的定义确保所有文档都是“格式正确的”),那么您需要使用经典的模式管理。
另一方面,如果您事先不知道文档结构是什么,那么您可能想要使用无模式功能。
虽然它被称为无模式,但您可以索引的结构种类是有限的。顺便说一下,这对于 Solr 和 Elasticsearch 来说都是如此。例如,如果您首先索引此文档:
{"name":"John Doe"}
那么如果你接下来尝试索引一个这样的文档,你会得到一个错误:
{"name": {
"first": "Daniel",
"second": "Dennett"
}
}
这是因为在第一种情况下,该字段name
是字符串类型,而在第二种情况下,它是一个对象。
如果您想使用超出这些限制的索引,那么您可以使用SIREn - 它是一个开源的半结构化信息检索引擎,作为 Solr 和 Elasticsearch 的插件实现。(免责声明:我曾在开发 SIREn 的公司工作)
这就是 Solr 中所谓的无模式模式。我不知道内部细节,它是如何实现的,等等。
bin/solr start -e schemaless
上面的这段代码将以无模式模式启动 Solr,如果您不这样做,它将照常工作。
有关无模式的更多信息,请查看此处 - https://cwiki.apache.org/confluence/display/solr/Schemaless+Mode