如何在不更新整个文档的情况下进行 Solr Delta 导入?
How can I do Solr Delta Import without update whole document?
我想执行 Solr Delta 导入,但我不想更新整个文档。有什么方法可以指示 solr 在导入增量时仅更新特定字段?
理论
此功能称为 in-place update。仅当要更新的字段满足这些条件时才执行就地更新:
- 非索引(索引="false")
- 未存储(存储="false")
- 单值(多值="false")
- 数字文档值(docValues="true")字段
换句话说,此功能基于特殊的数据结构 DocValues,因此您无法在不对整个文档重新编制索引的情况下更新非 DocValues 字段。您可以在以下 jira 问题中阅读有关可更新 DocValues 的更多详细信息:
练习
这是一个通过 SolrJ 的例子:
HttpSolrClient client = new HttpSolrClient("http://localhost:8983/solr");
SolrInputDocument doc = new SolrInputDocument();
doc.addField("id","1");
Map<String,Object> fields = new HashMap<>();
fields.put("inc", "-1");
doc.addField("count", fields);
client.add(doc);
client.close();
或通过 CURL:
curl http://localhost:8983/solr/library/update -d '
[
{"id" : "1",
"count" : {"inc":"-1"}
}
]'
其中字段计数声明为:
<field name="count" type="int" indexed="false" stored="false" docValues="true"/>
请注意 如果字段配置错误,将应用 "Atomic Update"。
"Atomic Updates"
您可以 "update" 文档中的任何字段而不受 "Atomic Updates" 的任何限制。 Atomic Update 实际上并没有进行就地更新——它删除旧文档,然后一次性索引一个应用了更新的新文档。在引擎盖下,它要求您的模式中的所有字段必须配置为已存储,并将字段复制为未存储(请记住嵌套文档),并尝试从存储的字段重建整个文档。如果出现任何配置错误,您将在没有任何通知的情况下丢失大部分文档。一般来说,原子更新有以下缺点:
- 重新索引整个文档并将它们传递给所有分析链会消耗大量 CPU 个周期
- 通过存储原始文档数据增加了索引大小
- 创建了新的索引段,旧文档在现有段中被标记为已删除,导致段合并策略启动并使用额外的 CPU 并增加 I/O 压力
- 最重要的是,在提交使更改可见后必须重新打开搜索。这会擦除所有累积的过滤器缓存、文档缓存和查询结果缓存
- 索引提交,这使得更改可见,擦除过滤器和字段缓存,因为额外的段被添加到索引;
- 在块索引结构的情况下,必须重新索引整个文档块,显着增加开销
我想执行 Solr Delta 导入,但我不想更新整个文档。有什么方法可以指示 solr 在导入增量时仅更新特定字段?
理论
此功能称为 in-place update。仅当要更新的字段满足这些条件时才执行就地更新:
- 非索引(索引="false")
- 未存储(存储="false")
- 单值(多值="false")
- 数字文档值(docValues="true")字段
换句话说,此功能基于特殊的数据结构 DocValues,因此您无法在不对整个文档重新编制索引的情况下更新非 DocValues 字段。您可以在以下 jira 问题中阅读有关可更新 DocValues 的更多详细信息:
练习
这是一个通过 SolrJ 的例子:
HttpSolrClient client = new HttpSolrClient("http://localhost:8983/solr");
SolrInputDocument doc = new SolrInputDocument();
doc.addField("id","1");
Map<String,Object> fields = new HashMap<>();
fields.put("inc", "-1");
doc.addField("count", fields);
client.add(doc);
client.close();
或通过 CURL:
curl http://localhost:8983/solr/library/update -d '
[
{"id" : "1",
"count" : {"inc":"-1"}
}
]'
其中字段计数声明为:
<field name="count" type="int" indexed="false" stored="false" docValues="true"/>
请注意 如果字段配置错误,将应用 "Atomic Update"。
"Atomic Updates"
您可以 "update" 文档中的任何字段而不受 "Atomic Updates" 的任何限制。 Atomic Update 实际上并没有进行就地更新——它删除旧文档,然后一次性索引一个应用了更新的新文档。在引擎盖下,它要求您的模式中的所有字段必须配置为已存储,并将字段复制为未存储(请记住嵌套文档),并尝试从存储的字段重建整个文档。如果出现任何配置错误,您将在没有任何通知的情况下丢失大部分文档。一般来说,原子更新有以下缺点:
- 重新索引整个文档并将它们传递给所有分析链会消耗大量 CPU 个周期
- 通过存储原始文档数据增加了索引大小
- 创建了新的索引段,旧文档在现有段中被标记为已删除,导致段合并策略启动并使用额外的 CPU 并增加 I/O 压力
- 最重要的是,在提交使更改可见后必须重新打开搜索。这会擦除所有累积的过滤器缓存、文档缓存和查询结果缓存
- 索引提交,这使得更改可见,擦除过滤器和字段缓存,因为额外的段被添加到索引;
- 在块索引结构的情况下,必须重新索引整个文档块,显着增加开销