从Solr中检索对象
所以,我有一个基于Java的Web项目 ,它显示从3个独立服务中检索的信息,托管在不同的服务器上,我使用Apache Http Client通过JSON中的 REST API检索信息,使用Gson库 。 我将Json转换为用于显示信息的POJO。
现在我想在我的项目中实现搜索function,所以我在一个单独的服务器上安装了Solr,我想要的是:
-
索引所有3个服务的solr服务器中的JSON。
-
以我的项目中描述的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);