一. 简介

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

二. 安装环境

[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 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出现的页面如下:
在这里插入图片描述

在这里插入图片描述

  • 插入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/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文件
    将数据库的四要素添加进去
<?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 {
	@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接口

在这里插入图片描述
在这里插入图片描述

  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);
	}
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐