Solr单机版简介和安装以及Spring boot集成使用

目录

    一、简单介绍solr
    二、solr安装
    三、分析器安装
    四、全量导入、增量导入
    五、java 集成客户端
    六、docker部署。


一:Solr简介

    1、Solr它是一种开放源码的、基于 Lucene Java(lucene是一个做搜索用的类库,是一套信息检索工具包。 nutch和solr都是基于lucene的) 的搜索服务器,易于加入到 Web 应用程序中。
    2、Solr 提供了层面搜索、命中醒目显示并且支持多种输入输出格式(包括XML/XSLT 和JSON等格式)。它易于安装和配置,而且附带了一个基于 HTTP 的管理界面。Solr已经在众多大型的网站中使用,较为成熟和稳定。
    3、Solr 包装并扩展了 Lucene,所以Solr的基本上沿用了Lucene的相关术语。更重要的是,Solr 创建的索引与 Lucene 搜索引擎库完全兼容。
    4、通过对Solr 进行适当的配置,某些情况下可能需要进行编码,Solr 可以阅读和使用构建到其他 Lucene 应用程序中的索引。

    5、此外,很多 Lucene 工具(如Nutch)也可以使用Solr 创建的索引。可以使用 Solr 的表现优异的基本搜索功能,也可以对它进行扩展从而满足企业的需要。

总结:我们可以看出 solr 和 Lucene 并不是一个竞争的关系,solr是基于Lucene 做的一个搜索引擎服务器。我们可以把Lucene 看成是一个底层的搜索api,甚至可以说看成是SDK。而Solr是一个有HTTP接口的基于Lucene的查询服务器,封装了很多Lucene细节并且提供了层面搜索、命中醒目显示并且支持多种输入输出格式(包括XML/XSLT 和JSON等格式)。它易于安装和配置,而且附带了一个基于 HTTP 的管理界面。

二:Solr版本的选择,4.X如何选择?

自从2013年开始,solr一改风格,成为了又一个版本帝,一月一个甚至一月俩个版本,用户如何选择就成了一个难题。
如此多的版本并不好选择,并且还有非常多的问题(偶数版本都有问题,不能使用),所以总结记录下:
4.0    开始引入solrcloud的概念
4.1    启用了lucene4.1默认的编码器存储领域压缩在默认情况下,压缩比第一次出现了负增长
4.2    有bug,不能线上使用
4.3.1  可以线上使用
4.4    有bug,不能线上使用
4.5.1  可以线上使用  (例:YY使用的solr4.5.1)
4.6    有bug,不能线上使用
4.7.1  可以线上使用  (例:56视频使用的solr4.7.1)不过因为4.8改变了旧的配置方式,如果出现问题将没有版本的继续优化,所以4.7.1成了一个纪念版本
4.8    有bug,不能线上使用
4.9    有bug,不能线上使用
总结:
solr4.3.1,solr4.5.1,solr4.7.1都可以线上使用,如果数据量要求不高,solr3.6也可以使用
从5.0开始,solr不再以war包发布(war包可以部署到任何servlet容器中),而是以独立的java服务器程序的形式发布(基于内嵌的jetty),它有启动/停止脚本,后续版本不支持部署到其他的servlet容器上(如tomcat)。

参考:http://blog.csdn.net/ningzuobei/article/details/53010156

准备工作:
    下载tomcat 8: http://tomcat.apache.org/download-80.cgi
    下载Solr4.7.1:http://archive.apache.org/dist/lucene/solr/
分析器:
    下载IKAnalyzer:http://download.csdn.net/download/z3225167/10223827
    下载pinyinAnalyzer4.3.1:http://download.csdn.net/download/mackywuqiong/8425141
    下载pinyinAnalyzer:http://download.csdn.net/download/z3225167/10223901
    下载pinyin4j-2.5.0.jar:
数据导入:

      下载mysql对应版本驱动包:http://download.csdn.net/download/small_lee/9947703

tomcat配置

1、修改tomcat的conf目录下的server.xml,在
 <Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
配置里任意位置增加URIEncoding="UTF-8"
2、修改tomcat端口,避免和其他应用服务的端口发生冲突。
3、设置tomcat启动jvm内存。
4、将 solr-4.7.1\example\lib\ext下的所有jar文件复制到tomcat\lib下。

注:不然会报404页面找不到

二、Solr配置

1、将下载的 solr-4.7.1.zip 解压 ,将solr-4.7.1\dist\solr-4.7.1.war文件复制到tomcat的webapps目录下,并将文件命名为solr.war。
注:war是一个完整的web应用程序,包括了solr的jar文件和所有运行Solr所依赖的Jar文件,Jsp和很多的配置文件与资源文件。
2.配置solr/home的地址,找到solr\WEB-INF\web.xml编辑
<env-entry>
<env-entry-name>solr/home</env-entry-name>
<env-entry-value>G:\lanwon\doc\solrtrain\apache-tomcat-8.5.27\webapps\solrHome</env-entry-value>
  <env-entry-type>java.lang.String</env-entry-type>
</env-entry>

solr/home:solr配置文件所在目录,一般放到与webapps同级的目录。

注:该路径不能存在中文.

3、solr home设置:
复制solr解压目录下的solr-4.7.1\example\solr目录到solrHome。
4、设置G:\lanwon\doc\solrtrain\apache-tomcat-8.5.27\webapps\solrHome\collection1\conf\solrconfig.xml
找到下面这项配置,这个是指定你的索引文件存在什么地方的
<dataDir>${solr.data.dir:}</dataDir>
5、设置好之后找到tomcat的bin目录下的startup.bat双击启动。
5-1、输入http://localhost:8080/solr
现在我们来看看目前支持的分词是否满足,我们想要的业务。
5-2、如果我们想支持中文全拼、分词、英文全拼、英文分词、该怎么做。

三、分析器安装

  1、我们需要使用到的jar包、配置如下:

把ik-analyzer.jar、pinyin4j-2.5.0.jar、pinyinAnalyzer.jar、pinyinAnalyzer4.3.1.jar放到solr\WEB-INF\lib下。

2.找到solrHome\collection1\conf\的schema.xml,添加分析器

<fieldType name="text_pinyin" class="solr.TextField" positionIncrementGap="0">
     <analyzer type="index"><!--索引分析器-->
	  <tokenizer class="solr.KeywordTokenizerFactory"/><!--分词器-->
               <filter class="org.wltea.analyzer.pinyin.solr.PinyinTokenFilterFactory" pinyinAll="true"             minTermLength="1" />
               <filter class="com.shentong.search.analyzers.PinyinNGramTokenFilterFactory" minGram="1" maxGram="20" />
               <filter class="solr.ReversedWildcardFilterFactory" />
    </analyzer>
    <analyzer type="query"><!--查询分析器-->
	<tokenizer class="solr.KeywordTokenizerFactory"/><!--分词器-->
              <filter class="org.wltea.analyzer.pinyin.solr.PinyinTokenFilterFactory" pinyinAll="true" minTermLength="1" />
              <filter class="com.shentong.search.analyzers.PinyinNGramTokenFilterFactory" minGram="1" maxGram="20" />
              <filter class="solr.ReversedWildcardFilterFactory" />
       </analyzer>

</fieldType>

3.安装完成分析器后,进入http://localhost:8080/solr/查看效果。

4.选择当前的core,进入analysis页面测试分词效果。

四、数据全量、增量导入

1、我们需要使用到的jar包、配置如下:
把mysql-connector-java-5.1.43-bin.jar、以及solr-4.7.1\dist\solr-dataimporthandler-4.7.1.jar、solr-dataimporthandler-extras-4.7.1.jar放到solr\WEB-INF\lib下。
2、修改solrHome\collection1\conf\solrconfig.xml添加如下:    

<requestHandler name="/dataimport"
	class="org.apache.solr.handler.dataimport.DataImportHandler">
	<lst name="defaults">
		<str name="config">data-config.xml</str>
	</lst>
     </requestHandler>

3、当前目录新建data-config.xml文件,该文件做为连接数据库及sql。

4、编辑data-config.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<dataConfig>
  <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://192.168.0.200:3306/clinical_test1" user="root" password="Lwkj@2017" batchSize="-1" />
  <document>
    <entity name="t_patient" pk="id" query="SELECT patient_idty as id,name FROM t_patient GROUP BY name order by patient_idty "
			deltaImportQuery="SELECT patient_idty as id,name FROM t_patient where patient_idty='${dih.delta.id}' GROUP BY name order by patient_idty "
		    deltaQuery="select patient_idty as id FROM t_patient WHERE UPDATE_TIME > '${dih.last_index_time}' GROUP BY name order by patient_idty ">
	 >
      <field column="id" name="id" />
       <field name="name" column="name"/>
    </entity>
  </document>

</dataConfig>

4、<!-- pk="ID" 必须,因为其中的增量索引查询主键ID时需要  -->
      <!--  dataSource="acitvityDB" 这个引用名字是引用上面数据源的名字 -->
      <!--  name="myentity" 存在多个实体时,这个名字必须唯一 -->
      <!--  query:用于全量导入 -->   
      <!--  deltaImportQuery: 增量导入起作用,可以返回多个字段的值,一般情况下,都是返回所有字段的列   -->   
      <!--  deltaQuery : 用于增量导入且只返回ID  
             deltaQuery="select ID  from myentity where my_date >   '${dih.last_index_time}'"    deltaQuery的意思是,查询出所有经过修改的记录的ID    可能是修改操作,添加操作   -->    
         <!--  deletedPkQuery : 用于增量导入且只返回ID  
          deletedPkQuery="select ID from myentity where isdelete=1"      
          此操作只查询那些数据库里伪删除的数据的ID(即isdelete标识为1的数据)    solr通过它来删除索引里面对应的数据   -->   
5、找到solrHome\collection1\conf设置对应字段 对应的 分析器
如果说字段存在的情况下:

<field name="pinyin" type ="text_pinyin" indexed ="true" stored ="true" multiValued ="true"/>

<copyField source="name" dest="pinyin"/>

Solr主要配置文件介绍

solrconfig.xml:该文件是solr的主配置文件,配置高亮,数据源,索引大小,索引合并等所有的索引策略配置;
schema.xml:该文件是配置查询字段信息,定义了所有的数据类型和各索引字段的信息(如类型,是否建立索引,是否存储原始信息);

data-config.xml:数据库配置信息文件,配置了数据源信息,全量索引,增量索引的数据库查询……


五、solrJ与spring-data-solr

Solr的客户端基本上只有一个,那就是solrj。
SolrJ是操作Solr的JAVA客户端,它提供了增加、修改、删除、查询Solr索引的JAVA接口。SolrJ针对 Solr提供了Rest 的HTTP接口进行了封装, SolrJ底层是通过使用httpClient中的方法来完成Solr的操作。

spring-data-solr是在solrj的基础上做的封装,使统一成spring-data的风格

Spring boot集成Solr

1、pom.xml增加配置

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-solr</artifactId>
</dependency>
2、application.properties增加
spring.data.solr.host=http://localhost:8080/solr/collection1
3、调用时

@Autowired

private SolrClient server; 


示例一

@RequestMapping("/solrTest")
public Object testSolr(String param) throws IOException, SolrServerException {
	List<Map<String, String>> list = new ArrayList<Map<String, String>>();
	try {
		SolrQuery query = new SolrQuery();
		if(StringUtils.isNotEmpty(param)) {
			query.set("q", "pinyin:*" +  param + " or name:*"+param);// 高亮查询字段
		}else {
			query.set("q", "pinyin:*");// 高亮查询字段
		}


		QueryResponse qr = server.query(query);// 执行查询
//		List<Test> list = qr.getBeans(Test.class);			
		SolrDocumentList dlist = qr.getResults();
		Map<String, String> mapRe = null;
		for (SolrDocument sd : dlist) {
		mapRe = new HashMap<String, String>();
		mapRe.put("id", sd.getFieldValue("id").toString());
		mapRe.put("name", sd.getFieldValue("name").toString());
		list.add(mapRe);
	}
	} catch (Exception e) {
		e.printStackTrace();
	}
	return list;

}

关键字加亮

//设置高亮
query.setHighlight(true); // 开启高亮组件或用query.setParam("hl", "true");    
query.addHighlightField("name");// 高亮字段  多个则多号隔开Song_Name,Song_SingerName
query.set("hl.highlightMultiTerm","true");//启用多字段高亮
query.setHighlightSimplePre("<font style=\"color:#A7D043;font-weight:bold;\">"); //标记,高亮关键字前缀
query.setHighlightSimplePost("</font>");//后缀

通过Map<String, Map<String, List<String>>>  map=qr.getHighlighting();获取加亮的字段。

六、docker部署

1、编写DockerFile。
#基本镜像
FROM centos
#把你上传的jdk放到docker容器里面的root目录下
    ADD jdk-8u121-linux-x64.tar.gz /root
    #把你上传的Tomcat放到docker容器里面的root目录下
    ADD apache-tomcat-8.0.32.tar.gz /root
    #设置环境变量
    ENV JAVA_HOME /root/jdk1.8.0_121
    #设置环境变量
    ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    #设置环境变量
    ENV CATALINA_HOME /root/apache-tomcat-8.0.32
    #设置环境变量
    ENV CATALINA_BASE /root/apache-tomcat-8.0.32
    #设置环境变量
    ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
    #执行startup.sh 并打开日志

    ENTRYPOINT /root/apache-tomcat-8.0.32/bin/startup.sh && tail -F /root/apache-tomcat-8.0.32/logs/catalina.out

执行命令:

    docker build -t docker-tomcat-solr .
    docker run -d -p 28080:28080   docker-tomcat-solr
    docker ps -a 

   由于以上内容是当初在公司做内部培训的,很多地方都是现场操作,现场交的,这里只是把PPT中的内容copy过来了,很多地方不是很详细勿怪!!!

猜你喜欢

转载自blog.csdn.net/z3225167/article/details/79537811