4

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

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

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

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

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

所以我想知道

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

3 回答 3

10

为 Solr 映射 POJO

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

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

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

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

进一步阅读

结果是我们的代码和以下参考

于 2013-10-01T15:42:09.023 回答
0

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

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

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

于 2013-10-01T11:26:02.337 回答
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);
于 2018-06-27T19:32:40.383 回答