从Solr中检索对象

时间:2013-10-01 11:05:11

标签: java json solr solrj

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

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

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

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

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

    所以我想知道

    • 可以使用我的POJO定义解析搜索结果吗?
    • 上述工作方案和工具的任何可能的工作流程 要求(我是solrj的新手)?

3 个答案:

答案 0 :(得分:9)

为Solr

映射POJO

为此,您需要使用org.apache.solr.client.solrj.beans.Field - 注释注释POJO的字段/访问方法。

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

例如,您在schema.xml中有fields的以下定义

<fields>
  <field name="id"    type="int"    indexed="true" stored="true" multiValued="false" />
  <field name="title" type="string" indexed="true" stored="true" multiValued="false" />
</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<SampleDocument> 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<SampleDocument> foundDocuments = response.getBeans(SampleDocument.class);

进一步阅读

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

答案 1 :(得分:0)

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

了解如何设置查询参数并使用solrj获取结果,我认为这样做不会有问题。转换器本身应该易于编写,因为您可以访问从结果索引的每个字段。  还要注意缩小结果本身。

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

答案 2 :(得分:0)

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);