使用solrJ对富文本文档建立索引

本文介绍如何使用SolrJ进行Solr的增删改查操作,包括配置属性、测试示例及数据库导入等内容,适合Solr初学者和开发者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值