在Solr中,如何获取所有文档的一个字段(文档ID)的列表?

时间:2014-10-03 07:16:31

标签: oracle solr indexing lucene

我正在使用从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的列表以进行比较。

我无法找到有关如何执行此操作的任何信息,但我可能正在搜索

3 个答案:

答案 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());