刚发现Solr 5不需要预定义架构文件,而是根据正在执行的索引生成架构。我想知道这在后台如何工作?
以及这是否是一个好习惯?有什么办法可以禁用它吗?
最佳答案
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托管模式更改为经典模式
停止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-这是一个open source半结构化信息检索引擎,它作为Solr和Elasticsearch的插件实现。 (免责声明:我曾在开发SIREn的公司工作)
关于solr - Solr的无模式功能如何工作?如何将其还原为经典架构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29819854/