转:

使用solrJ操作solr常用方法

2017年08月07日 22:49:06 成都往右 阅读数:8990
 
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37334135/article/details/76862508

既然学的是java那么肯定需要用java代码来进行对solr的操作,如果知道在solr后台管理界面进行增删改查等操作,那么用solrJ操作solr会更好理解。

solrJ介绍
solrJ是一个用来访问solr的java客户端,提供了索引和搜索的方法(将一些常用的命令封装进去了),通过solrJ提供的API 接口来操作solr服务。

准备工作
创建个maven工程(普通的java工程都可以不过需要自己导包),添加依赖如下:

<dependencies>
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>4.10.2</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

注:有的大神介绍说添加第一个solrj的依赖就行,但是我这里测试的时候发现还是需要commons-logging的依赖的,另外,如果你本地仓库没有zookeeper-3.4.6.jar跟slf4j-api-1.7.6.jar也会直接报错,自己去网上下一个吧,最终包结构我也截了个图。

然后启动solr服务器,接下来进行操作。
1、添加文档

    /*
* 测试向索引库中添加文档
*/
@Test
public void testSave() throws Exception{
//1.创建连接对象
SolrServer solrServer = new HttpSolrServer("http://192.168.25.128:8080/solr/collection1");
//2.创建一个文档对象
SolrInputDocument inputDocument = new SolrInputDocument();
//向文档中添加域以及对应的值,注意:所有的域必须在schema.xml中定义过,前面已经给出过我定义的域。
inputDocument.addField("id", "1");
inputDocument.addField("item_title", "sansung爆炸牌手机");
inputDocument.addField("item_price", 666);
inputDocument.addField("item_image", "www.boom.png");
//3.将文档写入索引库中
solrServer.add(inputDocument);
//提交
solrServer.commit();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

后台管理界面查询id为1的商品看看

2、修改文档

    /*
* 测试修改索引库中已存在的文档
*/
@Test
public void testUpdate() throws Exception{
//1.创建连接对象
SolrServer solrServer = new HttpSolrServer("http://192.168.25.128:8080/solr/collection1");
//2.创建一个文档对象
SolrInputDocument inputDocument = new SolrInputDocument();
inputDocument.addField("id", "1");
//修改id为1的商品的信息(如果该商品不存在其实就是添加了)
inputDocument.addField("item_title", "vivo手机hahaha");
inputDocument.addField("item_price", 6666);
inputDocument.addField("item_image", "www.123.png");
//3.将文档写入索引库中
solrServer.add(inputDocument);
//提交
solrServer.commit();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

再去后台管理页面查询id为1的商品看看

3、删除文档

    /*
* 测试删除文档:根据id删除文档 *
*/
@Test
public void testDeleteById() throws Exception{
SolrServer solrServer = new HttpSolrServer("http://192.168.25.128:8080/solr/collection1");
//删除文档
solrServer.deleteById("1");
//提交
solrServer.commit();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
    /*
* 测试删除文档:根据查询结果删除文档(重新添加id为1的文档)
*/
@Test
public void testDeleteByQ() throws Exception{
SolrServer solrServer = new HttpSolrServer("http://192.168.25.128:8080/solr/collection1");
//根据查询结果删除文档,注意:用item_image的查询结果来进行删除是不行的
//因为制定业务域的时候indexed=false,即不被索引,此时是不能根据图片来查询的。
solrServer.deleteByQuery("item_title:vivo手机hahaha");
solrServer.commit();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

不管是根据id删除还是根据查询删除都能达到一样的效果。
4、查询索引

1、简单根据id查询索引

    /*
* 简单查询:查询单个商品信息
*/
@Test
public void testSimpleQ() throws Exception{
//1.创建连接
SolrServer solrServer = new HttpSolrServer("http://192.168.25.128:8080/solr/collection1");
//2.创建查询语句
SolrQuery query = new SolrQuery();
//3.设置查询条件
query.set("q", "id:1");
//4.执行查询
QueryResponse queryResponse = solrServer.query(query);
//5.取文档列表public class SolrDocumentList extends ArrayList<SolrDocument>
SolrDocumentList documentList = queryResponse.getResults();
for (SolrDocument solrDocument : documentList) {
//取各个文档信息
System.out.println("商品id:"+solrDocument.get("id")+" ");
System.out.println("商品标题:"+solrDocument.get("item_title")+" ");
System.out.println("商品价格:"+solrDocument.get("item_price")+" ");
System.out.println("商品图片:"+solrDocument.get("item_image")+" ");
}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
输出结果:
商品id:1
商品标题:vivo手机hahaha
商品价格:6666
商品图片:www.123.png
  • 1
  • 2
  • 3
  • 4
  • 5

2、设置条件进行查询

@Test
public void testSimpleQ2 () throws Exception{
//1.创建连接
SolrServer solrServer = new HttpSolrServer("http://192.168.25.128:8080/solr/collection1");
//2.创建查询语句
SolrQuery query = new SolrQuery();
//3.设置查询条件
query.set("q", "夏普");//设置查询关键字
query.setSort("id", ORDER.desc);//按照id降序排列
query.setStart(1);
query.setRows(3);//分页条件
query.set("df", "item_title");//默认在商品标题域进行查询
//4、执行查询
QueryResponse queryResponse = solrServer.query(query);
//5.获取文档列表
SolrDocumentList documentList = queryResponse.getResults();
//获取总记录数
long numFound = documentList.getNumFound();
System.out.println("总记录数:" + numFound);
for (SolrDocument solrDocument : documentList) {
//取各个文档信息
System.out.print("商品id:"+solrDocument.get("id")+" ");
System.out.print("商品标题:"+solrDocument.get("item_title")+" ");
System.out.print("商品价格:"+solrDocument.get("item_price")+" ");
System.out.println();
}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

注:如果设置了默认查询域的话,自己又不想在这个域内查那么在查询关键字前要注明要在哪个域查,比如:”item_price:600”

输出结果:
总记录数:19
商品id:936920 商品标题:夏普(SHARP)LCD-52DS70A 52英寸 日本原装液晶面板 3D Android操作系统智能液晶电视 商品价格:699900
商品id:816753 商品标题:夏普(SHARP)LCD-46DS40A 46英寸 日本原装液晶面板 智能全高清液晶电视 商品价格:379900
商品id:1356054 商品标题:夏普(SHARP)LCD-50DS72A 50英寸 无线网络 安卓智能 4K超高清液晶电视 商品价格:549900
  • 1
  • 2
  • 3
  • 4
  • 5

3、带高亮的复杂查询

    /*
* 测试复杂查询:取高亮
*/
@Test
public void testHighLighting() throws Exception{
//1、创建连接
SolrServer solrServer = new HttpSolrServer("http://192.168.25.128:8080/solr/collection1");
//2、创建查询语句
SolrQuery query = new SolrQuery();
//3、设置查询条件
query.set("q", "夏普");//设置查询关键字
query.setSort("id", ORDER.desc);//按照id降序排列
query.setStart(1);
query.setRows(5);//分页条件
query.set("df", "item_title"); //开启高亮显示
query.setHighlight(true);
query.setHighlightSimplePre("<em>");
query.setHighlightSimplePost("</em>"); //4、执行查询
QueryResponse queryResponse = solrServer.query(query);
//5、取高亮
Map<String, Map<String, List<String>>> highlighting = queryResponse.getHighlighting();
//6、获取文档列表
SolrDocumentList documentList = queryResponse.getResults();
//7、遍历查询结果
for (SolrDocument solrDocument : documentList) {
System.out.print(solrDocument.get("id")+" ");
List<String> titleList = highlighting.get(solrDocument.get("id")).get("item_title");
if (titleList !=null && titleList.size()>0) {
//能取到高亮,输出高亮
System.out.print(titleList.get(0));
}
System.out.println();
} }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
输出结果:
936920 <em>夏普</em>(SHARP)LCD-52DS70A 52英寸 日本原装液晶面板 3D Android操作系统智能液晶电视
816753 <em>夏普</em>(SHARP)LCD-46DS40A 46英寸 日本原装液晶面板 智能全高清液晶电视
1356054 <em>夏普</em>(SHARP)LCD-50DS72A 50英寸 无线网络 安卓智能 4K超高清液晶电视
1322968 <em>夏普</em>(SHARP)LCD-40DS13A 40英寸液晶电视
1322963 <em>夏普</em>(SHARP)LCD-32DS13A 32英寸液晶电视
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

如果看了关于在solr后台管理页面进行的相关操作后,再看这个solrJ应该就瞬间会了。

使用solrJ操作solr常用方法 【注释非常详细,非常好】的更多相关文章

  1. 利用SolrJ操作solr API完成index操作

    使用SolrJ操作Solr会比利用httpClient来操作Solr要简单.SolrJ是封装了httpClient方法,来操作solr的API的.SolrJ底层还是通过使用httpClient中的方法 ...

  2. 使用solrj操作solr索引库

    (solrj)初次使用solr的开发人员总是很郁闷,不知道如何去操作solr索引库,以为只能用<五分钟solr4.5教程(搭建.运行)>中讲到的用xml文件的形式提交数据到索引库,其实没有 ...

  3. 使用solrj操作solr索引库,solr是lucene服务器

    客户端开发 Solrj 客户端开发 Solrj Solr是搭建好的lucene服务器 当然不可能完全满足一般的业务需求 可能 要针对各种的架构和业务调整 这里就需要用到Solrj了 Solrj是Sol ...

  4. Solr 09 - SolrJ操作Solr单机服务 (Solr的Java API)

    目录 1 SolrJ是什么 2 SolrJ对索引的CRUD操作 2.1 创建Maven工程(打包方式选择为jar) 2.2 配置pom.xml文件, 加入SolrJ的依赖 2.3 添加和修改索引 2. ...

  5. solrj 操作 solr 单机版

    一.导入 jar 包 <dependency> <groupId>org.apache.solr</groupId> <artifactId>solr- ...

  6. solrj 操作 solr 集群版

    一.添加 @Test public void testAddDocument() throws Exception{ //创建一个集群的连接,应该使用 CloudSolrServer,//zkHost ...

  7. Solr 14 - SolrJ操作SolrCloud集群 (Solr的Java API)

    目录 1 pom.xml文件的配置 2 SolrJ操作SolrCloud 1 pom.xml文件的配置 项目的pom.xml依赖信息请参照: Solr 09 - SolrJ操作Solr单机服务 (So ...

  8. Java操作Solr之SolrJ

    添加SolrJ的jar包 solrj是访问Solr服务的java客户端,提供索引和搜索的请求方法,SolrJ通常在嵌入在业务系统中,通过SolrJ的API接口操作Solr服务, <depende ...

  9. solr简介、学习详细过程!(超详细~)

    solr是什么呢? 一.Solr它是一种开放源码的.基于 Lucene Java 的搜索服务器,易于加入到 Web 应用程序中. 二.Solr 提供了层面搜索(就是统计).命中醒目显示并且支持多种输出 ...

随机推荐

  1. PostgreSQL同步方案

    Windows下Postgre SQL数据库通过Slony-I实现数据库双机同步备份 - 数据库其他综合 - 红黑联盟 postgresql同步流复制的Hot Standby - CSDN博客   使 ...

  2. 设计模式 笔记 桥接模式 Bridge

    //---------------------------15/04/15---------------------------- //Bridge 桥接模式----对象结构型模式 /* 1:意图:将 ...

  3. effective c++ 笔记 (1-3)

    // //  effective c++.cpp //  笔记 // //  Created by fam on 15/3/23. // // //-------------------------- ...

  4. tree的使用,显示行号,find命令应用

    第1章 linux启动过程 1.开机自检bios 2.mbr引导 3.GRUB 菜单:选择不同的内核 4.加载内核 5.运行init进程 6.读取/etc/inittab运行级别配置文件 7.执行 / ...

  5. 通过Heketi管理GlusterFS为K8S集群提供持久化存储

    参考文档: Github project:https://github.com/heketi/heketi MANAGING VOLUMES USING HEKETI:https://access.r ...

  6. Ubuntu 18.04下Couldn't connect to Docker daemon at http+docker://localunixsocket解决办法

    一台服务器系统为:Ubuntu 18.04 LTS,上面建了git裸仓库,用于开发吧代码push到这里.同时WEB测试环境通过docker也部署在这台.通过git钩子post-receive,当有新代 ...

  7. ubuntu16.04下Hyperledger之搭建Fabric环境简单操作(五步启动e2e_cli)

    如果你已经安装好go等工具.git及checkout相关代及下载相关镜像,您只需下面5步就能up e2e_cli~/go/src/github.com/hyperledger/fabric$ sudo ...

  8. PAT甲题题解-1127. ZigZagging on a Tree (30)-中序、后序建树

    根据中序遍历和前序遍历确定一棵二叉树,然后按“层次遍历”序列输出.输出规则:除根节点外,接下来每层的节点输出顺序是:先从左到右,再从右到左,交替输出 #include <iostream> ...

  9. LeetCode 70. Climbing Stairs爬楼梯 (C++)

    题目: You are climbing a stair case. It takes n steps to reach to the top. Each time you can either cl ...

  10. This is me

    This is me 爱琴棋 爱书画 也爱格物 爱跋山 爱涉水 也爱深林 This is me. 刘伯承的诗词有曰“高耸入云”,于是“李入云”便成为了我一生的标记,也造就了一个时而安静,时而疯狂的我 ...