【发布时间】:2015-07-01 10:14:23
【问题描述】:
刚刚发现 Solr 5 不需要预定义架构文件,它会根据正在执行的索引生成架构。我想知道这在后台是如何工作的?
这是否是一个好习惯?有什么办法可以关闭吗?
【问题讨论】:
刚刚发现 Solr 5 不需要预定义架构文件,它会根据正在执行的索引生成架构。我想知道这在后台是如何工作的?
这是否是一个好习惯?有什么办法可以关闭吗?
【问题讨论】:
这就是 Solr 中所谓的无模式模式。我不知道内部细节,它是如何实现的等等。
bin/solr start -e schemaless
上面的这个 sn-p 将以无模式模式启动 Solr,如果你不这样做,它将照常工作。
有关无模式的更多信息,请查看此处 - https://cwiki.apache.org/confluence/display/solr/Schemaless+Mode
【讨论】:
The schemaless feature has been in Solr since version 4.3。但它可能只是现在更稳定为a concurrency issue with it was fixed in 4.10。
它也被称为托管模式。当您将 Solr 配置为使用托管模式时,Solr 使用特殊的 UpdateRequestProcessor 来拦截文档索引请求并猜测字段类型。
Solr 从您的schema.xml 文件开始,并创建一个默认名为managed-schema 的新文件来存储所有推断的架构信息。 Solr 在检测到架构更改时会自动覆盖此文件。
如果您想更改架构,则应使用Schema API。另请参阅Schemaless Mode documentation。
停止 Solr:$ bin/solr stop
转到server/solr/mycore/conf,其中“mycore”是您的核心/集合的名称。
编辑solrconfig.xml:
<schemaFactory class="ManagedIndexSchemaFactory"> 并评论整个元素<schemaFactory class="ClassicIndexSchemaFactory"/> 并取消注释add-unknown-fields-to-the-schema 的<initParams> 元素并注释掉整个<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 - 它是一个open source 半结构化信息检索引擎,作为 Solr 和 Elasticsearch 的插件实现。 (免责声明:我曾在开发 SIRen 的公司工作)
【讨论】: