solr - Solr的无模式功能如何工作?如何将其还原为经典架构?

标签 solr solr5

刚发现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/

相关文章:

php - 我该如何解决这个 Solr/MySQL 竞争条件?

php - Solr 5.1.0 dataimporthandler 目录为空

mysql - 新字段未显示在搜索中

java - 架构中现有字段的 Solr 复合唯一键

ajax - 一个人可以使用 ELB 应用程序负载均衡器(位于 Solr 前面)添加 CORS header 吗?

SOLR MoreLikeThis 与日期字段返回无效的日期字符串

solr - 是否有 SolrJ 查询构建器?

solr - 理解 Solr Doc=

java - Apache Solr 无法存储嵌套 JSON 数据