温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

springboot 中怎么整合solr

发布时间:2021-07-30 14:25:10 来源:亿速云 阅读:250 作者:Leah 栏目:大数据

springboot 中怎么整合solr ,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

一、版本介绍:

jdk1.8
tomcat8
springboot 2.1.3RELEASE(这里有坑,详见下文)
solr 7.4.0 (没有选择最新的版本,是因为项目的boot版本是2.1.3,其对应的solr-solrj.jar版本是7.4.0,为避免出现不可预料不可抗拒不可解决的问题,谨慎选用与之一样版本)

二、solr服务器搭建

下载
  • 1.tomcat8的下载不赘述;

  • 2.solr下载: 进入solr官网 ,找历史版本下载v7.4.0的压缩包,事实上 solr archive 本人并没有访问成功,
    如果网友和我一样访问不了,那只能说明你的脸黑,而官网应该是瓦掉了,所以本人肯定是没有问题的,下面把从网上肆虐而来的一个资源分享一下,附带了一个ik分词器的压缩包,后面有用: 百度网盘 提取码:6mhk


解压
  • 1.解压solr至 D:\JAVA\solr\solr-7.4.0\(下文均以solr-7.4.0代替此全路径)

  • 2.解压tomcat至 D:\JAVA\solr\apache-tomcat-8.5.42(下文均以tomcat-8.5.42代替此全路径)


配置solrhome
  • 1.在路径D:\JAVA\solr\下新建文件夹solrhome(下文均以solrhome代替此全路径)

  • 2.在solrhome下新建logs文件夹(记下此路径:D:\JAVA\solr\solrhome\logs)

  • 3.复制文件夹solr-7.4.0\contrib和solr-7.4.0\dist至solrhome下 springboot 中怎么整合solr

  • 4.复制solr-7.4.0\server\solr下所有文件至solrhome下 springboot 中怎么整合solr

贴出具体代码如下:

  <lib dir="${solr.install.dir:../}/contrib/extraction/lib" regex=".*\.jar" />
  <lib dir="${solr.install.dir:../}/dist/" regex="solr-cell-\d.*\.jar" />
  
  <lib dir="${solr.install.dir:../}/contrib/clustering/lib/" regex=".*\.jar" />
  <lib dir="${solr.install.dir:../}/dist/" regex="solr-clustering-\d.*\.jar" />
  
  <lib dir="${solr.install.dir:../}/contrib/langid/lib/" regex=".*\.jar" />
  <lib dir="${solr.install.dir:../}/dist/" regex="solr-langid-\d.*\.jar" />
  
  <lib dir="${solr.install.dir:../}/contrib/velocity/lib" regex=".*\.jar" />
  <lib dir="${solr.install.dir:../}/dist/" regex="solr-velocity-\d.*\.jar" />
  <lib dir="${solr.install.dir:../}/dist/" regex="ojdbc\d.*\.jar" />
  <lib dir="${solr.install.dir:../}/dist/" regex="solr-dataimporthandler\d.*\.jar" />
	<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
		<lst name="defaults">
			<!-- 这个文件名配置有用 -->
			<str name="config">data-config.xml</str>
		</lst>
	</requestHandler>
  • 7.在solrhome\new_core\conf下新建文件data-config.xml(文件名与上述xml配置保持一致),文件内容如下:

<?xml version="1.0" encoding="UTF-8"?> 
<dataConfig>
    <!-- 数据库基本配置,需要将对应数据库驱动放到tomcat下,见后续操作 -->
    <dataSource name="source1" 
	      type="JdbcDataSource"
              driver="com.mysql.jdbc.Driver"
              url="jdbc:mysql://localhost:3306/dbname?useSSL=true&amp;serverTimezone=UTC"
              user="username"
              password="password" />
    <document>
	<!-- entity name必须给值 query为查询语句 field-column对应数据库列 name是查询结果返回的名称,类似mybatis -->
        <entity name="test_demo" dataSource="source1" pk="id"
            query="SELECT id,name FROM demo">
            <field column='name' name='demoName' />
	    <field column='id' name='id' />
        </entity>
    </document>
</dataConfig>
  • 8.修改conf\managed-schema springboot 中怎么整合solr

如果配置了ik分词器可以按此修改: <field name="demoName">


配置tomcat
  • 1.将solr-7.4.0\server\solr-webapp\下的webapp文件夹复制到tomcat-8.5.42\webapps 并且修改名称为solr

  • 2.在tomcat-8.5.42\webapps\solr\WEB-INF\下新建classes包,将solr-7.4.0\server\resources\log4j2.xml复制到classes包下

  • 3.将下图标注jar复制到tomcat-8.5.42\webapps\solr\WEB-INF\lib(数据库驱动包可以在自己的web项目里找,找到后也复制到该目录下)
    springboot 中怎么整合solr springboot 中怎么整合solr

修改D:\JAVA\solr\apache-tomcat-8.5.42\webapps\solr\WEB-INF\web.xml如下:

<!-- 放开注释 修改solrhome地址 -->
    <env-entry>
       <env-entry-name>solr/home</env-entry-name>
       <!-- 这个solrhome地址即上述创建的solrhome文件夹路径 -->
       <env-entry-value>D:\JAVA\solr\solrhome</env-entry-value>
       <env-entry-type>java.lang.String</env-entry-type>
    </env-entry>
	
<!-- 此处省略部分配置代码 -->
	
<!-- 找到最后注释掉这一块的代码,据说是因为此配置限制了对solr资源的访问 -->
<!-- <security-constraint>
    <web-resource-collection>
      <web-resource-name>Disable TRACE</web-resource-name>
      <url-pattern>/</url-pattern>
      <http-method>TRACE</http-method>
    </web-resource-collection>
    <auth-constraint/>
  </security-constraint>
  <security-constraint>
    <web-resource-collection>
      <web-resource-name>Enable everything but TRACE</web-resource-name>
      <url-pattern>/</url-pattern>
      <http-method-omission>TRACE</http-method-omission>
    </web-resource-collection>
  </security-constraint>-->

修改tomcat端口号 ....conf\server.xml 为8888

    <Connector port="8888">

修改D:\JAVA\solr\apache-tomcat-8.5.42\bin\catalina.bat(最后一行是新添加的)

if not "%JSSE_OPTS%" == "" goto gotJsseOpts
set JSSE_OPTS="-Djdk.tls.ephemeralDHKeySize=2048"
:gotJsseOpts
set "JAVA_OPTS=%JAVA_OPTS% %JSSE_OPTS%"
set "JAVA_OPTS=%JAVA_OPTS% -Dsolr.log.dir=D:\JAVA\solr\solrhome\logs"

ik分词器的集成

将ik分词器解压出来的两个jar放到tomcat-8.5.42\webapps\solr\WEB-INF\lib下,然后配置solrhome\new_core\conf\managed-schema 在文件最后添加:

<schema>
<!-- 省略原有代码 -->

 <fieldType name="text_ik" class="solr.TextField" positionIncrementGap="100">    
     <analyzer type="index">
         <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory"  useSmart="false"/>    
         <filter class="solr.LowerCaseFilterFactory"/>    
     </analyzer>    
     <analyzer type="query">
         <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory"  useSmart="true"/>         
         <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>    
         <filter class="solr.LowerCaseFilterFactory"/>    
     </analyzer>    
  </fieldType>
  
</schema>

三、solr体验

启动tomcat,访问 http://localhost:8888/solr/index.html#/ springboot 中怎么整合solr

用ik解析中文语句,匹配测试如下 springboot 中怎么整合solr

检索测试


三、springboot中使用solr

配置pom
 		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-solr</artifactId>
		</dependency>
配置yml
spring:
  data:
    solr:
      host: http://127.0.0.1:8888/solr

注意:如果你使用的是springboot 2.1.3RELEASE,按照下述操作步骤走完,启动项目会报错,
提示: Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true
据说是springboot 2.1.3RELEASE的一个bug,需要在yml中配置一下:

spring:
  main:
    allow-bean-definition-overriding: true #当遇到同样名字的时候,是否允许覆盖注册
编写一个demo,代码如下:

1.entity:

import org.apache.solr.client.solrj.beans.Field;
import org.springframework.data.solr.core.mapping.SolrDocument;

@SolrDocument(collection="new_core")
public class SolrDemo {

	@org.springframework.data.annotation.Id 
	private String id;
	
	@Field("demoName")
	private String name;
	
	//省略getset
}

2.dao:

import org.jeecg.modules.demo.test.entity.SolrDemo;
import org.springframework.data.solr.repository.SolrCrudRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface SolrDemoRepository extends SolrCrudRepository<SolrDemo, String>{

}

3.service接口

import java.io.IOException;
import java.util.List;

import org.apache.solr.client.solrj.SolrServerException;
import org.jeecg.modules.demo.test.entity.SolrDemo;

public interface ISolrService {
	
	void addDemo();
	
	void updatedemo();
	
	void deletedemo();
	
	List<SolrDemo> queryList(String keyword)  throws SolrServerException, IOException;

}

4.service实现类

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.jeecg.modules.demo.test.entity.SolrDemo;
import org.jeecg.modules.demo.test.mapper.SolrDemoRepository;
import org.jeecg.modules.demo.test.service.ISolrService;
import org.springframework.stereotype.Service;

@Service
public class SolrServiceImpl  implements ISolrService {
	
	@Resource
	private SolrDemoRepository solrDemoRepository;

	@Override
	public void addDemo() {
	//正常情况应该在方法中定义参数将实体传进来,此处demo简单写
		SolrDemo demo = new SolrDemo();
		demo.setId("001");
		demo.setName("俺们都是打酱油的哈哈破");
		solrDemoRepository.save(demo);
	}

	@Override
	public void updatedemo() {
		SolrDemo demo = new SolrDemo();
		demo.setId("001");
		demo.setName("你在搞什么扫话题嘎嘎");
		solrDemoRepository.save(demo);
		
	}

	@Override
	public void deletedemo() {
		solrDemoRepository.deleteById("001");
	}

	@Override
	public List<SolrDemo> queryList(String keyword) throws SolrServerException, IOException {
	/*
	 * 这里有个坑爹的地方,正常情况可以直接在service里直接注入SolrClient,
	 * 但是因为yml中配置的地址是http://127.0.0.1:8888/solr/,导致注入的SolrClient执行下述查询会报错,
	 * 无奈只能这么玩了,若网友有好的解决方法,请在下方留言
	 * 或是调用SolrCrudRepository中的查询方法(我这里需要根据具体字段查询且分页,欢迎留言贴出示例代码)
	 * 个人猜测应该是springboot其进行了二次封装,根据实体上的注解实例化不同的SolrClient?
	 * 
	*/
		String solrUrl = "http://127.0.0.1:8888/solr/new_core";
		SolrClient testSolrClient = new HttpSolrClient.Builder(solrUrl)
	            .withConnectionTimeout(10000)
	            .withSocketTimeout(60000)
	            .build();
		
		SolrQuery query = new SolrQuery();
		
		//设置查询条件
		query.setQuery("demoName:"+keyword);
		
		//按照时间排序
       // query.addSort("create_time", SolrQuery.ORDER.desc);
		
        //开始页
        query.setStart(0);
        //一页显示多少条
        query.setRows(50);
        
		//开启高亮
		//query.setHighlight(true);
		//设置高亮字段
		//query.addHighlightField("demoName");
		//前缀
		//query.setHighlightSimplePre("<font color='red'>");
		//后缀
		//query.setHighlightSimplePost("</font>");
		//执行查找
		QueryResponse response = testSolrClient.query(query);
		
		SolrDocumentList results = response.getResults();
		//获取查询到的数据总量
		long numFound = results.getNumFound();
		if(numFound <= 0) {
			//如果小于0,表示未查询到任何数据,返回null
			return null;
		}else {
		
			List<SolrDemo> list = new ArrayList<SolrDemo>();
			//遍历结果集
			for (SolrDocument doc : results) {
				//得到每条数据的map集合
				Map<String, Object> map = doc.getFieldValueMap();
				//添加到list
				for (String key : map.keySet()) {
					System.out.println("KEY:"+key+",VALUE:"+map.get(key).toString());
				}
				SolrDemo demo = new SolrDemo();
				demo.setId(map.get("id").toString());
				demo.setName(map.get("demoName").toString());
				list.add(demo);
			}
			return list;
		}
	}
	
	
	

}

controller层,就是直接写几个请求然后调用一下service即可,代码及后续测试结果就不贴出来了,请自行编写。

备注

1.solr文件说明

文件夹描述
contribsolr的一些插件,用于扩展solr的功能
dist该文件夹下包含build过程中产生的war和jar文件,以及相关的依赖文件
docsolr的文档
examplesolr官方提供的一些示例程序,简单介绍下面三个目录solr、multicore、webapps
solr该目录是一个包含了默认配置信息的Solr的Core目录
multicore该目录包含了在Solr的multicore中设置的多个Core目录
webapps该目录中包括一个solr.war,该war可作为solr的运行实例工程

2.清除索引文件 <delete><query>*:*</query></delete><commit/> springboot 中怎么整合solr

3.solrHome是solr运行的主目录,其下可以创建多个solrCore,solrCore单独对外提供一个搜索服务。

4.solr.install.dir表示solrCore的位置,需要根据实际jar包的位置更改jar包引用路径

5.solr.data.dir表示索引文件存储地址 默认solrCore/data,一开始没有,会自动创建,若要修改,找solrconfig.xml文件 <dataDir>${solr.data.dir:}</dataDir>

5.ik分词器的集成(关于忽略词,近义词等等详细配置后续添加)

看完上述内容,你们掌握springboot 中怎么整合solr 的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI