solr全文搜索引擎
solr全局搜索配置中文分词器一.简介solr是以lucene为内核开发的企业级搜索应用应用程序可以通过http请求方式来提交索引,查询索引,提供了比lucene更丰富的查询语言,是一个高性能,高可用环境全文搜索引擎。二. 安装环境下载solr5版本以上的都是用于开发,不稳定。文档位置 https://hub.docker.com/_/solr/[root@localho...
·
一. 简介
solr是以lucene为内核开发的企业级搜索应用 应用程序可以通过http请求方式来提交索引,查询索引,提供了比lucene更丰富的查询语言,是一个高性能,高可用环境全文搜索引擎。
二. 安装环境
- 下载
- solr5版本以上的都是用于开发,不稳定。
- 文档位置 https://hub.docker.com/_/solr/
[root@localhost ~]# docker pull solr:5.5.5
- 测试端口是否连接上
- 在linux系统上执行以下命令
yum -y install net-tools 这是安装net-tools 执行netstat -aon | gerp 8983
Telnet 192.168.229.130 8983 - windows 上执行
- 创建数据库(core核)
docker exec -it --user=solr my_solr bin/solr create_core -c mycore
- 创建完成后的提示
/opt/solr/server/solr/mycore 表示将来json数据插入的磁盘位置
[root@localhost ~]# 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,
"QTime":3037},
"core":"mycore"}
[root@localhost ~]#
访问 192.168.229.130:8983出现的页面如下:
模拟数据
{
"id":"1",
"title":"我爱中国",
"content":"中国地大物博"
}
配置中文分词器
- solr 默认没有使用中文分词器,所有搜索的词,都是整个句子就是一个词,搜索时 将单词全部写入才能搜索或者使用* ,需要配置中文分词器。
-
常用的分词器:IK分词器,庖丁解牛分词器。
- IK分词器不支持solr5.5.5及以上版本,2012年停更。需要修改部分源代码来支持
-
找到 IKAnalyzer类 需要重写 protected TokenStreamComponents createComponents(String fieldName) 方法
-
找到 IKTokenizer类 需要重写构造方法 public IKTokenizer(Reader in, boolean useSmart) 为 public IKTokenizer(boolean useSmart)
-
进行打包,将修改后的类替换到新包中上传至linux上
- 将修改后的jar包上传至root/opt/新建目录
./server/solr-webapp/webapp/WEB-INF/lib
- 将修改源代码后的jar包,拷贝一份到my_solr容器下
- my_solr:/opt/solr/server/solr-webapp/webapp/WEB-INF/lib
- 进入managed-schema
- 在managed-schema中 增加动态字段以及字段类型,启用中文分词器
- 然后将对应需要进行中文分词的字段使用 text_ik该字段类型 比如
//动态字段
<dynamicField name="*_ik" type="text_ik" indexed="true" stored="true"/>
//字段类型
<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>
- 将修改后的managed-schema拷贝到 my_solr:/opt/solr/server/solr/mycore/conf/
[root@localhost ik]# docker stop my_solr
my_solr
[root@localhost ik]# docker cp ./managed-schema my_solr:/opt/solr/server/solr/mycore/conf/
[root@localhost ik]# docker start my_solr
my_solr
[root@localhost ik]#
-插入json数据,出现以下页面,配置成功。
- 将下列jar包拷贝到 solr启动应用 webapp/lib目录下
solr-dataimporthandler-5.5.5.jar
solr-dataimporthandler-extras-5.5.5.jar
mysql-connector-java-5.1.24.jar
solr@localhost:/opt/solr$ cp /opt/solr/dist/solr-dataimporthandler-5.5.5.jar /opt/solr/server/solr-webapp/webapp/WEB-INF/lib
solr@localhost:/opt/solr$ cp /opt/solr/dist/solr-dataimporthandler-extras-5.5.5.jar /opt/solr/server/solr-webapp/webapp/WEB-INF/lib
[root@localhost ik]# docker cp ./mysql-connector-java-5.1.24.jar my_solr:/opt/solr/server/solr-webapp/webapp/WEB-INF/lib
- 在/opt的ik/新建一个data-c.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.246:3306/test" user="root" password="ps123456" batchSize="-1" />
<document>
<entity name="mynew" pk="newid" dataSource="source1"
query="select * from mynew" >
<field column="newid" name="id"/>
<field column="newtitle" name="newtitle_ik"/>
</entity>
</document>
</dataConfig>
- 将data-c.xml文件拷贝到 my_solr:/opt/solr/server/solr/mycore/conf (核core)
[root@localhost ik]# docker cp ./data-c.xml my_solr:/opt/solr/server/solr/mycore/conf
- 修改solrconfig.xml 指定data-c.xml文件
- 先拷贝到linux系统上
[root@localhost ik]# docker cp my_solr:/opt/solr/server/solr/mycore/conf/solrconfig.xml .
- 修改solrconfig.xml
</requestHandler>
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">data-c.xml</str>
</lst>
</requestHandler>
- 再将修改后的solrconfig.xml文件拷贝到 my_solr:/opt/solr/server/solr/mycore/conf
[root@localhost ik]# docker cp ./solrconfig.xml my_solr:/opt/solr/server/solr/mycore/conf
修改前
修改后
- 数据库四大要素中,用户必须要有对外开放权限%,不然会报错
这是报错的页面
这是查询成功的页面
java代码测试
- pom.xml
<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>
</dependencies>
- application.yml文件
spring:
data:
solr:
host: http://192.168.229.130:8983/solr
server:
port: 8888
- controller
@RestController
public class SolrController {
@Autowired
private SolrTemplate solrTemplate;
@GetMapping("queryNews")
public List<News> queryNews(String keyword){
SimpleQuery simpleQuery = new SimpleQuery("newtitle_ik:"+keyword);
Page<News> query = solrTemplate.query(simpleQuery, News.class);
return query.getContent();
}
}
- index.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>
function query(){
$.ajax({
url:'queryNews',
dataType:'json',
type:'get',
data:'keyword='+$("#mykey").val(),
success:function (r){
$("#myNews").text(JSON.stringify(r));
}
});
}
</script>
</head>
<body>
新闻: <input id="mykey" type="text" name="keyword"> <button onclick="query()">搜索</button>
<div id="myNews"></div>
</body>
</html>
- main
@SpringBootApplication
public class SolrMain {
@Bean
public SolrTemplate solrTemplate(SolrClient client) {
return new SolrTemplate(client);
}
public static void main(String[] args) {
SpringApplication.run(SolrMain.class, args);
}
}
- entity
@SolrDocument(solrCoreName="mycore")
public class News {
private String id;
@Field(value="newtitle_ik")
private String title ;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
-
查询方法 继承SolrRepository接口或者CrudRepository接口
- Solr模块支持手动将查询定义为String,或者从方法名称派生查询.
- 实体类
import org.apache.solr.client.solrj.beans.Field;
import org.springframework.data.solr.core.mapping.SolrDocument;
import lombok.Data;
@Data
@SolrDocument(solrCoreName="mycore")
public class Person {
private String id ;
@Field("country_ik")
private String country;
@Field("desc_ik")
private String desc;
@Field("age_i")
private String age;
}
- json数据
{"id":"1","country_ik":"美国","provice_ik":"加利福尼亚州","city_ik":"旧金山","age_i":"30","name_ik":"John","desc_ik":"John is come from austrina John,s Dad is Johh Super"}
{"id":"2","country_ik":"美国","provice_ik":"加利福尼亚州","city_ik":"好莱坞","age_i":"40","name_ik":"Mike","desc_ik":"Mike is come from austrina Mike,s Dad is Mike Super"}
{"id":"3","country_ik":"美国","provice_ik":"加利福尼亚州","city_ik":"圣地牙哥","age_i":"50","name_ik":"Cherry","desc_ik":"Cherry is come from austrina Cherry,s Dad is Cherry Super"}
{"id":"4","country_ik":"美国","provice_ik":"德克萨斯州","city_ik":"休斯顿","age_i":"60","name_ik":"Miya","desc_ik":"Miya is come from austrina Miya,s Dad is Miya Super"}
{"id":"5","country_ik":"美国","provice_ik":"德克萨斯州","city_ik":"大学城","age_i":"70","name_ik":"fubos","desc_ik":"fubos is come from austrina fubos,s Dad is fubos Super"}
{"id":"6","country_ik":"美国","provice_ik":"德克萨斯州","city_ik":"麦亚伦","age_i":"20","name_ik":"marry","desc_ik":"marry is come from austrina marry,s Dad is marry Super"}
{"id":"7","country_ik":"中国","provice_ik":"湖南省","city_ik":"长沙市","age_i":"18","name_ik":"张三","desc_ik":"张三来自长沙市 是公务员一名"}
{"id":"8","country_ik":"中国","provice_ik":"湖南省","city_ik":"岳阳市","age_i":"15","name_ik":"李四","desc_ik":"李四来自岳阳市 是一名清洁工"}
{"id":"9","country_ik":"中国","provice_ik":"湖南省","city_ik":"株洲市","age_i":"33","name_ik":"李光四","desc_ik":"李光四 老家岳阳市 来自株洲 是李四的侄子"}
{"id":"10","country_ik":"中国","provice_ik":"广东省","city_ik":"深圳市","age_i":"67","name_ik":"王五","desc_ik":"王五来自深圳市 是来自深圳的一名海关缉私精英"}
{"id":"11","country_ik":"中国","provice_ik":"广东省","city_ik":"广州市","age_i":"89","name_ik":"王冠宇","desc_ik":"王冠宇是王五的儿子"}
-
未使用注解查询时必须按照下面的方法规范
- 注意事项
- 使用方法创建查询时需以find字段开端。 findBy
- 使用solr查询时,需要注意定义的字段类型匹配。 q=
-
分页查询
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
public Page findByDesc(String keyword,Pageable page);
-
排序
public Page<Person> findByCountry(String keyword,Pageable page);
@GetMapping("/queryNews")
public Page<Person> queryNews(String keyword){
PageRequest pr = new PageRequest(0,2,new Sort(Direction.ASC,"age_i"));
return ps.findByCountry(keyword,pr);
}
更多推荐
已为社区贡献1条内容
所有评论(0)