我正在使用从oracle数据库填充的Solr实例。当从oracle数据库中添加和删除记录时,它们也应该从Solr中添加和删除。
schema.xml
有这个设置,我们用它来存储也是oracle中主键的ID:
<uniqueKey>id</uniqueKey>
<field name="id" type="string" indexed="true" stored="true"/>
此外,ID不是按顺序排列的。 solr管理界面没有多大帮助,我只能看到ID和每条记录的其余部分,一次只有几个,分页。
此solr核心中有大约一百万份文件。
我可以轻松地从oracle数据库中获取记录的ID,因此我还希望从solr索引中获取文档id
的列表以进行比较。
我无法找到有关如何执行此操作的任何信息,但我可能正在搜索
答案 0 :(得分:6)
如果您确实需要获取所有文档的 id ,请使用fl
parameter。 喜欢的东西:
SolrQuery q = new SolrQuery("*:*&fl=id"); // ^^^^^ // return only the `id` field q.setRows(10000000); // ^^^^^^^^ // insanely high number: retrieve _all_ rows // see: http://wiki.apache.org/solr/CommonQueryParameters#rows-1 return server.query(q).getResults();
(未测试)功能:
为了简单比较Oracle和Solr中的内容,您可能只想计算文档:
SolrQuery q = new SolrQuery("*:*"); q.setRows(0); // ^ // don't retrieve _any_ row return server.query(q).getResults().getNumFound(); // ^^^^^^^^^^^^^ // just get the number of matching documents
(未测试)功能:
答案 1 :(得分:1)
在最新的Solr(4.10)中,您可以export large number of records。
但是,如果您真的只想要一个字段,则可以使用该字段发出请求并导出为CSV。这最大限度地减少了格式化开销。
答案 2 :(得分:0)
对于 Solr 7 ,语法有所更改。这是对我有用的(在Java中):
CloudSolrClient solrClient = ...;
solrClient.setDefaultCollection("collection1");
SolrQuery q = new SolrQuery("*:*");
q.set("fl", "id");
q.setRows(10000000);
Set<String> uniqueIds = solrClient.query(q).getResults()
.stream().map(x -> (String) x.get("id"))
.collect(Collectors.toSet());