http://my.oschina.net/cloudcoder/blog/305024

简介

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对象 增加、删除索引
    1. import java.util.ArrayList;
    2. import java.util.Collection;
    3. import java.util.List;
    4.  
    5. import org.apache.solr.client.solrj.impl.HttpSolrServer;
    6. import org.apache.solr.common.SolrInputDocument;
    7.  
    8. public class AddDocsDemo {
    9. public static final String SOLR_URL = "http://172.168.63.233:8983/solr";
    10.  
    11. public static void main(String[] args) {
    12. //通过浏览器查看结果
    13. //http://172.168.63.233:8983/solr/collection1/select?q=name%3A%E6%94%B9%E9%9D%A9&wt=json&indent=true
    14. //AddDocs();
    15. delDocs();
    16. }
    17.  
    18. public static void AddDocs() {
    19. String[] words = { "中央全面深化改革领导小组", "第四次会议", "审议了国企薪酬制度改革", "考试招生制度改革",
    20. "传统媒体与新媒体融合等", "相关内容文件", "强调要", "逐步规范国有企业收入分配秩序",
    21. "实现薪酬水平适当", "结构合理、管理规范、监督有效", "对不合理的偏高", "过高收入进行调整",
    22. "深化考试招生制度改革", "总的目标是形成分类考试", "综合评价", "多元录取的考试招生模式", "健全促进公平",
    23. "科学选才", "监督有力的体制机制", "着力打造一批形态多样", "手段先进", "具有竞争力的新型主流媒体",
    24. "建成几家拥有强大实力和传播力", "公信力", "影响力的新型媒体集团" };
    25. long start = System.currentTimeMillis();
    26. Collection<SolrInputDocument> docs = new ArrayList<SolrInputDocument>();
    27. for (int i = 1; i < 300; i++) {
    28. SolrInputDocument doc1 = new SolrInputDocument();
    29. doc1.addField("id", "id" + i, 1.0f);
    30. doc1.addField("name", words[i % 21], 1.0f);
    31. doc1.addField("price", 10 * i);
    32. docs.add(doc1);
    33. }
    34. try {
    35. HttpSolrServer server = new HttpSolrServer(SOLR_URL);
    36. // 可以通过三种方式增加docs,其中server.add(docs.iterator())效率最高
    37. // 增加后通过执行commit函数commit (936ms)
    38. // server.add(docs);
    39. // server.commit();
    40.  
    41. // 增加doc后立即commit (946ms)
    42. // UpdateRequest req = new UpdateRequest();
    43. // req.setAction(ACTION.COMMIT, false, false);
    44. // req.add(docs);
    45. // UpdateResponse rsp = req.process(server);
    46.  
    47. // the most optimal way of updating all your docs
    48. // in one http request(432ms)
    49. server.add(docs.iterator());
    50. } catch (Exception e) {
    51. System.out.println(e);
    52. }
    53. System.out.println("time elapsed(ms):"
    54. + (System.currentTimeMillis() - start));
    55. }
    56.  
    57. public static void delDocs() {
    58. long start = System.currentTimeMillis();
    59. try {
    60. HttpSolrServer server = new HttpSolrServer(SOLR_URL);
    61. List<String> ids = new ArrayList<String>();
    62. for (int i = 1; i < 300; i++) {
    63. ids.add("id" + i);
    64. }
    65. server.deleteById(ids);
    66. server.commit();
    67. } catch (Exception e) {
    68. System.out.println(e);
    69. }
    70. System.out.println("time elapsed(ms):"
    71. + (System.currentTimeMillis() - start));
    72. }
    73. }
  • 采用POJOs增加、删除索引
    1. import java.util.ArrayList;
    2. import java.util.Arrays;
    3. import java.util.Collection;
    4. import java.util.List;
    5. import java.util.Random;
    6.  
    7. import org.apache.solr.client.solrj.beans.DocumentObjectBinder;
    8. import org.apache.solr.client.solrj.impl.BinaryRequestWriter;
    9. import org.apache.solr.client.solrj.impl.HttpSolrServer;
    10. import org.apache.solr.common.SolrInputDocument;
    11.  
    12. public class AddBeansDemo {
    13. public static final String SOLR_URL = "http://172.168.63.233:8983/solr";
    14.  
    15. public static void main(String[] args) {
    16. // 通过浏览器查看结果
    17. // 要保证bean中各属性的名称在conf/schema.xml中存在,如果查询,要保存被索引
    18. // http://172.168.63.233:8983/solr/collection1/select?q=description%3A%E6%94%B9%E9%9D%A9&wt=json&indent=true
    19. // delBeans();
    20. AddBeans();
    21. }
    22.  
    23. public static Random rand = new Random(47);
    24. public static String[] authors = { "张三", "李四", "王五", "赵六", "张飞", "刘备",
    25. "关云长" };
    26. public static String[] links = {
    27. "http://repository.sonatype.org/content/sites/forge-sites/m2e/",
    28. "http://news.ifeng.com/a/20140818/41626965_0.shtml",
    29. "http://news.ifeng.com/a/20140819/41631363_0.shtml?wratingModule_1_9_1",
    30. "http://news.ifeng.com/topic/19382/",
    31. "http://news.ifeng.com/topic/19644/" };
    32.  
    33. public static String genAuthors() {
    34. List<String> list = Arrays.asList(authors).subList(0, rand.nextInt(7));
    35. String str = "";
    36. for (String tmp : list) {
    37. str += " " + tmp;
    38. }
    39. return str;
    40. }
    41.  
    42. public static List<String> genLinks() {
    43. return Arrays.asList(links).subList(0, rand.nextInt(5));
    44. }
    45.  
    46. public static void AddBeans() {
    47. String[] words = { "中央全面深化改革领导小组", "第四次会议", "审议了国企薪酬制度改革", "考试招生制度改革",
    48. "传统媒体与新媒体融合等", "相关内容文件", "强调要", "逐步规范国有企业收入分配秩序",
    49. "实现薪酬水平适当", "结构合理、管理规范、监督有效", "对不合理的偏高", "过高收入进行调整",
    50. "深化考试招生制度改革", "总的目标是形成分类考试", "综合评价", "多元录取的考试招生模式", "健全促进公平",
    51. "科学选才", "监督有力的体制机制", "着力打造一批形态多样", "手段先进", "具有竞争力的新型主流媒体",
    52. "建成几家拥有强大实力和传播力", "公信力", "影响力的新型媒体集团" };
    53.  
    54. long start = System.currentTimeMillis();
    55. Collection<NewsBean> docs = new ArrayList<NewsBean>();
    56. // DocumentObjectBinder binder = new DocumentObjectBinder();
    57. for (int i = 1; i < 300; i++) {
    58. NewsBean news = new NewsBean();
    59. news.setId("id" + i);
    60. news.setName("news" + i);
    61. news.setAuthor(genAuthors());
    62. news.setDescription(words[i % 21]);
    63. news.setRelatedLinks(genLinks());
    64. // SolrInputDocument doc1 = binder.toSolrInputDocument(news);
    65. docs.add(news);
    66. }
    67. try {
    68. HttpSolrServer server = new HttpSolrServer(SOLR_URL);
    69. server.setRequestWriter(new BinaryRequestWriter());
    70. // 可以通过二种方式增加docs,其中server.add(docs.iterator())效率最高
    71. // 增加后通过执行commit函数commit (981ms)
    72. // server.addBeans(docs);
    73. // server.commit();
    74.  
    75. // the most optimal way of updating all your docs
    76. // in one http request(481ms)
    77. server.addBeans(docs.iterator());
    78. server.optimize(); //time elasped 1176ms
    79. } catch (Exception e) {
    80. System.out.println(e);
    81. }
    82. System.out.println("time elapsed(ms):"
    83. + (System.currentTimeMillis() - start));
    84. }
    85.  
    86. public static void delBeans() {
    87. long start = System.currentTimeMillis();
    88. try {
    89. HttpSolrServer server = new HttpSolrServer(SOLR_URL);
    90. List<String> ids = new ArrayList<String>();
    91. for (int i = 1; i < 300; i++) {
    92. ids.add("id" + i);
    93. }
    94. server.deleteById(ids);
    95. server.commit();
    96. } catch (Exception e) {
    97. System.out.println(e);
    98. }
    99. System.out.println("time elapsed(ms):"
    100. + (System.currentTimeMillis() - start));
    101. }
    102. }
    1. import java.util.List;
    2.  
    3. import org.apache.solr.client.solrj.beans.Field;
    4.  
    5. class NewsBean {
    6. @Field
    7. private String id;
    8.  
    9. @Field
    10. private String name;
    11.  
    12. @Field
    13. private String author;
    14.  
    15. @Field
    16. private String description;
    17.  
    18. @Field("links")
    19. private List<String> relatedLinks;
    20.  
    21. public NewsBean(){
    22.  
    23. }
    24.  
    25. public String getId() {
    26. return id;
    27. }
    28.  
    29. public void setId(String id) {
    30. this.id = id;
    31. }
    32.  
    33. public String getName() {
    34. return name;
    35. }
    36.  
    37. public void setName(String name) {
    38. this.name = name;
    39. }
    40.  
    41. public String getAuthor() {
    42. return author;
    43. }
    44.  
    45. public void setAuthor(String author) {
    46. this.author = author;
    47. }
    48.  
    49. public String getDescription() {
    50. return description;
    51. }
    52.  
    53. public void setDescription(String description) {
    54. this.description = description;
    55. }
    56.  
    57. public List<String> getRelatedLinks() {
    58. return relatedLinks;
    59. }
    60.  
    61. public void setRelatedLinks(List<String> relatedLinks) {
    62. this.relatedLinks = relatedLinks;
    63. }
    64. }
  • 普通方式处理查询结果
    1. import java.io.IOException;
    2.  
    3. import org.apache.solr.client.solrj.SolrQuery;
    4. import org.apache.solr.client.solrj.SolrQuery.ORDER;
    5. import org.apache.solr.client.solrj.SolrServerException;
    6. import org.apache.solr.client.solrj.impl.BinaryRequestWriter;
    7. import org.apache.solr.client.solrj.impl.HttpSolrServer;
    8. import org.apache.solr.client.solrj.impl.XMLResponseParser;
    9. import org.apache.solr.client.solrj.response.QueryResponse;
    10. import org.apache.solr.common.SolrDocument;
    11.  
    12. public class QueryDocsDemo {
    13. // public static final String SOLR_URL = "http://192.168.230.128:8983/solr";
    14. public static final String SOLR_URL = "http://172.168.63.233:8983/solr";
    15.  
    16. public static void main(String[] args) throws SolrServerException, IOException {
    17. HttpSolrServer server = new HttpSolrServer(SOLR_URL);
    18. server.setMaxRetries(1);
    19. server.setMaxRetries(1); // defaults to 0. > 1 not recommended.
    20. server.setConnectionTimeout(5000); // 5 seconds to establish TCP
    21. //正常情况下,以下参数无须设置
    22. //使用老版本solrj操作新版本的solr时,因为两个版本的javabin incompatible,所以需要设置Parser
    23. server.setParser(new XMLResponseParser());
    24. server.setSoTimeout(1000); // socket read timeout
    25. server.setDefaultMaxConnectionsPerHost(100);
    26. server.setMaxTotalConnections(100);
    27. server.setFollowRedirects(false); // defaults to false
    28. // allowCompression defaults to false.
    29. // Server side must support gzip or deflate for this to have any effect.
    30. server.setAllowCompression(true);
    31.  
    32. //使用ModifiableSolrParams传递参数
    33. // ModifiableSolrParams params = new ModifiableSolrParams();
    34. // // 192.168.230.128:8983/solr/select?q=video&fl=id,name,price&sort=price asc&start=0&rows=2&wt=json
    35. // // 设置参数,实现上面URL中的参数配置
    36. // // 查询关键词
    37. // params.set("q", "video");
    38. // // 返回信息
    39. // params.set("fl", "id,name,price,score");
    40. // // 排序
    41. // params.set("sort", "price asc");
    42. // // 分页,start=0就是从0开始,rows=5当前返回5条记录,第二页就是变化start这个值为5就可以了
    43. // params.set("start", 2);
    44. // params.set("rows", 2);
    45. // // 返回格式
    46. // params.set("wt", "javabin");
    47. // QueryResponse response = server.query(params);
    48.  
    49. //使用SolrQuery传递参数,SolrQuery的封装性更好
    50. server.setRequestWriter(new BinaryRequestWriter());
    51. SolrQuery query = new SolrQuery();
    52. query.setQuery("video");
    53. query.setFields("id","name","price","score");
    54. query.setSort("price", ORDER.asc);
    55. query.setStart(0);
    56. query.setRows(2);
    57. // query.setRequestHandler("/select");
    58. QueryResponse response = server.query( query );
    59.  
    60. // 搜索得到的结果数
    61. System.out.println("Find:" + response.getResults().getNumFound());
    62. // 输出结果
    63. int iRow = 1;
    64. for (SolrDocument doc : response.getResults()) {
    65. System.out.println("----------" + iRow + "------------");
    66. System.out.println("id: " + doc.getFieldValue("id").toString());
    67. System.out.println("name: " + doc.getFieldValue("name").toString());
    68. System.out.println("price: "
    69. + doc.getFieldValue("price").toString());
    70. System.out.println("score: " + doc.getFieldValue("score"));
    71. iRow++;
    72. }
    73. }
    74. }
  • 采用POJOs方式处理查询结果
    1. import java.io.IOException;
    2. import java.util.List;
    3.  
    4. import org.apache.solr.client.solrj.SolrQuery;
    5. import org.apache.solr.client.solrj.SolrQuery.ORDER;
    6. import org.apache.solr.client.solrj.SolrServerException;
    7. import org.apache.solr.client.solrj.beans.DocumentObjectBinder;
    8. import org.apache.solr.client.solrj.impl.HttpSolrServer;
    9. import org.apache.solr.client.solrj.response.FacetField;
    10. import org.apache.solr.client.solrj.response.QueryResponse;
    11. import org.apache.solr.common.SolrDocument;
    12. import org.apache.solr.common.SolrDocumentList;
    13.  
    14. public class QueryBeanDemo {
    15. public static final String SOLR_URL = "http://172.168.63.233:8983/solr";
    16.  
    17. public static void main(String[] args) throws SolrServerException,
    18. IOException {
    19. // 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
    20. HttpSolrServer server = new HttpSolrServer(SOLR_URL);
    21. server.setMaxRetries(1);
    22. server.setMaxRetries(1); // defaults to 0. > 1 not recommended.
    23. server.setConnectionTimeout(5000); // 5 seconds to establish TCP
    24. // server.setRequestWriter(new BinaryRequestWriter());
    25.  
    26. SolrQuery query = new SolrQuery();
    27. query.setQuery("description:改革");
    28. query.setStart(0);
    29. query.setRows(2);
    30. query.setFacet(true);
    31. query.addFacetField("author_s");
    32.  
    33. QueryResponse response = server.query(query);
    34. // 搜索得到的结果数
    35. System.out.println("Find:" + response.getResults().getNumFound());
    36. // 输出结果
    37. int iRow = 1;
    38.  
    39. //response.getBeans存在BUG,将DocumentObjectBinder引用的Field应该为 org.apache.solr.client.solrj.beans.Field
    40. SolrDocumentList list = response.getResults();
    41. DocumentObjectBinderL binder = new DocumentObjectBinderL();
    42. List<NewsBean> beanList=binder.getBeans(NewsBean.class, list);
    43. for(NewsBean news:beanList){
    44. System.out.println(news.getId());
    45. }
    46.  
    47. for (SolrDocument doc : response.getResults()) {
    48. System.out.println("----------" + iRow + "------------");
    49. System.out.println("id: " + doc.getFieldValue("id").toString());
    50. System.out.println("name: " + doc.getFieldValue("name").toString());
    51. iRow++;
    52. }
    53. for (FacetField ff : response.getFacetFields()) {
    54. System.out.println(ff.getName() + "," + ff.getValueCount() + ","
    55. + ff.getValues());
    56. }
    57. }
    58. }

Solr JAVA客户端SolrJ 4.9使用示例教程的更多相关文章

  1. Solr JAVA客户端SolrJ的使用

    一.Solrj简介 SolrJ是操作Solr的JAVA客户端,它提供了增加.修改.删除.查询Solr索引的JAVA接口.SolrJ针对 Solr提供了Rest 的HTTP接口进行了封装, SolrJ底 ...

  2. 推荐Java五大微服务器及其代码示例教程

    来源素文宅博客:http://blog.yoodb.com/yoodb/article/detail/1339 微服务越来越多地用于开发领域,因为开发人员致力于创建更大,更复杂的应用程序,这些应用程序 ...

  3. 使用SolrJ(即java客户端)开发Solr。

    1.什么是SolrJ呢? 答:Solrj是访问Solr服务的java客户端,提供索引和搜索的请求方法,SolrJ通常在嵌入在业务系统中,通过SolrJ的API接口操作Solr服务.开始配置schema ...

  4. Solr第二讲——SolrJ客户端的使用与案例

    一.Solrj的使用 1.什么是Solrj solrj是访问Solr服务的java客户端(就像通过jedis操作redis一样),提供索引和搜索的请求方法,SolrJ通常在嵌入在业务系统中,通过Sol ...

  5. elasticsearch系列七:ES Java客户端-Elasticsearch Java client(ES Client 简介、Java REST Client、Java Client、Spring Data Elasticsearch)

    一.ES Client 简介 1. ES是一个服务,采用C/S结构 2. 回顾 ES的架构 3. ES支持的客户端连接方式 3.1 REST API ,端口 9200 这种连接方式对应于架构图中的RE ...

  6. solr 学习之solrJ

    solrJ是访问Solr服务的JAVA客户端,提供索引和搜索的请求方法,SolrJ通常嵌入在业务系统中,通过solrJ的API接口操作Solr服务. <!-- https://mvnreposi ...

  7. Solr——Java应用

    Solr有一个客户端SolrJ 创建一个Java Project 引入Jar包 添加test类 package com.solr.test; import java.io.IOException; i ...

  8. Java与WCF交互(一)补充:用WSImport生成WSDL的Java客户端代码

    在<Java与WCF交互(一):Java客户端调用WCF服务>一 文中,我描述了用axis2的一个Eclipse控件生成WCF的Java客户端代理类,后来有朋友建议用Xfire.CXF,一 ...

  9. Java与WCF交互(一):Java客户端调用WCF服务

    最近开始了解WCF,写了个最简单的Helloworld,想通过java客户端实现通信.没想到以我的基础,居然花了整整两天(当然是工作以外的时间,呵呵),整个过程大费周折,特写下此文,以供有需要的朋友参 ...

随机推荐

  1. Solr auto commit 配置

    为了解决写索引时频繁提交带来的效率问题,考虑使用自动提交. 在solrconfig.xml中增加以下代码: <updateHandler class="solr.DirectUpdat ...

  2. 网站通用登录模块代码 分类: ASP.NET 2014-12-06 10:49 615人阅读 评论(0) 收藏

    1.HTML部分:     <form id="form1" runat="server">     <script src=".. ...

  3. WPF中查看PDF文件

    需要打开PDF文件时,我们第一印象就是使用Adobe Reader.在开发中,经常会遇到需要展示PDF文件的需求.我们会借助于Adobe Reader的Active控件来实现.不过这需要客户的机器上安 ...

  4. hdu 4738 2013杭州赛区网络赛 桥+重边+连通判断 ***

    题意:有n座岛和m条桥,每条桥上有w个兵守着,现在要派不少于守桥的士兵数的人去炸桥,只能炸一条桥,使得这n座岛不连通,求最少要派多少人去. 处理重边 边在遍历的时候,第一个返回的一定是之前去的边,所以 ...

  5. HTML Entity Sets - All

    http://www.htmlentities.com/html/entities/ The view below displays the characters used in the offici ...

  6. commonlisp教程以及学习笔记-01

    手上有两个教程,但是感觉这个教程可能更适合自己

  7. 智能车学习(八)——菜单的实现

    一.代码分享 1.头文件 #ifndef __MENU_H #define __MENU_H /***********宏定义************/ //页面声明 typedef enum Menu ...

  8. LoadRunner中截取字符串

    LoadRunner中截取字符串 /*strchr和strrchr的区别*/ char *strTest1="citms citms"; char *strTest2,*strTe ...

  9. 深入理解KMP算法

    前言:本人最近在看<大话数据结构>字符串模式匹配算法的内容,但是看得很迷糊,这本书中这块的内容感觉基本是严蔚敏<数据结构>的一个翻版,此书中给出的代码实现确实非常精炼,但是个人 ...

  10. Liferay 6.2 改造系列之十三:修改用户编辑页面表单内容

    为简化用户编辑,删除无用内容: 在/portal-master/portal-impl/src/portal.properties文件中,有如下配置: # # Input a list of sect ...