• 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.

  • 相关阅读:
    剑指offer-整数中1出现的次数
    剑指offer-连续子数组的最大和
    剑指offer-最小的k个数
    剑指offer-数组中超过一半的数字
    剑指offer-二叉搜索树与双向链表
    剑指offer-复杂链表的复制
    剑指offer-二叉树中和为某一值的路径
    剑指offer-二叉搜索树的后序遍历
    Alpha 冲刺 (7/10)
    Alpha 冲刺 (6/10)
  • 原文地址:https://www.cnblogs.com/yangyongjie/p/15934735.html
Copyright © 2020-2023  润新知