Solr 的无模式功能如何工作?如何将其还原为经典模式?
How does Solr's schema-less feature work? How to revert it to classic schema?
刚刚发现 Solr 5 不需要预定义模式文件,它会根据正在执行的索引生成模式。我想知道这在后台是如何工作的?
这是否是一个好习惯?有什么方法可以禁用它吗?
这就是 Solr 中所谓的无模式模式。不知道内部细节,具体实现方式等等
bin/solr start -e schemaless
上面的这段代码将以无模式模式启动 Solr,如果您不这样做,它将照常工作。
有关无模式的更多信息,请查看此处 - https://cwiki.apache.org/confluence/display/solr/Schemaless+Mode
The schemaless feature has been in Solr since version 4.3. But it might be more stable only now as a concurrency issue with it was fixed in 4.10.
它也称为托管架构。当您将 Solr 配置为使用托管架构时,Solr 使用特殊的 UpdateRequestProcessor 来拦截文档索引请求并猜测字段类型。
Solr 从您的 schema.xml
文件开始,并创建一个默认名为 managed-schema
的新文件来存储所有推断的模式信息。当 Solr 检测到模式更改时,该文件会自动被覆盖。
然后您应该使用 Schema API if you want to make changes to the Schema. See also the Schemaless Mode documentation。
如何将 Solr 托管架构更改为经典架构
停止 Solr:$ bin/solr stop
转到 server/solr/mycore/conf
,其中 "mycore" 是您 core/collection 的名称。
编辑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
中尚未指定的新字段为文档编制索引。
这是一个好习惯吗?什么时候用?
这取决于你想要什么。如果您想强制执行特定的文档结构(例如,根据您的定义确保所有文档 "well-formed"),那么您需要使用经典模式管理。
另一方面,如果您事先不知道文档结构是什么,那么您可能想要使用无模式功能。
限制
虽然它被称为无模式,但您可以索引的结构类型是有限的。顺便说一下,对于 Solr 和 Elasticsearch 都是如此。例如,如果您首先索引此文档:
{"name":"John Doe"}
如果接下来尝试索引这样的文档,您将收到错误消息:
{"name": {
"first": "Daniel",
"second": "Dennett"
}
}
这是因为在第一种情况下字段 name
是字符串类型,而在第二种情况下它是一个对象。
如果您想使用超出这些限制的索引,那么您可以使用 SIREn - it is an open source 半结构化信息检索引擎,该引擎作为 Solr 和 Elasticsearch 的插件实现。 (免责声明:我曾在开发 SIREn 的公司工作)
刚刚发现 Solr 5 不需要预定义模式文件,它会根据正在执行的索引生成模式。我想知道这在后台是如何工作的?
这是否是一个好习惯?有什么方法可以禁用它吗?
这就是 Solr 中所谓的无模式模式。不知道内部细节,具体实现方式等等
bin/solr start -e schemaless
上面的这段代码将以无模式模式启动 Solr,如果您不这样做,它将照常工作。
有关无模式的更多信息,请查看此处 - https://cwiki.apache.org/confluence/display/solr/Schemaless+Mode
The schemaless feature has been in Solr since version 4.3. But it might be more stable only now as a concurrency issue with it was fixed in 4.10.
它也称为托管架构。当您将 Solr 配置为使用托管架构时,Solr 使用特殊的 UpdateRequestProcessor 来拦截文档索引请求并猜测字段类型。
Solr 从您的 schema.xml
文件开始,并创建一个默认名为 managed-schema
的新文件来存储所有推断的模式信息。当 Solr 检测到模式更改时,该文件会自动被覆盖。
然后您应该使用 Schema API if you want to make changes to the Schema. See also the Schemaless Mode documentation。
如何将 Solr 托管架构更改为经典架构
停止 Solr:$ bin/solr stop
转到 server/solr/mycore/conf
,其中 "mycore" 是您 core/collection 的名称。
编辑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
中尚未指定的新字段为文档编制索引。
这是一个好习惯吗?什么时候用?
这取决于你想要什么。如果您想强制执行特定的文档结构(例如,根据您的定义确保所有文档 "well-formed"),那么您需要使用经典模式管理。
另一方面,如果您事先不知道文档结构是什么,那么您可能想要使用无模式功能。
限制
虽然它被称为无模式,但您可以索引的结构类型是有限的。顺便说一下,对于 Solr 和 Elasticsearch 都是如此。例如,如果您首先索引此文档:
{"name":"John Doe"}
如果接下来尝试索引这样的文档,您将收到错误消息:
{"name": {
"first": "Daniel",
"second": "Dennett"
}
}
这是因为在第一种情况下字段 name
是字符串类型,而在第二种情况下它是一个对象。
如果您想使用超出这些限制的索引,那么您可以使用 SIREn - it is an open source 半结构化信息检索引擎,该引擎作为 Solr 和 Elasticsearch 的插件实现。 (免责声明:我曾在开发 SIREn 的公司工作)