`

Solr JAVA客户端SolrJ 4.9使用示例教程

 
阅读更多

简介

SolrJ是操作Solr的JAVA客户端,它提供了增加、修改、删除、查询Solr索引的JAVA接口。SolrJ针对 Solr提供了Rest 的HTTP接口进行了封装, SolrJ底层是通过使用httpClient中的方法来完成Solr的操作。 

SolrJ/Solr 跨版本兼容性

SolrJ通常向后保持兼容性,可以使用新版本的SolrJ访问较旧的Solr,反之亦然。建议使用同Solr server同版本的SolrJ,

详见 http://wiki.apache.org/solr/Solrj 中关于兼容性的描述。

示例代码
•    采用 SolrInputDocument对象 增加、删除索引
• import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.apache.solr.common.SolrInputDocument;

public class AddDocsDemo {
  public static final String SOLR_URL = "http://172.168.63.233:8983/solr";

  public static void main(String[] args) {
    //通过浏览器查看结果
    //http://172.168.63.233:8983/solr/collection1/select?q=name%3A%E6%94%B9%E9%9D%A9&wt=json&indent=true
    //AddDocs();
    delDocs();
  }

  public static void AddDocs() {
    String[] words = { "中央全面深化改革领导小组", "第四次会议", "审议了国企薪酬制度改革", "考试招生制度改革",
        "传统媒体与新媒体融合等", "相关内容文件", "xxx强调要", "逐步规范国有企业收入分配秩序",
        "实现薪酬水平适当", "结构合理、管理规范、监督有效", "对不合理的偏高", "过高收入进行调整",
        "深化考试招生制度改革", "总的目标是形成分类考试", "综合评价", "多元录取的考试招生模式", "健全促进公平",
        "科学选才", "监督有力的体制机制", "着力打造一批形态多样", "手段先进", "具有竞争力的新型主流媒体",
        "建成几家拥有强大实力和传播力", "公信力", "影响力的新型媒体集团" };
    long start = System.currentTimeMillis();
    Collection<SolrInputDocument> docs = new ArrayList<SolrInputDocument>();
    for (int i = 1; i < 300; i++) {
      SolrInputDocument doc1 = new SolrInputDocument();
      doc1.addField("id", "id" + i, 1.0f);
      doc1.addField("name", words[i % 21], 1.0f);
      doc1.addField("price", 10 * i);
      docs.add(doc1);
    }
    try {
      HttpSolrServer server = new HttpSolrServer(SOLR_URL);
      // 可以通过三种方式增加docs,其中server.add(docs.iterator())效率最高
      // 增加后通过执行commit函数commit (936ms)
//    server.add(docs);
//    server.commit();

      // 增加doc后立即commit (946ms)
//    UpdateRequest req = new UpdateRequest();
//    req.setAction(ACTION.COMMIT, false, false);
//    req.add(docs);
//    UpdateResponse rsp = req.process(server);

      // the most optimal way of updating all your docs
      // in one http request(432ms)
      server.add(docs.iterator());
    } catch (Exception e) {
      System.out.println(e);
    }
    System.out.println("time elapsed(ms):"
        + (System.currentTimeMillis() - start));
  }

  public static void delDocs() {
    long start = System.currentTimeMillis();
    try {
      HttpSolrServer server = new HttpSolrServer(SOLR_URL);
      List<String> ids = new ArrayList<String>();
      for (int i = 1; i < 300; i++) {
        ids.add("id" + i);
      }
      server.deleteById(ids);
      server.commit();
    } catch (Exception e) {
      System.out.println(e);
    }
    System.out.println("time elapsed(ms):"
        + (System.currentTimeMillis() - start));
  }
}
 
•     采用POJOs增加、删除索引
• import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Random;

import org.apache.solr.client.solrj.beans.DocumentObjectBinder;
import org.apache.solr.client.solrj.impl.BinaryRequestWriter;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.apache.solr.common.SolrInputDocument;

public class AddBeansDemo {
  public static final String SOLR_URL = "http://172.168.63.233:8983/solr";

  public static void main(String[] args) {
    // 通过浏览器查看结果
    // 要保证bean中各属性的名称在conf/schema.xml中存在,如果查询,要保存被索引
    // http://172.168.63.233:8983/solr/collection1/select?q=description%3A%E6%94%B9%E9%9D%A9&wt=json&indent=true
//  delBeans();
    AddBeans();
  }

  public static Random rand = new Random(47);
  public static String[] authors = { "张三", "李四", "王五", "赵六", "张飞", "刘备",
      "关云长" };
  public static String[] links = {
      "http://repository.sonatype.org/content/sites/forge-sites/m2e/",
      "http://news.ifeng.com/a/20140818/41626965_0.shtml",
      "http://news.ifeng.com/a/20140819/41631363_0.shtml?wratingModule_1_9_1",
      "http://news.ifeng.com/topic/19382/",
      "http://news.ifeng.com/topic/19644/" };

  public static String genAuthors() {
    List<String> list = Arrays.asList(authors).subList(0, rand.nextInt(7));
    String str = "";
    for (String tmp : list) {
      str += " " + tmp;
    }
    return str;
  }

  public static List<String> genLinks() {
    return Arrays.asList(links).subList(0, rand.nextInt(5));
  }

  public static void AddBeans() {
    String[] words = { "中央全面深化改革领导小组", "第四次会议", "审议了国企薪酬制度改革", "考试招生制度改革",
        "传统媒体与新媒体融合等", "相关内容文件", "xxx强调要", "逐步规范国有企业收入分配秩序",
        "实现薪酬水平适当", "结构合理、管理规范、监督有效", "对不合理的偏高", "过高收入进行调整",
        "深化考试招生制度改革", "总的目标是形成分类考试", "综合评价", "多元录取的考试招生模式", "健全促进公平",
        "科学选才", "监督有力的体制机制", "着力打造一批形态多样", "手段先进", "具有竞争力的新型主流媒体",
        "建成几家拥有强大实力和传播力", "公信力", "影响力的新型媒体集团" };

    long start = System.currentTimeMillis();
    Collection<NewsBean> docs = new ArrayList<NewsBean>();
//  DocumentObjectBinder binder = new DocumentObjectBinder();
    for (int i = 1; i < 300; i++) {
      NewsBean news = new NewsBean();
      news.setId("id" + i);
      news.setName("news" + i);
      news.setAuthor(genAuthors());
      news.setDescription(words[i % 21]);
      news.setRelatedLinks(genLinks());
//   SolrInputDocument doc1 = binder.toSolrInputDocument(news);
      docs.add(news);
    }
    try {
      HttpSolrServer server = new HttpSolrServer(SOLR_URL);
      server.setRequestWriter(new BinaryRequestWriter());
      // 可以通过二种方式增加docs,其中server.add(docs.iterator())效率最高
      // 增加后通过执行commit函数commit (981ms)
      // server.addBeans(docs);
      // server.commit();

      // the most optimal way of updating all your docs
      // in one http request(481ms)
      server.addBeans(docs.iterator());
      server.optimize(); //time elasped 1176ms
    } catch (Exception e) {
      System.out.println(e);
    }
    System.out.println("time elapsed(ms):"
        + (System.currentTimeMillis() - start));
  }

  public static void delBeans() {
    long start = System.currentTimeMillis();
    try {
      HttpSolrServer server = new HttpSolrServer(SOLR_URL);
      List<String> ids = new ArrayList<String>();
      for (int i = 1; i < 300; i++) {
        ids.add("id" + i);
      }
      server.deleteById(ids);
      server.commit();
    } catch (Exception e) {
      System.out.println(e);
    }
    System.out.println("time elapsed(ms):"
        + (System.currentTimeMillis() - start));
  }
}
import java.util.List;

import org.apache.solr.client.solrj.beans.Field;

class NewsBean {
  @Field
  private String id;

  @Field
  private String name;

  @Field
  private String author;

  @Field
  private String description;

  @Field("links")
  private List<String> relatedLinks;
 
  public NewsBean(){
   
  }

  public String getId() {
    return id;
  }

  public void setId(String id) {
    this.id = id;
  }

 
  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public String getAuthor() {
    return author;
  }

  public void setAuthor(String author) {
    this.author = author;
  }

  public String getDescription() {
    return description;
  }

  public void setDescription(String description) {
    this.description = description;
  }

  public List<String> getRelatedLinks() {
    return relatedLinks;
  }

  public void setRelatedLinks(List<String> relatedLinks) {
    this.relatedLinks = relatedLinks;
  }
}
 
•     普通方式处理查询结果
• import java.io.IOException;

import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrQuery.ORDER;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.BinaryRequestWriter;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.apache.solr.client.solrj.impl.XMLResponseParser;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;

public class QueryDocsDemo {
// public static final String SOLR_URL = "http://192.168.230.128:8983/solr";
  public static final String SOLR_URL = "http://172.168.63.233:8983/solr";

  public static void main(String[] args) throws SolrServerException, IOException {
    HttpSolrServer server = new HttpSolrServer(SOLR_URL);
    server.setMaxRetries(1);
    server.setMaxRetries(1); // defaults to 0. > 1 not recommended.
    server.setConnectionTimeout(5000); // 5 seconds to establish TCP
    //正常情况下,以下参数无须设置
    //使用老版本solrj操作新版本的solr时,因为两个版本的javabin incompatible,所以需要设置Parser
    server.setParser(new XMLResponseParser());
    server.setSoTimeout(1000); // socket read timeout
    server.setDefaultMaxConnectionsPerHost(100);
    server.setMaxTotalConnections(100);
    server.setFollowRedirects(false); // defaults to false
    // allowCompression defaults to false.
    // Server side must support gzip or deflate for this to have any effect.
    server.setAllowCompression(true);

    //使用ModifiableSolrParams传递参数
//  ModifiableSolrParams params = new ModifiableSolrParams();
//  // 192.168.230.128:8983/solr/select?q=video&fl=id,name,price&sort=price asc&start=0&rows=2&wt=json
//  // 设置参数,实现上面URL中的参数配置
//  // 查询关键词
//  params.set("q", "video");
//  // 返回信息
//  params.set("fl", "id,name,price,score");
//  // 排序
//  params.set("sort", "price asc");
//  // 分页,start=0就是从0开始,rows=5当前返回5条记录,第二页就是变化start这个值为5就可以了
//  params.set("start", 2);
//  params.set("rows", 2);
//  // 返回格式
//  params.set("wt", "javabin");
//  QueryResponse response = server.query(params);

    //使用SolrQuery传递参数,SolrQuery的封装性更好
    server.setRequestWriter(new BinaryRequestWriter());
    SolrQuery query = new SolrQuery();
    query.setQuery("video");
    query.setFields("id","name","price","score");
    query.setSort("price", ORDER.asc);
    query.setStart(0);
    query.setRows(2);
//  query.setRequestHandler("/select");
    QueryResponse response = server.query( query );
   
   
   
    // 搜索得到的结果数
    System.out.println("Find:" + response.getResults().getNumFound());
    // 输出结果
    int iRow = 1;
    for (SolrDocument doc : response.getResults()) {
      System.out.println("----------" + iRow + "------------");
      System.out.println("id: " + doc.getFieldValue("id").toString());
      System.out.println("name: " + doc.getFieldValue("name").toString());
      System.out.println("price: "
          + doc.getFieldValue("price").toString());
      System.out.println("score: " + doc.getFieldValue("score"));
      iRow++;
    }
  }
}
 
•     采用POJOs方式处理查询结果
• import java.io.IOException;
import java.util.List;

import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrQuery.ORDER;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.beans.DocumentObjectBinder;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.apache.solr.client.solrj.response.FacetField;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;

public class QueryBeanDemo {
  public static final String SOLR_URL = "http://172.168.63.233:8983/solr";

  public static void main(String[] args) throws SolrServerException,
      IOException {
    // http://172.168.63.233:8983/solr/collection1/select?q=description%3A%E6%80%BB%E7%9B%AE%E6%A0%87&facet=true&facet.field=author_s
    HttpSolrServer server = new HttpSolrServer(SOLR_URL);
    server.setMaxRetries(1);
    server.setMaxRetries(1); // defaults to 0. > 1 not recommended.
    server.setConnectionTimeout(5000); // 5 seconds to establish TCP
    // server.setRequestWriter(new BinaryRequestWriter());

    SolrQuery query = new SolrQuery();
    query.setQuery("description:改革");
    query.setStart(0);
    query.setRows(2);
    query.setFacet(true);
    query.addFacetField("author_s");

    QueryResponse response = server.query(query);
    // 搜索得到的结果数
    System.out.println("Find:" + response.getResults().getNumFound());
    // 输出结果
    int iRow = 1;
   
    //response.getBeans存在BUG,将DocumentObjectBinder引用的Field应该为 org.apache.solr.client.solrj.beans.Field
    SolrDocumentList list = response.getResults();
    DocumentObjectBinderL binder = new DocumentObjectBinderL();
    List<NewsBean> beanList=binder.getBeans(NewsBean.class, list);
    for(NewsBean news:beanList){
      System.out.println(news.getId());
    }

    for (SolrDocument doc : response.getResults()) {
      System.out.println("----------" + iRow + "------------");
      System.out.println("id: " + doc.getFieldValue("id").toString());
      System.out.println("name: " + doc.getFieldValue("name").toString());
      iRow++;
    }
    for (FacetField ff : response.getFacetFields()) {
      System.out.println(ff.getName() + "," + ff.getValueCount() + ","
          + ff.getValues());
    }
  }
}

 

分享到:
评论

相关推荐

    solr在java中使用总结

    通过以上步骤,我们可以成功地部署Solr并在Java应用程序中使用SolrJ进行数据索引和搜索。Solr的强大功能和灵活性使其成为构建高效搜索系统的一个优秀选择。无论是对于企业级应用还是个人项目,Solr都是一个值得深入...

    基于CST软件的三维超材料能带计算及其应用

    内容概要:本文介绍了如何利用CST软件进行三维超材料的能带计算。首先概述了三维超材料的独特性质及其广泛应用前景,接着简要介绍了CST软件的功能特点。随后详细阐述了能带计算的具体步骤,包括模型建立、材料参数设置、网格划分与求解设置以及最终的计算与结果分析。最后给出了一段Python代码示例,展示了如何处理CST输出的数据并绘制能带图。文章强调了计算机模拟技术对于深入了解超材料电子结构和物理性质的重要性。 适合人群:从事材料科学研究的专业人士,尤其是对三维超材料和电磁场模拟感兴趣的科研工作者和技术人员。 使用场景及目标:适用于希望借助CST软件开展三维超材料能带计算的研究项目,旨在提高对超材料的理解,推动相关领域的技术创新和发展。 其他说明:文中提供的Python代码仅为示例,在实际操作时可根据具体情况进行调整优化。同时,掌握CST软件的基本操作和电磁理论基础知识有助于更好地理解和应用本文内容。

    基于FPGA的永磁同步伺服系统设计:电流环及矢量控制实现

    内容概要:本文详细介绍了基于FPGA的永磁同步伺服系统的矢量控制设计,涵盖了从电流环到速度环的关键模块实现。具体包括Clarke和Park变换、PI调节器、AD7606采样、正交编码器反馈以及SVPWM生成等部分。文中提供了详细的Verilog代码片段,展示了各个模块的具体实现方法和技术细节。特别强调了定点数处理、时序设计和跨时钟域处理等方面的技术挑战及其解决方案。 适合人群:具备一定FPGA开发经验和电机控制基础知识的研发人员。 使用场景及目标:适用于希望深入了解FPGA在电机控制应用中的具体实现方式,特别是矢量控制和电流环设计的专业人士。目标是掌握FPGA平台下高效、低延迟的电机控制系统设计方法。 阅读建议:由于涉及大量具体的Verilog代码和硬件设计细节,建议读者在阅读过程中结合实际项目进行实验和调试,以便更好地理解和掌握相关技术。

    飞机大战:从运动方程到战斗系统的全链路设计解析

    经典飞机大战游戏是理解实时交互系统设计的绝佳载体。本文将深入剖析现代空战游戏的核心模块,涵盖刚体运动学、弹道轨迹优化、碰撞检测算法等关键技术,揭示二维游戏背后复杂的三维数学建模过程。

    scratch少儿编程逻辑思维游戏源码-冰塔.zip

    scratch少儿编程逻辑思维游戏源码-冰塔.zip

    scratch少儿编程逻辑思维游戏源码-弹跳(4).zip

    scratch少儿编程逻辑思维游戏源码-弹跳(4).zip

    COMSOL焊接热源模型解析:双椭球、高斯旋转体与柱状体热源的应用与优化

    内容概要:本文详细介绍了COMSOL软件中三种常见的焊接热源模型——双椭球热源、高斯旋转体热源和柱状体热源。双椭球热源适用于模拟移动热源(如激光焊、电弧焊),通过调整轴向系数a1和a2来控制热流分布;高斯旋转体热源适合小范围焊接,采用三维高斯函数描述热流密度;柱状体热源则用于深熔焊场景,特点是计算速度快。文中还提供了每种模型的具体代码实现,并强调了调试时需要注意的关键点,如时间步长、网格加密等。此外,作者分享了一些实用技巧,如将热源参数设置为全局变量并利用参数扫描功能提高调试效率。 适合人群:从事焊接工艺仿真、材料加工领域的研究人员和技术人员,以及对COMSOL建模感兴趣的工程技术人员。 使用场景及目标:帮助用户选择合适的热源模型进行焊接模拟,确保模拟结果的准确性;提供具体的代码实现和调试方法,使用户能够快速掌握并应用于实际项目中。 其他说明:文中提到的热源模型不仅限于理论介绍,还包括实际操作中的注意事项和优化建议,有助于提升模拟效果和工作效率。

    基于RBF神经网络的PID控制器在PMSM转速环中的Simulink模型设计与性能分析

    内容概要:本文介绍了将基于RBF神经网络的PID控制器应用于永磁同步电机(PMSM)转速环控制的方法及其性能优势。传统的PID控制器在面对非线性和时变系统时存在参数整定困难的问题,而引入RBF神经网络可以实现实时在线调参,提高系统的灵活性和鲁棒性。文中详细描述了Simulink模型的设计,特别是Matlab s-function模块中RBF神经网络的具体实现,包括高斯函数激活和带惯性的权值更新机制。实验结果显示,在转速突变情况下,改进后的控制器能够迅速稳定系统,超调量控制在2%以内,调节时间较传统方法缩短约40%,并且在负载变化时表现出色,无需重新整定参数。 适合人群:从事电机控制系统研究和开发的技术人员,尤其是对PID控制器优化感兴趣的工程师。 使用场景及目标:适用于需要提升PMSM转速环控制精度和响应速度的应用场合,如工业自动化设备、机器人等领域。目标是通过引入智能算法解决传统PID控制器参数整定难题,提高系统性能。 阅读建议:关注RBF神经网络与PID控制器结合的具体实现细节,特别是在Matlab s-function模块中的编码技巧以及参数调整策略。同时,注意学习率的选择和动量项的作用,这对于实际应用至关重要。

    scratch少儿编程逻辑思维游戏源码-GTA 6.zip

    scratch少儿编程逻辑思维游戏源码-GTA 6.zip

    scratch少儿编程逻辑思维游戏源码-仓鼠跑酷.zip

    scratch少儿编程逻辑思维游戏源码-仓鼠跑酷.zip

    scratch少儿编程逻辑思维游戏源码-超级麦克世界.zip

    scratch少儿编程逻辑思维游戏源码-超级麦克世界.zip

    scratch少儿编程逻辑思维游戏源码-400年.zip

    scratch少儿编程逻辑思维游戏源码-400年.zip

    少儿编程scratch项目源代码文件案例素材-气球足球.zip

    少儿编程scratch项目源代码文件案例素材-气球足球.zip

    少儿编程scratch项目源代码文件案例素材-沙漠迷城.zip

    少儿编程scratch项目源代码文件案例素材-沙漠迷城.zip

    scratch少儿编程逻辑思维游戏源码-比谁高.zip

    scratch少儿编程逻辑思维游戏源码-比谁高.zip

    少儿编程scratch项目源代码文件案例素材-乾坤大挪移.zip

    少儿编程scratch项目源代码文件案例素材-乾坤大挪移.zip

    scratch少儿编程逻辑思维游戏源码-菜鸟跳跃.zip

    scratch少儿编程逻辑思维游戏源码-菜鸟跳跃.zip

    【C++编程语言】核心特性详解、学习笔记

    内容概要:本文档详细介绍了C++语言的基础知识、高级特性及其应用。首先,文档回顾了C++对C语言的扩展,包括面向对象编程的支持、增强的语法特性(如命名空间、引用、常量处理等)。接着,深入探讨了类和对象的使用,涵盖构造函数、析构函数、拷贝构造函数、深浅拷贝等重要概念。文档还讲解了单例模式的设计与实现、C++面向对象模型的核心要素(如this指针、静态成员、友元函数)、继承与派生的关系及其实现细节、多态性的原理与应用。此外,文档详细介绍了C++的模板机制、类型转换、异常处理机制、输入输出流操作、STL(标准模板库)的容器和算法等内容。每个部分都通过具体的代码示例和解释,帮助读者理解和掌握C++的关键特性和最佳实践。 适合人群:具备一定编程基础,尤其是熟悉C语言的开发者;希望深入了解C++语言特性和面向对象编程思想的程序员;从事C++开发工作的工程师和技术爱好者。 使用场景及目标:①掌握C++语言的核心概念和高级特性;②理解并能够应用面向对象编程的基本原则和模式;③学习如何使用STL容器和算法优化代码性能;④提升C++程序的健壮性和可维护性,特别是在处理复杂数据结构和算法时;⑤掌握异常处理和类型转换的最佳实践,确保程序的稳定性和安全性。 其他说明:本文档不仅提供了理论知识,还结合了大量实例代码,便于读者边学边练。对于每一个知识点,文档都力求做到详尽解释,确保读者能够透彻理解并灵活运用。文档内容全面覆盖了C++编程的各个方面,从基础语法到高级特性,适合不同层次的学习者逐步深入学习。

    电气铁路柔性过分相技术:60°换相波形稳定分析及其实现方法

    内容概要:本文详细探讨了电气铁路柔性过分相技术中的60°换相波形稳定问题。首先介绍了柔性过分相的基本概念及其重要性,接着重点讨论了60°换相波形稳定对系统运行效率和稳定性的影响。文中还阐述了实现换相波形稳定的多种方法,如先进控制算法、实时监测设备以及滤波器的应用。最后,通过引用相关文献和实例,进一步验证了换相波形稳定的重要性和可行性。 适合人群:从事电气铁路系统设计、维护的技术人员,以及对该领域感兴趣的科研人员。 使用场景及目标:适用于希望深入了解电气铁路柔性过分相技术的专业人士,旨在帮助他们掌握60°换相波形稳定的相关理论和技术手段,提升系统性能。 其他说明:文章结合了理论分析与实际案例,提供了丰富的参考资料,有助于读者全面理解并应用于实际工作中。

    scratch少儿编程逻辑思维游戏源码-发动.zip

    scratch少儿编程逻辑思维游戏源码-发动.zip

Global site tag (gtag.js) - Google Analytics