2013-02-08 114 views
0

我很好奇,如果有一种方法可以避免在使用SolrJ时使用循环。你可以避免与solrj循环?

例如。如果我要使用直接的SQL,使用适当的java库,我可以返回一个Query结果,并将它作为一个List类别,并将它传递给我的视图(在webapp中)。

SolrJ(SolrQuery和QueryResponse)没有办法返回它看起来简洁的列表。这意味着我必须创建一个迭代器来遍历每个返回文档并获得我想要的值,这是不理想的。

有没有我在这里失踪的东西,有没有去避免这些看似无用的循环?

+0

即使你有一个列表,你必须最终遍历它,对吧?究竟有什么区别? – Kevin 2013-02-08 16:13:32

回答

2

的SOLRJ维基举个例子,你想要做什么:

https://wiki.apache.org/solr/Solrj#Reading_Data_from_Solr

基本上是:

QueryResponse rsp = server.query(query); 
SolrDocumentList docs = rsp.getResults(); 
List<Item> beans = rsp.getBeans(Item.class); 

编辑:

根据您在下面的意见,看来你want是SOLR响应的非循环变换(例如,函数式语言中的映射函数)。谷歌的番石榴库提供了这样的东西。我下面的示例假定您的SOLR响应具有要返回列表的“名称”字段:

QueryResponse rsp = server.query(query); 
SolrDocumentList docs = rsp.getResults(); 

List<String> names = Lists.transform(docs, new Function<String,SolrDocument>() { 
    @Override 
    public String apply(SolrDocument d) { 
     return (String)d.get("name"); 
    } 
}); 

不幸的是,Java不支持这种编程方式非常好,所以功能法最终被比简单的循环更详细(可能不太清晰):

QueryResponse rsp = server.query(query); 
SolrDocumentList docs = rs.getResults(); 
List<String> names = new ArrayList<String>(); 
for (SolrDocument d : docs) names.add(d.get("name")); 
+0

不完全(至少据我了解)。允许你做的是定义一个代表返回文档类型的类。假设你有一个有id和名字的索引。如果我查询名称字段,我只需要在名称字段中返回一个匹配我的查询的id的平面列表。 – user1500053 2013-02-08 16:31:00

+0

如果您不想将其转换为java bean,那么只需使用从ArrayList派生的SolrDocumentList:http://lucene.apache.org/solr/api-4_0_0-BETA/org/apache/solr/common /SolrDocumentList.html – Kevin 2013-02-08 16:38:28

+0

这仍然不完全有帮助,但我会给你信用。我需要它在一个字符串列表中,而不是数组列表。它需要一个额外的转换才能使它成为可用的形式是我的观点。 – user1500053 2013-02-09 03:27:44