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对象 增加、删除索引
  • 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 = { "中央全面深化改革领导小组", "第四次会议", "审议了国企薪酬制度改革", "考试招生制度改革",
    "传统媒体与新媒体融合等", "相关内容文件", "强调要", "逐步规范国有企业收入分配秩序",
    "实现薪酬水平适当", "结构合理、管理规范、监督有效", "对不合理的偏高", "过高收入进行调整",
    "深化考试招生制度改革", "总的目标是形成分类考试", "综合评价", "多元录取的考试招生模式", "健全促进公平",
    "科学选才", "监督有力的体制机制", "着力打造一批形态多样", "手段先进", "具有竞争力的新型主流媒体",
    "建成几家拥有强大实力和传播力", "公信力", "影响力的新型媒体集团" };
    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 = { "中央全面深化改革领导小组", "第四次会议", "审议了国企薪酬制度改革", "考试招生制度改革",
    "传统媒体与新媒体融合等", "相关内容文件", "强调要", "逐步规范国有企业收入分配秩序",
    "实现薪酬水平适当", "结构合理、管理规范、监督有效", "对不合理的偏高", "过高收入进行调整",
    "深化考试招生制度改革", "总的目标是形成分类考试", "综合评价", "多元录取的考试招生模式", "健全促进公平",
    "科学选才", "监督有力的体制机制", "着力打造一批形态多样", "手段先进", "具有竞争力的新型主流媒体",
    "建成几家拥有强大实力和传播力", "公信力", "影响力的新型媒体集团" }; 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客户端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. 算法系列:geometry

    1.基本几何变换及变换矩阵 基本几何变换都是相对于坐标原点和坐标轴进行的几何变换,有平移.比例.旋转.反射和错切等. 1.1 平移变换 是指将p点沿直线路径从一个坐标位置移到另一个坐标位置的重定位过程 ...

  2. bee使用

    beego虽然是一个简单的框架,但是其中用到了很多第三方的包,所以在你安装beego的过程中Go会自动安装其他关联的包. 当然第一步你需要安装Go,如何安装Go请参考我的书 安装beego go ge ...

  3. Getting Started with Blocks

    本文来源为:developer.apple.com,仅仅是博主练习排版所用. Getting Started with Blocks The following sections help you t ...

  4. HR外包系统 - 账款

    01 账款-服务费,注意多币种以及收款对象和联系人的设置 02 代收代付,注意多币种以及收款对象和联系人的设置 03 账单要保存服务费计算的整个过程,便于后面出报表和数据分析 04 出报表时,要考虑 ...

  5. 第二十篇:在SOUI中使用分层窗口

    从Windows 2K开始,MS为UI开发引入了分层窗口这一窗口风格.使用分层窗口,应用程序的主窗口可以是半透明,也可以是逐点半透明(即每一个像素点的透明度可以不同). 可以说,正是因为有了分层窗口, ...

  6. hdu 4568 Hunter(spfa预处理 + 状压dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4568 思路:首先spfa预处理出每对宝藏之间的最短距离以及宝藏到边界的最短距离,然后dp[state] ...

  7. minix3(一)安装以及编辑文件

    作为一条通信狗,最近开始自学操作系统.听说用MINIX3学操作系统很好,就决定跟UCSB的课程试试. 首先在虚拟机上安装MINIX3. 开始用的VM Station,按照百度文库里安装minix3的教 ...

  8. C#多线程编程总结

    VS2008.C#3.0在WinForm开发中,我们通常不希望当窗体上点了某个按钮执行某个业务的时候,窗体就被卡死了,直到该业务执行完毕后才缓过来.一个最直接的方法便是使用多线程.多线程编程的方式在W ...

  9. 改了哪里vs调试直接用iis运行

    OAS2Web.csproj 中的useiis为true,但必须要先配置好iis网站指向文件目录  

  10. javascript写在<head>和<body>里的区别

    Javascript写在哪里?概括起来就是三种形式:1. 内部:Html网页的<body></body>中:2. 内部:Html网页的<head></head ...