什么是solr:
solr企业级搜索引擎产品,是将整个索引操作功能封装好了的搜索引擎系统
solr就是在lucene工具包的基础之上进行了封装,而且是以web服务的形式对外提供索引功能,
应用程序可以通过http请求方式来提交索引,查询索引,提供了比lucene更丰富的查询语言,是
一个高性能,高可用环境全文搜索引擎。
solr是怎样去全文搜索的(如何找关键字)
首先实现全文关键字搜索,要用到分词器(内嵌的都没有中文分词器);
中文分词器有 —— IK分词器,庖丁解牛分词器。
他会把查询信息分为多个有意义的词 进行查询
solr是用的是什么索引
solr用的是倒排索引
在语句储存时会先对需要你做索引的类通过分词器生成索引
例:
id | 文章名 | 文章内容 |
---|---|---|
1 | 机会是留给有准备的人 | 只有不断寻找机会的人才能把握机会… |
2 | 坚持 | 不能拼爹,只能拼命… |
3 | 坚持下去 | 当坚持不下去的时候,默默自己的胸告诉自己你是个男孩子… |
4 | 坚持住机会总会来的 | 不管晚上睡得多早,早上起得多晚,在去上班的路上一上车肯定就会想睡觉。但是我发现自从坚持早起和运动之后就真的不会困… |
如果根据文章名来分词做索引:
索引 | id |
---|---|
机会 | 1,4 |
准备 | 1 |
人 | 1 |
坚持 | 2,3,4 |
留给 | 1 |
来的 | 4 |
… | … |
查询的时候会根据索引来找到文章ID 通过ID来找文章!!!
前面说到solr是在lucene工具包的基础之上进行了封装那么什么是lucene
我可以理解为lucene是一个将text数据类型,分词建立索引的一个库,但是不适合企业级使用,因为
企业级考虑高可用问题。所以我使用了solr,solr是一个企业级应用的搜索引擎。
支持使用json格式提交数据。
核(core): 是用于存储json格式的数据,等价于mysql中数据库的概念
文档:一个json对象就是一个文档 相同属性的json数组集合就是一个表
[] 代表数组
{} 对象(文档 document) 相当于数据库中的一行数据
键值对 属性
怎样装装 solr
下载solr的docker容器:
指定版本号:不要用6以上的版本
docker pull solr:5.5.5
安装solr
docker run --name my_solr -idt --net host solr:5.5.5
检测端口是否开启:
netstat -aon | grep 8983
创建核(core)
docker exec -it --user=solr my_solr bin/solr create_core -c mycore
注:
exec 执行命令
–user= solr ——指的是使用 solr 这个用户创建
my_solr ——在my_solr这个容器内执行
bin/solr create_core ——执行的命令
-c —— 给core指定名字
创建完成后提示:
/opt/solr/server/solr/mycore ——插入的json数据存在那个位置
“status”:0 —— 创建成功
“QTime”:2697 ——创建使用的时间
“core”:“mycore” ——创建核的名字
http://localhost:8983/solr/admin/cores?action=CREATE&name=mycore&instanceDir=mycore
我们可以使用http 来创建 指定ip 指定核的name
现在我就可以通过浏览器去访问了
http://192.168.162.131:8983/solr
查询的参数列表
q表示查询的条件 字段名:值的格式 多个条件组合查询可以使用 字段:字段值 && 字段1:字段值1 也可以使用大写的AND或者OR
fq表示filter query 过滤条件 和q是and的关系支持各种逻辑运算符 (参考https://cwiki.apache.org/confluence/display/solr/The+Standard+Query+Parser)
sort表示排序 的字段 字段名 asc|desc
start 表示从第几行开始 rows表示查询的总行数
fl表示查询显示的列 比如只需要查询 name_s,sex_i 这两列 使用,隔开
df表示默认的查询字段 一般不设置
Raw Query Parameters表示原始查询字段 可以使用 start=0&rows=10这种url的方式传入参数
wt(write type)表示写入的格式 可以使用json和xml
shards 多核同时搜索 solrhome拷贝mycore为mycore1 管理平台添加core 设置参数为 路径,路径来设置需要搜索的核
怎么实现中文分词器
默认solr 没有使用中文分词器 所有搜索的词 都是整个句子就是一个词 搜索时 将单词全部写入才能搜索或者使用* 需要配置中文分词器
目前比较好用的分词器 是IK 2012年停更 只支持到 Lucene4.7 所有 solr5.5 需要lucene5支持 需要修改部分源码来支持solr5.5
找到 IKAnalyzer类 需要重写 protected TokenStreamComponents createComponents(String fieldName) 方法
找到 IKTokenizer类 需要重写构造方法 public IKTokenizer(Reader in, boolean useSmart) 为 public IKTokenizer(boolean useSmart) {
在任意项目中 使用maven 引用lucene5 和ik
步骤的代码实现:
新建maven项目:加入依赖:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.pjj</groupId>
<artifactId>Ik</artifactId>
<version>0.0.1-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.14.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>com.janeluo</groupId>
<artifactId>ikanalyzer</artifactId>
<version>2012_u6</version>
</dependency>
</dependencies>
</project>
找到IKAnalyzer 并且重写 —
剔除其他依赖只留ikanalyzer
<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>
</dependencies>
手动导入剔除的jar 5.5.5版本的
完成之后之前重写的 IKAnalyzer 会报错 删除 final Reader in 以及构造方法的in
这个时候重写要IKTokenizer 会发现 IKTokenizer也报错 需要删除 super (in) 以及Reader in
再将你的ikanalyzer 的jar包从maven仓库中拿出来、
将你改好的类的class文件复制进去就OK了
这个时候 jar包就打好了!
怎么样将分词器的jar包配进solr中:
solr是个war包 部署在weblogic上的war包那么就可以把jar包丢在容器中的lib目录里
首先要将jar包放入linux中
再找到容器 lib所在的目录
将jar包 copy到容器中
jar包导入 ——/opt/solr/server/solr-webapp/webapp/WEB-INF/lib (全路径)
docker cp ./ikanalyzer-2012_u6.jar my_solr:/opt/solr/server/solr-webapp/webapp/WEB-INF/lib
怎么样是中分词器生效
去配置文件中指定需要中文分词器的类型
进入容器core对应的目录
cd server/solr/mycore/conf/
找到文件managed-schema
copy出来编辑
docker cp my_solr:/opt/solr/server/solr/mycore/conf/managed-schema .
编辑:
<fieldType name="text_ik" class="solr.TextField" >
<analyzer type="index" isMaxWordLength="false" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
<analyzer type="query" isMaxWordLength="true" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>
<dynamicField name="*_ik" type="text_ik" indexed="true" stored="true"/>
如图:
停止solr服务
将文件copy回去
docker cp ./managed-schema my_solr:/opt/solr/server/solr/mycore/conf/managed-schema
重启solr服务
测试:
数据库数据迁移到solr
进入solr所在容器 搜索 dataimport相关jar包
find / -name *import*.jar
将这两个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
下载mysql的驱动包 并copy到webapp/lib目录下
docker cp ./mysql-connector-java-5.1.24.jar my_solr:/opt/solr/server/solr-webapp/webapp/WEB-INF/lib
新建配置连接的数据库以及查询的sql语句 本文用的是data-c.xml(XXX.xml文件)
<?xml version="1.0" encoding="UTF-8"?>
<dataConfig>
<dataSource name="source1" type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://192.168.0.16:3306/school" user="root" password="ps123456" batchSize="-1" />
<document>
<entity name="student" pk="id" dataSource="source1"
query="select * from student" >
<field column="id" name="id"/>
<field column="name" name="name_ik"/>
<field column="age" name="age_i"/>
<field column="sex" name="sex_s"/>
<field column="phone" name="phone_s"/>
<field column="email" name="email_s"/>
<field column="classid" name="classid_s"/>
</entity>
</document>
</dataConfig>
注:
column=“age” :指定数据库中的列
name=“age_i” :其中age_i 指的是键名 _i 为int值
(这里使用的动态类型并且一定要指定类型 在文件managed-schema中有指定各种类型也可以自己指定)
**将配置连接文件copy到/opt/solr/server/solr/mycore/conf目录下 **
docker cp ./solrconfig.xml my_solr:/opt/solr/server/solr/mycore/conf
将配置文件solrconfig.xml copy出来
docker cp my_solr:/opt/solr/server/solr/mycore/conf/solrconfig.xml .
并编辑指定数据库配置连接文件名我的配置连接文件名是data-c.xml
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">data-c.xml</str>
</lst>
</requestHandler>
将solrconfig.xml 文件copy到/opt/solr/server/solr/mycore/conf目录下
docker cp ./solrconfig.xml my_solr:/opt/solr/server/solr/mycore/conf
重启容器solr