solr全文搜索引擎
一. 简介
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 mycoreCopying configuration to new core instance directory:
/opt/solr/server/solr/mycoreCreating 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出现的页面如下:
插入json数据时必须使用双引号
模拟数据
{"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/libsolr@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
修改前
修改后
- 数据库四大要素中,用户必须要有对外开放权限%,不然会报错
这是报错的页面
这是查询成功的页面
调试模式,调试成功后再data-c.xml文件中修改配置
注意:使用查询时添加判断条件时,关键字需要大写。 虽然语句不会报错,但是查询的数据不准确
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 {@Autowiredprivate 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 {@Beanpublic 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);}
solr全文搜索引擎相关推荐
- Java Solr全文搜索引擎的实现
看本文章的前提:你是java中级以上,否则绕道 网上各种教程讲解的比较详细 ,我这边值做记录,希望能简单粗暴的说名一下流程 1:安装 不讲解各种概念 a :复制solr.war到tomcat中部署 b ...
- 全文搜索引擎选 ElasticSearch 还是 Solr
点击蓝色"程序猿DD"关注我哟 加个"星标",不忘签到哦 来源:http://t.cn/Ebgm7sn 最近项目组安排了一个任务,项目中用到了全文搜索,基于全文 ...
- 全文搜索引擎选 ElasticSearch 还是 Solr?
最近项目组安排了一个任务,项目中用到了基于 Solr 的全文搜索,但是该 Solr 搜索云项目不稳定,经常查询不出来数据,需要手动全量同步. 而且它还是其他团队在维护,依赖性太强,导致 Solr 服务 ...
- 全文搜索引擎 ElasticSearch 还是 Solr?
原文链接 最近项目组安排了一个任务,项目中用到了全文搜索,基于全文搜索 Solr,但是该 Solr 搜索云项目不稳定,经常查询不出来数据,需要手动全量同步,而且是其他团队在维护,依赖性太强,导致 So ...
- 全文搜索引擎----ElasticSearch和Solr
全文搜索引擎 ElasticSearch 还是 Solr? 最近项目组安排了一个任务,项目中用到了全文搜索,基于全文搜索 Solr,但是该 Solr 搜索云项目不稳定,经常查询不出来数据,需要手动全量 ...
- 全文搜索引擎Elasticsearch,这篇文章给讲透了
之前已经分享过Elasticsearch的使用和原理的知识,由于近期在公司内部做了一次分享,所以本篇主要是基于之前的博文的一个总结,希望通过这篇文章能让读者大致了解Elasticsearch是做什么的 ...
- 【全文搜索引擎】Elasticsearch相关介绍与linux系统安装
概念 Elasticsearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticsearch是用Java语言开发的,并作为 ...
- 2万字详解,彻底讲透 全文搜索引擎 Elasticsearch
来源:cnblogs.com/jajian/p/11223992.html 由于近期在公司内部做了一次 Elasticsearch 的分享,所以本篇主要是做一个总结,希望通过这篇文章能让读者大致了解 ...
- 全文搜索引擎的比较-Lucene,Sphinx,Postgresql,MySQL?
本文翻译自:Comparison of full text search engine - Lucene, Sphinx, Postgresql, MySQL? I'm building a Djan ...
最新文章
- 百度云满速下载(转)
- 怎么看电脑电源多少w_电脑电源供电不足会怎么样 电脑电源供电不足坏处介绍【详解】...
- GPRS、EDGE、CDMA1X、WCDMA、EVDO、EVDV速度性能大比较
- 北理通信男找工作的经历及心得
- python获取命令行参数的方法
- ipad UISplitViewController 导航视图控制器标题设置
- matlab拟合四次函数表达式,用matlab编写程序求以幂函数作基函数的3次、4次多项式的最小二乘曲线拟合,画出数据散点图及拟合曲线图...
- js java用var_Java基础———JavaScript基础知识
- 短视频技术指南:国内最牛5家短视频解决方案提供
- 限速牌的单位是什么_成熟的造车新势力应该是什么样的?
- 无法通过ip地址连接其它电脑的数据库,但是又可以ping通,错的不是配置,而是差了一个步骤
- HDU1251 统计难题 trie树
- 项目复制引起的访问路径与项目名不一致
- 数据库左连接、右连接
- 人民币大写转换 java_java人民币转大写中文
- 2017总结,附书单、项目,只喜欢有趣的。。
- javaweb调用python修改微信运动步数,使用小米运动接口
- 解决NIVIDIA控制面板开启不了的问题
- 时间戳和时间的相互转换,以及中国本地时间转换成国外时间
- 360掐架搜狗浏览器