当前位置:   article > 正文

springboot+solr 全文检索_spring boot solrj 检索文件

spring boot solrj 检索文件

Solr定时增量更新
ElasticSearch vs Solr多维度分析对比
JavaEE-面试-Solr面试回答思路
Lucene Solr 811
1.把 solr-8.1.1.tgz 传到服务器

//把文件传到 /usr/local 目录下
cd /usr/local
  • 1
  • 2

2.解压 solr

tar -xzf solr-8.1.1.tgz
  • 1

3.启动 solr

cd /usr/local/solr-8.1.1

# 不建议使用管理员启动 solr,-force 强制启动
bin/solr start -force

# 开放 8983 端口
firewall-cmd --zone=public --add-port=8983/tcp --permanent
firewall-cmd --reload
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

4.浏览器访问 solr 控制台
http://192.168.64.170:8983

5.服务器创建 core

数据库中 pd_item 表中的商品数据, 在 solr 中保存索引数据, 在 solr 中创建一个 core 保存索引数据

创建一个名为 pd 的 core, 首先要准备以下目录结构:

# solr目录/server/solr/
#                    pd/
#                     conf/
#                     data/


cd /usr/local/solr-8.1.1

mkdir server/solr/pd
mkdir server/solr/pd/conf
mkdir server/solr/pd/data
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

6.复制默认配置
conf 目录是 core 的配置目录, 存储一组配置文件, 我们以默认配置为基础, 后续逐步修改

cd /usr/local/solr-8.1.1

cp -r server/solr/configsets/_default/conf server/solr/pd
  • 1
  • 2
  • 3

7.中文分词测试
在这里插入图片描述
8.添加 ik-analyzer 分词器

#修改 solr目录/server/solr/pd/conf/managed-schema,添加 ik-analyzer 分词器

<!-- ik分词器 -->
<fieldType name="text_ik" class="solr.TextField">
  <analyzer type="index">
      <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false" conf="ik.conf"/>
      <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
  <analyzer type="query">
      <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="true" conf="ik.conf"/>
      <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

9.重启 solr 服务

cd /usr/local/solr-8.1.1

bin/solr restart -force

  • 1
  • 2
  • 3
  • 4

10.使用 ik-analyzer 对中文进行分词测试

在这里插入图片描述
11.设置停止词

上传停止词配置文件到 solr目录/server/solr-webapp/webapp/WEB-INF/classes

stopword.dic
stopwords.txt

重启服务,观察分词结果中,停止词被忽略

bin/solr restart -force
  • 1

12.准备 mysql 数据库数据

用 sqlyog 执行 pd.sql

-授予 root 用户 跨网络访问权限
-注意: 此处设置的是远程登录的 root 用户,本机登录的 root 用户密码不变
CREATE USER 'root'@'%' IDENTIFIED BY 'root';

GRANT ALL ON *.* TO 'root'@'%';
  • 1
  • 2
  • 3
  • 4
  • 5
-随机修改30%的商品,让商品下架,以便后面做查询测试

UPDATE pd_item SET STATUS=0 WHERE RAND()<0.3
  • 1
  • 2
  • 3

13.从 mysql 导入商品数据
title text_ik
sellPoint text_ik
price plong
barcode string
image string
cid plong
status pint
created pdate
updated pdate
在这里插入图片描述

14.Copy Field 副本字段
查询时需要按字段查询,例如 title:电脑, 可以将多个字段的值合并到一个字段进行查询,默认查询字段 text

将 title 和 sellPoint 复制到 text 字段
在这里插入图片描述
15.Data Import Handler 配置

添加 jar 文件

Data Import Handler 的 jar 文件存放在 solr目录/dist 目录下
solr-dataimporthandler-8.1.1.jar
solr-dataimporthandler-extras-8.1.1.jar

solr-dataimporthandler-8.1.1.jar
solr-dataimporthandler-extras-8.1.1.jar
复制这两个文件和 mysql 的 jar 文件到 solr目录/server/solr-webapp/webapp/WEB-INF/lib

dih-config.xml
修改 mysql 的 ip 地址,传到
solr目录/server/solr/pd/conf

solrconfig.xml 中添加 DIH 配置

<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
    <lst name="defaults">  
    	<str name="config">dih-config.xml</str>  
    </lst>  
</requestHandler>
  • 1
  • 2
  • 3
  • 4
  • 5

16.重启 solr

cd /usr/local/solr-8.1.1

bin/solr restart -force
  • 1
  • 2
  • 3

17.导入数据
在这里插入图片描述
18.查询测试
在复制字段 text 中查找 电脑
在这里插入图片描述

springboot+solr

1.application.yml 添加 solr 连接信息

spring:
  data:
    solr:   #注意修改ip地址
      host: http://192.168.64.170:8983/solr/pd

  • 1
  • 2
  • 3
  • 4
  • 5

2.商品检索调用分析

在这里插入图片描述

3.pom.xml 添加 solr 和 lombok 依赖

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-solr</artifactId>
</dependency>

<dependency>
	<groupId>org.projectlombok</groupId>
	<artifactId>lombok</artifactId>
</dependency>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

4.Item 实体类

package com.pd.pojo;

import java.io.Serializable;

import org.apache.solr.client.solrj.beans.Field;

import lombok.Data;

@Data
public class Item implements Serializable {
		private static final long serialVersionUID = 1L;
		
		@Field("id")
		private String id;
		@Field("title")
		private String title;
		@Field("sellPoint")
		private String sellPoint;
		@Field("price")
		private Long price;
		@Field("image")
		private String image;

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

5.SearchService 业务接口

package com.pd.service;

import java.util.List;

import com.pd.pojo.Item;

public interface SearchService {
	List<Item> findItemByKey(String key) throws Exception;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

6.SearchServiceImpl 业务实现类

package com.pd.service.impl;

import java.util.List;

import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Service;

import com.pd.pojo.Item;
import com.pd.service.SearchService;

@Service
public class SearchServiceImpl implements SearchService {
	
	/*
	 * SolrClient实例是在 SolrAutoConfiguration 类中创建的
	 * 
	 * SolrAutoConfiguration添加了@Configuration注解,
	 * 是spring boot自动配置类,其中的solrClient()方法中创建了SolrClient实例
	 */
	@Autowired
	private SolrClient solrClient;

	@Override
	public List<Item> findItemByKey(String key) throws Exception {
		//封装查询的关键词
		//也可以封装其他的查询参数,比如指定字段,facet设置等
		SolrQuery query = new SolrQuery(key);
		//查询前多少条数据
		query.setStart(0);
		query.setRows(20);
		
		//执行查询并得到查询结果
		QueryResponse qr = solrClient.query(query);
		//把查询结果转成一组商品实例
		List<Item> beans = qr.getBeans(Item.class);
		return beans;
	}

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44

7.SearchController 控制器

package com.pd.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

import com.pd.pojo.Item;
import com.pd.service.SearchService;

@Controller
public class SearchController {
	@Autowired
	private SearchService searchService;
	
	@GetMapping("/search/toSearch.html")
	public String search(String key, Model model) throws Exception {
		List<Item> itemList = searchService.findItemByKey(key);
		model.addAttribute("list", itemList);
		return "/search.jsp";
	}
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

Solr面试回答思路

1.Solr是什么?

Solr 是个可扩展的 (官方有很多功能) 搜索/存储引擎(可以当作数据库使用)
虽然数据库本身有搜索功能, 但只能通过模糊查询,效率非常慢(因为要查询整个数据库). 而 Solr 是基lecene,使用倒排索引, 搜索效率很高;
在这里插入图片描述
在这里插入图片描述

2.同类型技术比较

ElasticSearch vs Solr多维度分析对比
在这里插入图片描述

3.大概介绍solr的使用

3.1服务端:
1.添加jar包
ik-analyzer-8.1.0.jar------------IK分词器
mysql-connector-java-5.1.46.jar -----------连接数据库
solr-dataimporthandler-8.1.1.jar-------------------数据导入控制器

2.配置scheme.xml文件 -----添加分词器

#修改 solr目录/server/solr/pd/conf/managed-schema,添加 ik-analyzer 分词器

<!-- ik分词器 -->
<fieldType name="text_ik" class="solr.TextField">
  <analyzer type="index">
      <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false" conf="ik.conf"/>
      <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
  <analyzer type="query">
      <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="true" conf="ik.conf"/>
      <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

3.2客户端:
springBoot整合了solr

服务端负责配置
客户端负责使用

项目里用solr完成了商品的搜索,分页查询

@Service
public class SearchServiceImpl implements SearchService {
	
	/*
	 * SolrClient实例是在 SolrAutoConfiguration 类中创建的
	 * 
	 * SolrAutoConfiguration添加了@Configuration注解,
	 * 是spring boot自动配置类,其中的solrClient()方法中创建了SolrClient实例
	 */
	@Autowired
	private SolrClient solrClient;

	@Override
	public List<Item> findItemByKey(String key) throws Exception {
		//封装查询的关键词
		//也可以封装其他的查询参数,比如指定字段,facet设置等
		SolrQuery query = new SolrQuery(key);
		//查询前多少条数据
		query.setStart(0);
		query.setRows(20);
		
		//执行查询并得到查询结果
		QueryResponse qr = solrClient.query(query);
		//把查询结果转成一组商品实例
		List<Item> beans = qr.getBeans(Item.class);
		return beans;
	}

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

定时更新:

假设我上一次更新的时间是2019.12.02,那我下次增量更新就得拿这个时间,这个时间是存在solr_home\collectionA\conf\dataimport.properties文件内的last_index_time属性的,拿这个时间去数据库 跟 这个标注时间的字段进行比较,在上一次更新时间之后的数据,全都是本次进行增量更新的数据,

 	<dataConfig>
	    <dataSource name="solrDB" type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://192.168.1.10:3306/localdb" user="admin" password="123456" />
	  <document>
	        <entity pk="id" dataSource="solrDB" name="z_solr_test" query="select id, name, content, update_time from z_solr_test" 
			deltaImportQuery="select id, name, content, update_time from z_solr_test where id='${dih.delta.id}'" 
	        deltaQuery="SELECT id, name, content, update_time FROM z_solr_test where update_time >'${dataimporter.last_index_time}'">
	            <field column="id" name="id" />
	            <field column="name" name="name" />
	            <field column="content" name="content" />
				<field column="update_time" name="update_time"/>
	        </entity>
	    </document>
	</dataConfig>


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

# schedule interval
# number of minutes between two runs
# [defaults to 30 if empty]
#这里是设置定时任务的,单位是分钟,也就是多长时间你检测一次数据同步,根据项目需求修改
#  开始测试的时候为了方便看到效果,时间可以设置短一点
interval=1
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号