Solr&Java
一、Java
1、SolrJ
SolrJ 是一种 API,它使用 Java(或任何基于 JVM 的语言)编写的应用程序可以轻松地与 Solr 通信。 SolrJ 隐藏了许多连接到 Solr 的细节,并允许您的应用程序通过简单的高级方法与 Solr 进行交互。 SolrJ 支持大多数 Solr API,并且是高度可配置的。
SolrJ 具有所有的灵活性,它是围绕几个简单的接口构建的。
Solr 的所有请求都由 SolrClient 发送。 SolrClient 是 SolrJ 核心的主要主力。它们处理连接到 Solr 并与之通信的工作,并且是大多数用户配置发生的地方。
请求以 SolrRequests 的形式发送,并以 SolrResponses 的形式返回
SolrClient 的类型
SolrClient :有一些具体的实现,每个都针对不同的使用模式或弹性模型:
HttpSolrClient :面向以查询为中心的工作负载,但也是一个很好的通用客户端。直接与单个 Solr 节点通信。
LBHttpSolrClient :跨 Solr 节点列表平衡请求负载。根据节点健康调整“服务中”节点列表。
CloudSolrClient :旨在与 SolrCloud 部署进行通信。使用已记录的 ZooKeeper 状态来发现请求并将请求路由到健康的 Solr 节点。
ConcurrentUpdateSolrClient :面向以索引为中心的工作负载。在将大批量发送到 Solr 之前在内部缓冲文档
使用示例:
①、引入依赖jar包
<dependency> <groupId>org.apache.solr</groupId> <artifactId>solr-solrj</artifactId> <version>7.7.0</version> </dependency>
②、SolrClient配置
所有 SolrClient 实现都允许用户指定与 Solr 通信的连接和读取超时。这些是在客户端创建时提供的,如下例所示:
final String solrUrl = "http://localhost:8983/solr"; return new HttpSolrClient.Builder(solrUrl) .withConnectionTimeout(10000) .withSocketTimeout(60000) .build();
当未明确提供这些值时,SolrJ 会回退到使用运行 OS/环境的默认值
③、使用SolrJ查询
SolrClient 有许多用于从 Solr 获取结果的 query() 方法。这些方法中的每一个都接受一个 SolrParams,一个封装任意查询参数的对象。每个方法都会输出一个 QueryResponse,这是一个包装器,可用于访问结果文档和其他相关元数据。
以下代码片段使用 SolrClient 查询 Solr 的“techproducts”示例集合,并对结果进行迭代:
final SolrClient client = getSolrClient(); final Map<String, String> queryParamMap = new HashMap<String, String>(); queryParamMap.put("q", "*:*"); queryParamMap.put("fl", "id, name"); queryParamMap.put("sort", "id asc"); MapSolrParams queryParams = new MapSolrParams(queryParamMap); final QueryResponse response = client.query("techproducts", queryParams); final SolrDocumentList documents = response.getResults(); print("Found " + documents.getNumFound() + " documents"); for(SolrDocument document : documents) { final String id = (String) document.getFirstValue("id"); final String name = (String) document.getFirstValue("name"); print("id: " + id + "; name: " + name); }
SolrParams 有一个 SolrQuery 子类,它提供了一些方便的方法,大大简化了查询的创建。以下片段显示了如何使用 SolrQuery 中的一些便捷方法构建上一个示例中的查询:
final SolrQuery query = new SolrQuery("*:*"); query.addField("id"); query.addField("name"); query.setSort("id", ORDER.asc); query.setRows(numResultsToReturn);
④、使用SolrJ向文档中索引数据
使用 SolrJ 进行索引也很简单。用户将他们想要索引的文档构建为 SolrInputDocument 的实例,并将它们作为参数提供给 SolrClient 上的 add() 方法之一
以下示例展示了如何使用 SolrJ 将文档添加到 Solr 的“techproducts”示例集合中:
final SolrClient client = getSolrClient(); final SolrInputDocument doc = new SolrInputDocument(); doc.addField("id", UUID.randomUUID().toString()); doc.addField("name", "Amazon Kindle Paperwhite"); final UpdateResponse updateResponse = client.add("techproducts", doc); // Indexed documents must be committed client.commit("techproducts");
注意:建议 Solr 管理员使用 Solr 的自动提交设置提交文档,而不是使用显式的 commit() 调用
⑤、绑定Java对象
虽然 SolrJ 提供的 UpdateResponse 和 QueryResponse 接口很有用,但使用应用程序更容易理解的特定于域的对象通常更方便。值得庆幸的是,SolrJ 通过隐式地将文档与任何已用 Field 注释特别标记的类进行转换来支持这一点
Java 对象中的每个实例变量都可以使用 Field 注释映射到相应的 Solr 字段。默认情况下,Solr 字段共享注释变量的名称,但是,可以通过为注释提供显式字段名称来覆盖它
下面的示例片段显示了一个带注释的 TechProduct 类,该类可用于表示来自 Solr 的“techproducts”示例集合的结果:
TechProduct Java对象:
public static class TechProduct { @Field public String id; @Field public String name; public TechProduct(String id, String name) { this.id = id; this.name = name; } public TechProduct() {} }
直接索引TechProduct对象:
final SolrClient client = getSolrClient(); final TechProduct kindle = new TechProduct("kindle-id-4", "Amazon Kindle Paperwhite"); final UpdateResponse response = client.addBean("techproducts", kindle); client.commit("techproducts");
类似地,可以使用 QueryResponse 上的 getBeans() 方法将搜索结果直接转换为 bean 对象:
final SolrClient client = getSolrClient(); final SolrQuery query = new SolrQuery("*:*"); query.addField("id"); query.addField("name"); query.setSort("id", ORDER.asc); final QueryResponse response = client.query("techproducts", query); final List<TechProduct> products = response.getBeans(TechProduct.class);
二、Python
1、Simple Python
from urllib2 import * # 创建连接 connection = urlopen('http://localhost:8983/solr/collection_name/select?q=cheese&wt=python') response = eval(connection.read()) # 解析结果 print response['response']['numFound'], "documents found." # Print the name of each document. for document in response['response']['docs']: print " Name =", document['name']
2、Python with JSON
from urllib2 import * import json connection = urlopen('http://localhost:8983/solr/collection_name/select?q=cheese&wt=json') response = json.load(connection) print response['response']['numFound'], "documents found." # Print the name of each document. for document in response['response']['docs']: print " Name =", document['name']
附录
文档:https://solr.apache.org/guide/7_7/using-solrj.html#java-object-binding
END.