一 。solr简介
solr是以lucene为内核开发的企业级搜索应用 应用程序可以通过http请求方式来提交索引,查询索引,提供了比lucene更丰富的查询语言,是一个高性能,高可用环境全文搜索引擎
文章表
TYPE | ASCII | HTML |
---|---|---|
文章id | 文章标题 |
文章内容 |
1 | 我爱中国 |
中国地大物博 |
2 | 香港是中国一部分 |
香港的英文是hongkong |
倒排索引
索引 | 文章id |
---|---|
我 | 1 |
爱 | 1 |
中国 | 1,2 |
香港 | 2 |
是 | 2 |
一部分 | 2 |
二。分词器
将中文拆分成有意义的词
常用的IK分词器,庖丁解牛分词器。
三。lucene
lucene是一个将text数据类型,分词建立索引的一个库,不适合企业级使用。
企业级考虑高可用问题。
solr是一个企业级应用的搜索引擎。
支持使用json格式提交数据。
json格式:
[] 代表数组
{} 对象(文档 document)
键值对 属性
{
id:1
hobby:[“篮球”,“上厕所”]
tt:{
}
}
数据库表结构:
文章id 文章标题 文章内容
1 我爱中国 中国地大物博
2 香港是中国一部分 香港的英文是hongkong
模拟json
[
{
id:1,
title:‘我爱中国’,
content:‘中国地大物博’
},
{
id:2,
title:‘香港是中国一部分’,
content:‘香港的英文是hongkong’
}
]
solr安装
官网 dockerhub.com 搜索 solr
- 核(core):是用于存储json格式的数据,等价于mysql中数据库的概念
- 文档:一个json对象就是一个文档 相同属性的json数组集合就是一个表
docker pull solr:5.5.5
安装solr镜像
docker run --name my_solr -id --net host -t solr:5.5.5
检测端口:
netstat -aon | grep 8983
yum -y install net-tools
telnet 端口号 检测端口是否连接成功
创建core
- -c指的是核的名字,–user 指的是solr的用户名,不可更改,必须填上
docker exec -it --user=solr my_solr bin/solr create_core -c mycore
创建完成后提示:
Copying configuration to new core instance directory:
/opt/solr/server/solr/mycore (所在路径)
Creating new core 'mycore' using command:
http://localhost:8983/solr/admin/cores?action=CREATE&name=mycore&instanceDir=mycore (可以通过该命令创建)
{
"responseHeader":{
"status":0, (0==成功)
"QTime":2137}, (创建的时间)
"core":"mycore"} (核名)
然后访问192.168.241.130:8983/solr
- 注意:记得关机防火墙 systemctl stop firewalld
五。solr搜索
假设提交
{“id”:“change.me”,“title”:“change.me”}
q表示安装什么字段来搜索
字段名:值 (where 列名=值)
支持or 和and语法
比如 i:1 and j:2
比如 i[1 to 10]
模拟数据
{
“id”:“1”,
“title”:“我爱中国”,
“content”:“中国地大物博”
}
solr中文分词器配置
默认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
<dependencies>
<dependency>
<groupId>com.janeluo</groupId>
<artifactId>ikanalyzer</artifactId>
<version>2012_u6</version>
<!--移除jar包-->
<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>
<!--导入5.5.5的jar包,这样就能保证Lucene4.7 以上的了-->
<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>
创建一样的包和类,进行修改
去除多余的就好
@Override
protected TokenStreamComponents createComponents(String fieldName) {
Tokenizer _IKTokenizer = new IKTokenizer(this.useSmart());
return new TokenStreamComponents(_IKTokenizer);
}
完成之后打开jar包,将里面的两个class 文件替换成自己新建的然后把jar包上传到solr里
find / -name lib 查找
jar拷贝到 /opt/solr/server/solr-webapp/webapp/WEB-INF/lib
进入core对应的目录
/opt/solr/server/solr/mycore
类型定义文件目录
/opt/solr/server/solr/mycore/conf/managed-scheme
docker cp my_solr:/opt/solr/server/solr/mycore/conf/managed-schema /opt/ika
修改文件 managed-schema
- 定义分词器数据类型,400行左右那里
<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>
- indexed表示是否索引 stored表示是否存储
- 定义动态字段
<field name="_root_" type="string" indexed="true" stored="false"/>
修改后拷贝回去,记得重启
数据库数据迁移solr
拷贝支持导入的jar
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的jar包(没有先去maven依赖下载)
docker cp ./mysql-connector-java-5.1.14.jar my_solr:/opt/solr/server/solr-webapp/webapp/WEB-INF/lib -
进入mycore/conf目录 新建连接数据的四要素 /opt/solr/server/solr/mycore/conf/data-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<dataConfig>
<dataSource name="sourceOne" type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://192.168.0.247:3306/unit02" user="root" password="123456" batchSize="-1" />
<document>
<entity name="demo" pk="id" dataSource="sourceOne"
query="select * from demo" >
<field column="id" name="id"/>
<field column="name_ik" name="name_ik"/>
<field column="content_ik" name="content_ik"/>
</entity>
</document>
</dataConfig>
docker cp ./data-config.xml my_solr:/opt/solr/server/solr/mycore/conf
- 修改solrconfig.xml 指定data-c.xml文件
- docker cp my_solr:/opt/solr/server/solr/mycore/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>
x修改后拷贝回来
docker cp ./solrconfig.xml my_solr:/opt/solr/server/solr/mycore/conf
完成进行搜索分词