一. 简介

solr是以lucene为内核开发的企业级搜索应用 应用程序可以通过http请求方式来提交索引,查询索引,提供了比lucene更丰富的查询语言,是一个高性能,高可用环境全文搜索引擎。

二. 安装环境

  • 下载
  • solr5版本以上的都是用于开发,不稳定。
  • 文档位置 https://hub.docker.com/_/solr/
[root@localhost ~]# docker pull solr:5.5.5
  • 测试端口是否连接上
  1. 在linux系统上执行以下命令
    yum -y install net-tools 这是安装net-tools 执行netstat -aon | gerp 8983
    Telnet 192.168.229.130 8983
  2. 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年停更。需要修改部分源代码来支持
  1. 找到 IKAnalyzer类 需要重写 protected TokenStreamComponents createComponents(String fieldName) 方法

  2. 找到 IKTokenizer类 需要重写构造方法 public IKTokenizer(Reader in, boolean useSmart) 为 public IKTokenizer(boolean useSmart)

  3. 进行打包,将修改后的类替换到新包中上传至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
  1. 在/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>
  1. 将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文件
  1. 先拷贝到linux系统上
[root@localhost ik]# docker cp my_solr:/opt/solr/server/solr/mycore/conf/solrconfig.xml .
  1. 修改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>
  1. 再将修改后的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接口


  1. 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":"王冠宇是王五的儿子"}


-

未使用注解查询时必须按照下面的方法规范

  • 注意事项
  1. 使用方法创建查询时需以find字段开端。 findBy
  2. 使用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全文搜索引擎相关推荐

  1. Java Solr全文搜索引擎的实现

    看本文章的前提:你是java中级以上,否则绕道 网上各种教程讲解的比较详细 ,我这边值做记录,希望能简单粗暴的说名一下流程 1:安装 不讲解各种概念 a :复制solr.war到tomcat中部署 b ...

  2. 全文搜索引擎选 ElasticSearch 还是 Solr

    点击蓝色"程序猿DD"关注我哟 加个"星标",不忘签到哦 来源:http://t.cn/Ebgm7sn 最近项目组安排了一个任务,项目中用到了全文搜索,基于全文 ...

  3. 全文搜索引擎选 ElasticSearch 还是 Solr?

    最近项目组安排了一个任务,项目中用到了基于 Solr 的全文搜索,但是该 Solr 搜索云项目不稳定,经常查询不出来数据,需要手动全量同步. 而且它还是其他团队在维护,依赖性太强,导致 Solr 服务 ...

  4. 全文搜索引擎 ElasticSearch 还是 Solr?

    原文链接 最近项目组安排了一个任务,项目中用到了全文搜索,基于全文搜索 Solr,但是该 Solr 搜索云项目不稳定,经常查询不出来数据,需要手动全量同步,而且是其他团队在维护,依赖性太强,导致 So ...

  5. 全文搜索引擎----ElasticSearch和Solr

    全文搜索引擎 ElasticSearch 还是 Solr? 最近项目组安排了一个任务,项目中用到了全文搜索,基于全文搜索 Solr,但是该 Solr 搜索云项目不稳定,经常查询不出来数据,需要手动全量 ...

  6. 全文搜索引擎Elasticsearch,这篇文章给讲透了

    之前已经分享过Elasticsearch的使用和原理的知识,由于近期在公司内部做了一次分享,所以本篇主要是基于之前的博文的一个总结,希望通过这篇文章能让读者大致了解Elasticsearch是做什么的 ...

  7. 【全文搜索引擎】Elasticsearch相关介绍与linux系统安装

    概念 Elasticsearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticsearch是用Java语言开发的,并作为 ...

  8. 2万字详解,彻底讲透 全文搜索引擎 Elasticsearch

    来源:cnblogs.com/jajian/p/11223992.html 由于近期在公司内部做了一次 Elasticsearch 的分享,所以本篇主要是做一个总结,希望通过这篇文章能让读者大致了解 ...

  9. 全文搜索引擎的比较-Lucene,Sphinx,Postgresql,MySQL?

    本文翻译自:Comparison of full text search engine - Lucene, Sphinx, Postgresql, MySQL? I'm building a Djan ...

最新文章

  1. 百度云满速下载(转)
  2. 怎么看电脑电源多少w_电脑电源供电不足会怎么样 电脑电源供电不足坏处介绍【详解】...
  3. GPRS、EDGE、CDMA1X、WCDMA、EVDO、EVDV速度性能大比较
  4. 北理通信男找工作的经历及心得
  5. python获取命令行参数的方法
  6. ipad UISplitViewController 导航视图控制器标题设置
  7. matlab拟合四次函数表达式,用matlab编写程序求以幂函数作基函数的3次、4次多项式的最小二乘曲线拟合,画出数据散点图及拟合曲线图...
  8. js java用var_Java基础———JavaScript基础知识
  9. 短视频技术指南:国内最牛5家短视频解决方案提供
  10. 限速牌的单位是什么_成熟的造车新势力应该是什么样的?
  11. 无法通过ip地址连接其它电脑的数据库,但是又可以ping通,错的不是配置,而是差了一个步骤
  12. HDU1251 统计难题 trie树
  13. 项目复制引起的访问路径与项目名不一致
  14. 数据库左连接、右连接
  15. 人民币大写转换 java_java人民币转大写中文
  16. 2017总结,附书单、项目,只喜欢有趣的。。
  17. javaweb调用python修改微信运动步数,使用小米运动接口
  18. 解决NIVIDIA控制面板开启不了的问题
  19. 时间戳和时间的相互转换,以及中国本地时间转换成国外时间
  20. 360掐架搜狗浏览器

热门文章

  1. 软件开发流程和生命周期管理
  2. 深度 | 实现100万台iPad覆盖之后,Osmo将向大众消费品牌转型
  3. 共赏画中春城,「昆明画报」首个艺术品鉴沙龙落地
  4. AlertDialog(对话框)详解
  5. 当前Android应用对于x86支持情况的调研
  6. 国产ssh连接工具FinalShell简单的使用教程
  7. Linux下Nodejs安装(最新版)
  8. 多模块下依赖其他模块(例如Common模块)时的解决办法
  9. ArrayList使用禁忌——ArrayList之间的赋值(小记)
  10. Rust宏编程指南【Macro】