solr全文搜索引擎

一. 简介

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 上执行
    solr全文搜索引擎_第1张图片
  • 创建数据库(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 ~]# 

solr全文搜索引擎_第2张图片

访问 192.168.229.130:8983出现的页面如下:
solr全文搜索引擎_第3张图片

solr全文搜索引擎_第4张图片

  • 插入json数据时必须使用双引号

模拟数据
{
     "id":"1",
     "title":"我爱中国",
     "content":"中国地大物博"
 }

solr全文搜索引擎_第5张图片

配置中文分词器

  • 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

solr全文搜索引擎_第6张图片

  • 将修改源代码后的jar包,拷贝一份到my_solr容器下
  • my_solr:/opt/solr/server/solr-webapp/webapp/WEB-INF/lib
    在这里插入图片描述

solr全文搜索引擎_第7张图片

  • 进入managed-schema
    solr全文搜索引擎_第8张图片solr全文搜索引擎_第9张图片
  • 在managed-schema中 增加动态字段以及字段类型,启用中文分词器
  • 然后将对应需要进行中文分词的字段使用 text_ik该字段类型 比如
//动态字段

//字段类型

         
       
   

solr全文搜索引擎_第10张图片

  • 将修改后的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数据,出现以下页面,配置成功。
solr全文搜索引擎_第11张图片

  • 将下列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
  1. 在/opt的ik/新建一个data-c.xml文件
    将数据库的四要素添加进去
  
  
      
  
          
              
              
        
  
  
  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

	  
        
         data-c.xml  
        

  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

修改前
solr全文搜索引擎_第12张图片

修改后
solr全文搜索引擎_第13张图片

  • 数据库四大要素中,用户必须要有对外开放权限%,不然会报错
    这是报错的页面

这是查询成功的页面
solr全文搜索引擎_第14张图片

  • 调试模式,调试成功后再data-c.xml文件中修改配置
    solr全文搜索引擎_第15张图片

  • 注意:使用查询时添加判断条件时,关键字需要大写。 虽然语句不会报错,但是查询的数据不准确

solr全文搜索引擎_第16张图片
solr全文搜索引擎_第17张图片

java代码测试

  • pom.xml
 
        org.springframework.boot
        spring-boot-starter-parent
        1.5.10.RELEASE
    
    
        
            org.springframework.boot
            spring-boot-starter-web
        
        
            org.springframework.boot
            spring-boot-starter-data-solr
        
    
  • 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 queryNews(String keyword){
		SimpleQuery simpleQuery = new SimpleQuery("newtitle_ik:"+keyword);
		Page query = solrTemplate.query(simpleQuery, News.class);
		return query.getContent();
	}
}
  • index.html




Insert title here





	新闻:  
	
  • 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;
	}
}

solr全文搜索引擎_第18张图片

  • 查询方法 继承SolrRepository接口或者CrudRepository接口

solr全文搜索引擎_第19张图片
solr全文搜索引擎_第20张图片

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

solr全文搜索引擎_第21张图片
solr全文搜索引擎_第22张图片

-

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

  • 注意事项
  1. 使用方法创建查询时需以find字段开端。 findBy
  2. 使用solr查询时,需要注意定义的字段类型匹配。 q=
    solr全文搜索引擎_第23张图片
    solr全文搜索引擎_第24张图片
  • 分页查询

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

public Page findByDesc(String keyword,Pageable page);

solr全文搜索引擎_第25张图片

  • 排序

public Page findByCountry(String keyword,Pageable page);
@GetMapping("/queryNews")
	public Page queryNews(String keyword){
		PageRequest pr = new PageRequest(0,2,new Sort(Direction.ASC,"age_i"));
		return ps.findByCountry(keyword,pr);
	}

你可能感兴趣的:(Solr,全文搜索,IK分词器)