教程网址:https://blog.csdn.net/liaomin416100569/article/details/77301756

一 、solr简介

solr是以lucene为内核开发的企业级搜索应用 应用程序可以通过http请求方式来提交索引,查询索引,提供了比lucene更丰富的查询语言,是

一个高性能,高可用环境全文搜索引擎

二、核与文档的概念

核(core):是用于存储json格式的数据,等价于mysql中数据库的概念
       文档:一个json对象就是一个文档 相同属性的json数组集合就是一个表

三、使用dokcer安装solr安装

这里下载 solr-5.5.5的镜像

[root@localhost ~]# docker pull solr:5.5.5

创建一个名为 my_solr1 的的容器

[root@localhost ~]# docker run --name my_solr1 -id --net host -t solr:5.5.5

my_solr1 容器中使用 solr 账号创建一个名字是 mycore 的核

[root@localhost ~]# docker exec -it --user=solr my_solr1 bin/solr create_core -c mycore

创建完成后有以下提示

解释:
       --user=solr:表示用solr这个账号去执行这个命令(solr是默认用户)
       create_core -c mycore:创建一个名字是mycore的核(也可以认为是数据库的名字)

查看网页:ip:8983/solr/
       ip:指linux系统的ip

Documents:表示在里面新增一些json数据
Query:表示查询,在没有分词的情况下相当于数据库里面的:键=值(全文字匹配)

四、配置中文分词器

默认solr 没有使用中文分词器 所有搜索的词 都是整个句子就是一个词 搜索时 将单词全部写入才能搜索或者使用* 需要配置中文分词器目前比较好用的分词器 是IK 2012年停更 只支持到 Lucene4.7 所有 solr5.5 需要lucene5支持 需要修改部分源码来支持solr5.5

打开开发者工具,建立一个maven项目

导入依赖

<!-- 将4.7.2的版本剔除,添加5.5.5版本的依赖 --><dependencies><dependency><groupId>com.janeluo</groupId><artifactId>ikanalyzer</artifactId><version>2012_u6</version><exclusions><exclusion><groupId>org.apache.lucene</groupId><artifactId>lucene-core</artifactId></exclusion><exclusion><groupId>org.apache.lucene</groupId><artifactId>lucene-queryparser</artifactId></exclusion><exclusion><groupId>org.apache.lucene</groupId><artifactId>lucene-analyzers-common</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.apache.lucene</groupId><artifactId>lucene-core</artifactId><version>5.5.5</version></dependency><dependency><groupId>org.apache.lucene</groupId><artifactId>lucene-queryparser</artifactId><version>5.5.5</version></dependency><dependency><groupId>org.apache.lucene</groupId><artifactId>lucene-analyzers-common</artifactId><version>5.5.5</version></dependency></dependencies>

重写 org.wltea.analyzer.lucene 包下的 IKTokenizer 类与 IKAnalyzer

       将重写的两个类进行修改
              IKAnalyzer.java

              IKTokenizer.java

       将ikanalyzer-2012_u6.jar包复制出来,并将重新编译好的IKAnalyzer.class和IKTokenizer.class复制进去


       进入linux系统,将jar包复制到my_solr1容器的 /opt/solr/server/solr-webapp/webapp/WEB-INF/lib 目录下
              1.创建一个/opt/ika目录

[root@localhost ~]# cd /opt/ika

2.使用rz命令将jar包导入到linux系统 (没有rz命令的自己上网去查,这里就不解释了)

[root@localhost ika]# rz



              3.将jar包导入my_solr1容器的 /opt/solr/server/solr-webapp/webapp/WEB-INF/lib 目录下,然后重新启动容器

[root@localhost ika]# docker cp ./ikanalyzer-2012_u6.jar my_solr1:/opt/solr/server/solr-webapp/webapp/WEB-INF/lib
[root@localhost ika]# docker stop my_solr
[root@localhost ika]# docker start my_solr

定义分词器数据类型
              1.将容器中的managed-schema配置文件导出来进行修改

[root@localhost ika]# docker cp my_solr1:/opt/solr/server/solr/mycore/conf/managed-schema ./

2.在这里我为了方便直接打开**Notepad++**进行修改
                            添加字段类型

# 添加一个名字是:text_ik的字段类型<fieldType name="text_ik" class="solr.TextField" >
# 表示在键索引和查询的时候使用IK分词器<analyzer type="index" isMaxWordLength="false" class="org.wltea.analyzer.lucene.IKAnalyzer"/>   <analyzer type="query" isMaxWordLength="true" class="org.wltea.analyzer.lucene.IKAnalyzer"/> </fieldType>

添加动态字段

# 动态字段
# *_ik:表示将来添加的字段后面带有_ik都会用这里的,而不会自动添加
# text_ik: 表示将来_ik结尾的字段都会用text_ik字段类型
# indexed:表示是否分词<dynamicField name="*_ik" type="text_ik" indexed="true" stored="true"/>


                            将来增加字段和查询的时候想用分词,只要在字段的后面添加_ik就行了

3.将修改好的配置文件拷贝回容器目录

[root@localhost ika]# docker stop my_solr1
[root@localhost ika]# docker cp ./managed-schema my_solr1:/opt/solr/server/solr/mycore/conf/
[root@localhost ika]# docker start my_solr1

小知识:如果分词器配置出错,在插数据的时候会报错

模拟分词查询

{"id":"3","title_ik":"我爱中国","content_ik":"中国地大物博"}



五、数据库迁移

假设存在表 solr 表示 其中 有以下数据:

        进入solr所在服务器 搜索 dataimport相关jar包

[root@localhost ika]# docker exec -it my_solr1 bash
solr@localhost:/opt/solr$ find / -name *import*.jar
/opt/solr/dist/solr-dataimporthandler-5.5.5.jar
/opt/solr/dist/solr-dataimporthandler-extras-5.5.5.jar

1.将这两个jar包拷贝到 solr启动应用 webapp/lib目录下

cp /opt/solr/dist/solr-dataimporthandler-5.5.5.jar /opt/solr/server/solr-webapp/webapp/WEB-INF/lib
cp /opt/solr/dist/solr-dataimporthandler-extras-5.5.5.jar /opt/solr/server/solr-webapp/webapp/WEB-INF/lib

2,将mysql的驱动包 丢到该目录下
        网址:https://mvnrepository.com/artifact/mysql/mysql-connector-java/5.1.14
        下载到桌面

        使用 rz 命令导入linux系统里面

[root@localhost ika]# rz


        将mysql包导入名字是my_solrsolr容器的WEB-INF/lib目录下

[root@localhost ika]# docker cp ./mysql-connector-java-5.1.14.jar my_solr1:/opt/solr/server/solr-webapp/webapp/WEB-INF/lib

3.增加一个data-mysql.xml文件(配置连接的数据库以及查询的sql语句 ),这里我也拿Notepad++写了

<?xml version="1.0" encoding="UTF-8"?>
<dataConfig>  <dataSource name="source1" type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://192.168.0.243:3306/m1dn" user="root" password="ps123456" batchSize="-1" />
<document>  <entity name="solr" pk="solr_id"  dataSource="source1"   query="select * from  solr" ><field column="solr_id" name="id"/><field column="solr_title" name="solr_title_ik"/>  </entity>
</document>
</dataConfig>


4.将data-mysql.xml文件拷贝到solr容器的/opt/solr/server/solr/mycore/conf目录下

[root@localhost ika]# docker cp ./data-mysql.xml my_solr1:/opt/solr/server/solr/mycore/conf


5.修改solr容器中的solrconfig.xml文件 将其指定为data-mysql.xml 文件
        将容器中的solrconfig.xml文件拷贝出来进行编辑

[root@localhost ika]# docker cp my_solr1:/opt/solr/server/solr/mycore/conf/solrconfig.xml .

注意:最后的 . 表示:当前目录

打开notepad++编辑solrconfig.xml文件指定data-data.xml,添加:

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

注意:data-mysql.xml是指:你配置数据库配置的文件名

6.将solrconfig.xml文件拷贝回solr容器的/opt/solr/server/solr/mycore/conf目录下

[root@localhost ika]# docker cp ./solrconfig.xml my_solr1:/opt/solr/server/solr/mycore/conf
[root@localhost ika]# docker restart my_solr1

7.查看效果




提交之后,查询可能不会出来,重新刷新一下页面试试

六、springboot集成solr

我的solr核的数据

1.创建一个项目

2.导入依赖

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.10.RELEASE</version></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-solr</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.16.18</version><scope>provided</scope></dependency></dependencies>

3.构建一个实体类

@Data
// 指定你的solr服务器中核的名字
@SolrDocument(solrCoreName="mycore")
public class SolrFiled {private String id;
// 指定核里面的字段@Field("solr_title_ik")private String title;@Field("age_i")private String age;
}

4.增加一个main方法

@SpringBootApplication
public class SolrMain {/*@Beanpublic SolrTemplate solrTemplate(SolrClient client) {return new SolrTemplate(client);}*/public static void main(String[] args) {SpringApplication.run(SolrMain.class, args);}}

5.建立html界面展示

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>
<script type="text/javascript">function query(){$.ajax({url:'queryList',dataType:'json',data:'keyword='+$("#myKey").val(),type:'get',success:function(data){$("#vessel").text(JSON.stringify(data));}})}
</script>
</head>
<body>新闻:<input id="myKey" type="text" name="keyword"/><button onclick="query()">提交</button><div  id="vessel"></div>
</body>
</html>

6.增加一个配置文件:application.yml

spring: data: solr:
# 设置solr服务器启动的ip和端口host: http://192.168.115.131:8983/solr
server: port: 8888

7.建立dao层

参考网址:https://docs.spring.io/spring-data/solr/docs/2.1.17.RELEASE/reference/html/#solr.query-methods

// SolrFiled:实体类
// String:id的类型
public interface SolrDao extends SolrCrudRepository<SolrFiled, String> {// 看方法名字// 规范:findBy开头public List<SolrFiled> findByTitleAndId(String keyword,String id);// 不使用规范,使用手动来写// 使用核中的字段来对比@Query("solr_title_ik:?0  AND id:?1")public List<SolrFiled> query(String keyword,String id);// 分页// 查询到有pageable这个对象会自动分页 ,参数:当前页和每页显示的数量// 一定要注意是上面两种规范的一种,否则会报错@Query("solr_title_ik:?0")public Page<SolrFiled> pageFiled(String keyword,Pageable pageable);// 不分页排序// 一定要注意是上面两种规范的一种,否则会报错public List<SolrFiled> findByTitle(String keyword,Sort sort);}

8.建立controller层

@RestController
public class SolrController {/*@Autowiredprivate SolrTemplate solrTemplate;*/@Autowiredprivate SolrDao solrDao;@GetMapping("/queryList")public List<SolrFiled> query(String keyword){/*SimpleQuery sq = new SimpleQuery("solr_title_ik:"+keyword);Page<SolrFiled> query = solrTemplate.query(sq, SolrFiled.class);*/List<SolrFiled> findByTitle = solrDao.findByTitleAndId(keyword,"2");List<SolrFiled> query = solrDao.query(keyword,"3");// 分页// 排序:加个Sort参数// Direction.ASC:升序PageRequest page = new PageRequest(0,2,new Sort(Direction.ASC,"age_i"));Page<SolrFiled> pageFiled = solrDao.pageFiled(keyword, page);List<SolrFiled> content = pageFiled.getContent();// 不分页直接排序List<SolrFiled> findByTitle2 = solrDao.findByTitle(keyword, new Sort(Direction.ASC,"age_i"));return findByTitle2;}}

8.执行main方法与效果展示

solr应用入门实例相关推荐

  1. Asp.Net MVC2.0 Url 路由入门---实例篇

    本篇主要讲述Routing组件的作用,以及举几个实例来学习Asp.Net MVC2.0 Url路由技术. 接着上一篇开始讲,我们在Global.asax中注册一条路由后,我们的请求是怎么转到相应的Vi ...

  2. SpringMVC 框架系列之初识与入门实例

    微信公众号:compassblog 欢迎关注.转发,互相学习,共同进步! 有任何问题,请后台留言联系! 1.SpringMVC 概述 (1).什么是 MVC:Model-View-Control Co ...

  3. 《HFSS电磁仿真设计从入门到精通》一第2章 入门实例——T形波导的内场分析和优化设计...

    本节书摘来自异步社区<HFSS电磁仿真设计从入门到精通>一书中的第2章,作者 易迪拓培训 , 李明洋 , 刘敏,更多章节内容可以访问云栖社区"异步社区"公众号查看 第2 ...

  4. python爬虫实例-10个python爬虫入门实例

    昨天带伙伴萌学习python爬虫,准备了几个简单的入门实例 涉及主要知识点: web是如何交互的 requests库的get.post函数的应用 response对象的相关函数,属性 python文件 ...

  5. python爬虫程序实例-10个python爬虫入门实例

    作者:h3zh1 来源:cnblogs.com/h3zh1/p/12548946.html 今天为大家准备了几个简单的python爬虫入门实例,分享给大家. 涉及主要知识点:web是如何交互的 req ...

  6. ADO.NET Entity Data Model入门实例

    ADO.NET Entity Data Model入门实例 快速开发一个网站,最繁琐的地方可能要算数据库访问和ORM了,还好.net中这个很强大,可以省去好多体力劳动. 这里就给个快速使用ADO.NE ...

  7. Java Socket入门实例

    基于测试驱动的Socket入门实例(代码的具体功能可以看我的程序中的注释,不理解的可以短信我) 先看Server的代码: package socketStudy; import java.io.Buf ...

  8. linux Shell(脚本)编程入门实例讲解详解

    linux Shell(脚本)编程入门实例讲解详解 为什么要进行shell编程 在Linux系统中,虽然有各种各样的图形化接口工具,但是sell仍然是一个非常灵活的工具.Shell不仅仅是命令的收集, ...

  9. Activiti工作流从入门到入土:入门实例

    一.前言 在上一节中我们对activiti进行了基本的介绍activiti进行了基本的介绍,同时介绍了基本的概念. 这一节,我将用一个入门程序,介绍如何使用activiti. 二.环境准备 2.1.编 ...

最新文章

  1. 两步改动CentOS主机名称
  2. 系统通知,居然用拉取
  3. 计算1+2+……+N的和。
  4. 2019寒假第三次作业
  5. c语言如何编写mysql客户端_【C/C++学院】(23)Mysql数据库编程--C语言编程实现mysql客户端...
  6. Spring精华问答 | Spring Boot有哪些优点?
  7. var obj = eval(result); 解析json
  8. 智能一代云平台(十):Jboss远程访问流程总结
  9. 【解释】对用户透明=对用户隐蔽:关系模型的存取路径对用户透明
  10. 淘沙潜行,数一数英雄的多姿,王者荣耀英雄、皮肤、武器展览
  11. 多个python则可以通过指定python的位置来升级或安装对应的库
  12. mysql 加锁 索引_MySQL 加锁处理分析
  13. Python练手项目:计算机自动还原魔方(3)还原两层
  14. 量化策略:驾驭交易之轴心点研究(一)
  15. Excel职场小技巧:教你如何分页打印Excel表格
  16. 山西省大学计算机专业排名,山西省:排名前14的大学!山西的大学分为5档,前2档最难考!...
  17. 人脸识别之人脸检测(二)--人脸识别样本制作及训练测试
  18. python操作数据库统计_python数据库-MySQL单表查询基本操作(50)
  19. “HOW CAN WE KNOW THE DANCER FROM THE DANCE?”: COGNITIVE POETICS AND WILLIAM BUTLER【翻译】
  20. Centos 6.5完美安装办公软件WPS

热门文章

  1. Thinkpad T60安装Snow Leopard
  2. R语言epiDisplay包alpha函数计算dataframe数据中指定数据列之间的信度分析、克朗巴哈系数、标准化系数、每剔除某一条目后系数的变化、var.labels.trunc参数指定字符串长度
  3. Kinect简单的动作识别
  4. java小demo---员工管理系统
  5. python做外贸_外贸这个行业现在还适合做吗?
  6. python os.popen.readlines异常_python之read,readline,readlines区别
  7. 软考高项:信息网络安全知识模拟题
  8. Webpack 自动刷新和HMR
  9. JavaScript组合函数的理解
  10. 程序员直击养老院现场,养老院已成为年轻人向往自由的乌托邦