从Solr中检索对象

所以,我有一个基于Java的Web项目 ,它显示从3个独立服务中检索的信息,托管在不同的服务器上,我使用Apache Http Client通过JSON中的 REST API检索信息,使用Gson库 。 我将Json转换为用于显示信息的POJO。

现在我想在我的项目中实现搜索function,所以我在一个单独的服务器上安装了Solr,我想要的是:

  1. 索引所有3个服务的solr服务器中的JSON。

  2. 以我的项目中描述的POJOforms从Solr获取搜索结果

我知道第(1)点可以通过jsonRequestHandler完成,但我不想写索引的单独逻辑,我在我的项目中使用Solrj来提取信息。

所以我想知道

  • solrj可以使用我的POJO定义来解析搜索结果吗?
  • 还有上述工作场景的任何可能的工作流程,以及所需的工具(我是solrj的新手)?

映射POJ的POJO

为此,您需要使用org.apache.solr.client.solrj.beans.Field -Annotation注释POJO的fields / access-methods。

当然,这些字段需要通过名称直接匹配schema.xml的字段,或者通过在字段注释中指定名称来指向Solr的名称。

例如,schema.xml中的fields定义如下

     

然后你会有这样的POJO

 import org.apache.solr.client.solrj.beans.Field; public class SampleDocument { public SampleDocument() { // required for solrj to make an instance } public SampleDocument(int id, String title) { this.id = id; this.title = title; } public String getTitle() { return title; } @Field("title") public void setTitle(String title) { this.title = title; } } 

使用POJO更新Solr索引

索引这些POJO的代码非常简单。 您可以使用solrj的SolrServer来实现此目的。

 // connect to your solr server SolrServer server = new HttpSolrServer("http://HOST:8983/solr/"); // adding a single document SampleDocument document = new SampleDocument(1, "title 1"); server.addBean(document); // adding multiple documents List documents = Arrays.asList( new SampleDocument(2, "title 2"), new SampleDocument(3, "title 3")); server.addBeans(documents); // commit changes server.commit(); // query solr for something QueryResponse response = server.query(new SolrQuery("*:*")); // get the response as List of POJO type List foundDocuments = response.getBeans(SampleDocument.class); 

进一步阅读

结果是我们的代码和以下参考文献的写作

  • 使用SolrJ – Apache的Solr参考指南
  • SolrJ – Solr Wiki

是的,这是可能的,我做了一次类似的事情。 但我认为你应该写一些转换器,它会从SolrDocumentList获取结果,并从每个SolrDocument将结果放到你的POJO中。

阅读有关设置查询参数和使用solrj获取结果的solrj ,我认为这对您来说不是问题。 转换器本身应该易于编写,因为您可以访问从结果索引的每个字段。 还要注意缩小结果本身。

这些是一些指南,因为我对solr搜索没有经验。 我不知道它对你有多大帮助,但我希望如此。

 String id; //input parameter to search with SolrQuery q = new SolrQuery(); q.set("q","id:" + id); q.set("fl","*"); // fetch all fields to map to corresponding POJO QueryResponse queryResponse = solrClient.query("My Collection Name", q); //because I search by ID, I expect a list of just one element MyPojo myPojo = queryResponse.getBeans(MyPojo.class).get(0);