18

刚刚发现Solr 5不需要预定义模式文件,它会根据正在执行的索引生成模式。我想知道这在后台是如何工作的?

这是否是一个好习惯?有没有办法禁用它?

4

2 回答 2

33

从版本 4.3 开始,Solr 中就有无模式功能。但它现在可能更稳定,因为它的并发问题已在 4.10 中修复

它也称为托管模式。当您将 Solr 配置为使用托管模式时,Solr 使用特殊的 UpdateRequestProcessor 来拦截文档索引请求并猜测字段类型。

Solr 从您的schema.xml文件开始,并默认创建一个名为的新文件,managed-schema以存储所有推断的架构信息。Solr 在检测到架构更改时会自动覆盖此文件。

然后,如果要更改Schema ,则应使用Schema API 。另请参阅无模式模式文档

如何将 Solr 托管模式更改为经典模式

停止 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-schemaschema.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 的公司工作

于 2015-04-23T11:24:01.270 回答
1

这就是 Solr 中所谓的无模式模式。我不知道内部细节,它是如何实现的,等等。

bin/solr start -e schemaless

上面的这段代码将以无模式模式启动 Solr,如果您不这样做,它将照常工作。

有关无模式的更多信息,请查看此处 - https://cwiki.apache.org/confluence/display/solr/Schemaless+Mode

于 2015-04-23T10:20:56.617 回答