简介
SolrJ是操作Solr的JAVA客户端,它提供了增加、修改、删除、查询Solr索引的JAVA接口。SolrJ针对Solr提供了Rest 的HTTP接口进行了封装,SolrJ底层是通过使用httpClient中的方法来完成Solr的操作。(solrJ查询数据库)
准备工作
1.安装Mysql 8.0.11,并开放root权限。
具体的参考网址:https://blog.youkuaiyun.com/wzy18210825916/article/details/80946454#t2
2.安装solr7.4并新建core,参考:https://blog.youkuaiyun.com/diyinqian/article/details/88414343
配置属性
1、在自己创建的core(即你们创建的onlyoffice)/conf目录下创建一个文件data-config.xml,与solrconfig.xml同级。
2、solrconfig.xml文件:
在<requestHandler name="/select" class="solr.SearchHandler">
上面增加以下这段代码:
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">data-config.xml</str>
</lst>
</requestHandler>
即
其中<str name="config"></str>
里的内容就是我们在上一步创建的data-config.xml文件,将它们关联起来。
3、打开data-config.xml文件,配置相关的数据库属性,即我们要导入那张表的哪些字段,内容如下:
<?xml version="1.0" encoding="UTF-8" ?>
<dataConfig>
<!-- url如果包含特殊字符如";",必须使用html转移字符 -->
<dataSource driver="com.mysql.cj.jdbc.Driver"
user="root" password="123456" batchSize="-1"
url="jdbc:mysql://10.5.0.174:3306/solr?serverTimezone=UTC"/>
<document>
<!-- query为全量更新SQL -->
<entity name="books" pk="id" query="select * from books">
<!-- 每一个field映射着数据库中列与文档中的域,column是数据库列,name是solr的域(必须是在managed-schema文件中配置过的域才行) -->
<field column="id" name="id"/>
<field column="name" name="name"/>
<field column="author" name="author"/>
<field column="description" name="description"/>
</entity>
</document>
</dataConfig>
注意:其中的数据库地址等需要改成自己的,url是你要访问的数据库路径,我这里指定到我的数据库。user是用户名,password是你的数据库密码。query是一个sql语句,你需要导入哪张表的哪些字段,查就行了。然后<field>
标签中的column属性是你SQL语句中查询的字段,跟数据库中对应;name属性是你给它起的一个别名,必须指定的,至于name属性是干嘛的,继续往下操作,自然会明白。有多个查询字段就需要有多个<field>
标签,每一个<field>
标签对应一个字段。
4、打开managed-schema文件,将刚才在data-config.xml中配置的标签添加进来
就跟配置富文本是一样的(我认为此时不应该再配置有,因为富文本查询的关键字和sql查询的关键字应该是一样的,注意“别名”的时候应该和富文本查询的字段一致)
类似如下添加:
这里<field>
里的name属性值,就是我们刚才在data-config.xml
中<field>
标签的name属性值,这是name属性的第一个用途,关联起来。type类型是你的数据类型,要看你从数据库中查的字段是什么类型,我这里是string字符串。
测试demo
public class SolrJTest {
@Test
public void testInsertIndexByDocument() throws Exception {
//创建服务器对象 使用SolrJ进行索引的时候,应该使用http://localhost:8080/solr/core2,即无中间的#号。
HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/new_core");
//创建文档对象
SolrInputDocument document = new SolrInputDocument();
//添加索引数据
document.addField("id", "1");
document.addField("name", "sansung爆炸牌手机");
document.addField("author", 666);
document.addField("description", "www.boom.png");
//添加文档
server.add(document);
//提交请求,如果ID对应的数据存在则进行更新操作,如果不存在则创建索引
server.commit();
}
/**
* 使用注解和JavaBean添加或修改数据
* 创建JavaBean,并且用注解标明要添加到索引库的字段,直接通过SolrServer添加JavaBean。
* 简单的方法就是在对象类中相应字段添加注释 @Field
*/
@Test
public void testInsertIndexByBean() throws Exception {
//创建服务器对象
HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/new_core");
//添加数据
server.addBean(new Person("2", "李四", "李四是个好学生"));
//提交请求,如果ID对应的数据存在则进行更新操作,如果不存在则创建索引
server.commit();
}
/**
* 使用SolrJ删除索引库数据
* 删除索引可以根据ID删除,也可以写一个查询条件,匹配到条件的都会被删除
*
* @throws Exception
*/
@Test
public void testDeleteIndex() throws Exception {
//创建服务器对象
HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/new_core");
//根据条件进行删除
server.deleteByQuery("name:《孙子兵法》");
//提交请求
server.commit();
}
/**
* 使用SolrJ查询索引库数据
*/
/**
* 以Document形式返回查询结果
*
* @throws SolrServerException
*/
@Test
public void testQueryIndex() throws SolrServerException {
//创建服务器对象
HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/new_core");
//定义查询条件
SolrQuery query = new SolrQuery("id:1");
//进行查询处理
QueryResponse response = server.query(query);
SolrDocumentList results = response.getResults();
int size = results.size();
System.out.println("共查询到" + size + "条数据");
//遍历数据
for (SolrDocument result : results) {
System.out.println("id: " + result.get("id"));
System.out.println("author: " + result.get("author"));
}
}
/**
* 以JavaBean形式返回查询结果
*
* @throws SolrServerException
*/
@Test
public void testQueryIndexBean() throws SolrServerException {
//创建服务器对象
HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/new_core");
//定义查询条件
SolrQuery query = new SolrQuery("id:1");
//进行查询处理
QueryResponse queryResponse = server.query(query);
List<Person> personList = queryResponse.getBeans(Person.class);
//遍历数据
for (Person person : personList) {
System.out.println("id: " + person.getId());
System.out.println("name: " + person.getName());
System.out.println("desc: " + person.getDesc());
}
}
/**
* SolrQuery实现排序
*
* @throws SolrServerException
*/
@Test
public void testQueryIndexSort() throws SolrServerException {
//创建服务器对象
HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/new_core");
//定义查询条件
SolrQuery solrQuery = new SolrQuery("*:*");
//设置按ID查询
solrQuery.setSort("id", SolrQuery.ORDER.desc);
//进行查询处理
QueryResponse queryResponse = server.query(solrQuery);
SolrDocumentList results = queryResponse.getResults();
int size = results.size();
System.out.println("共查找到" + size + "条数据");
//遍历数据
for (SolrDocument result : results) {
System.out.println("id: " + result.get("id"));
System.out.println("name: " + result.get("name"));
System.out.println("desc: " + result.get("desc"));
}
}
@Test
public void testQueryIndexPage() throws SolrServerException {
//要查询的页数
int pageNum = 2;
//每页显示条数
int pageSize = 1;
//当前页起始条数
int start = (pageNum - 1) * pageSize;
//创建服务器对象
HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/new_core");
//定义查询条件
SolrQuery query = new SolrQuery("*:*");
//设置按ID排序
query.setSort("id", SolrQuery.ORDER.asc);
//设置起始条数
query.setStart(start);
//设置每页条数
query.setRows(pageSize);
//进行查询处理
QueryResponse queryResponse = server.query(query);
SolrDocumentList results = queryResponse.getResults();
System.out.println("本次共搜索到" + results.size() + "条数据");
//遍历数据
for (SolrDocument result : results) {
System.out.println("id: " + result.get("id"));
System.out.println("name: " + result.get("name"));
System.out.println("desc: " + result.get("desc"));
}
}
// SolrQuery实现高亮显示
@Test
public void testQueryIndexHighLighting() throws SolrServerException {
//创建服务器对象
HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/new_core");
//定义查询条件
SolrQuery query = new SolrQuery("id:*");
//设置高亮标签
query.setHighlightSimplePre("<em>");
query.setHighlightSimplePost("</em>");
//设置高亮字段
query.addHighlightField("desc");
//进行查询处理
QueryResponse queryResponse = server.query(query);
SolrDocumentList results = queryResponse.getResults();
//获取高亮字段
Map<String, Map<String, List<String>>> highlighting = queryResponse.getHighlighting();
System.out.println("共找到了" + results.size() + "条数据");
//遍历数据
for (SolrDocument result : results) {
System.out.println("id: " + result.get("id"));
System.out.println("name: " + result.get("name"));
System.out.println("desc: " + result.get("desc"));
}
for (String s : highlighting.keySet()) {
System.out.println("s" + s);
Map<String, List<String>> stringListMap = highlighting.get(s);
for (String s1 : stringListMap.keySet()) {
System.out.println("s1" + s1);
List<String> stringList = stringListMap.get(s1);
for (String s2 : stringList) {
System.out.println("s2" + s2);
}
}
}
}
相关参考网址
https://wiki.apache.org/solr/Solrj#SolrJ.2FSolr_cross-version_compatibility