我很好奇是否有办法避免在使用SolrJ时使用循环。
例如。如果我使用直接SQL,使用适当的java库,我可以返回一个Query结果并将其作为List进行关联并将其传递给我的视图(在webapp中)。
SolrJ(SolrQuery和QueryResponse)似乎无法返回简洁的列表。这意味着我必须创建一个迭代器来遍历每个返回文档并获得我想要的值,这是不理想的。
我在这里缺少什么东西,是否可以避免这些看似无用的循环呢?
答案 0 :(得分:2)
SOLRJ wiki举例说明了你想做的事情:
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);
编辑:
根据下面的评论,您想要的是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"));