所以,我有一个基于 java的web项目,显示从3个独立服务中检索到的信息,托管在不同的服务器上,我使用 Apache Http Client 通过REST检索信息 JSON 中的API,使用 Gson库。我将Json转换为用于显示信息的POJO。
现在我想在我的项目中实现搜索功能,所以我在一个单独的服务器上安装了Solr,我想要的是:
索引所有3项服务的solr服务器中的JSON。
以我的项目中描述的POJO形式从Solr获取搜索结果
我知道第(1)点可以由jsonRequestHandler
完成,但我不想写索引的单独逻辑,我在我的项目中使用Solrj来提取信息。
所以我想知道
答案 0 :(得分:9)
为此,您需要使用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的代码非常简单。您可以使用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);