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.

posted @ 2022-02-25 10:13  杨岂  阅读(151)  评论(0编辑  收藏  举报