java solr jar_Solr 8.2 使用指南

1 Solr简介

1.1 Solr是什么

Solr是一个基于全文检索的企业级应用服务器。可以输入一段文字,通过分词检索数据。它是单独的服务,部署在 tomcat。

1.2 为什么需要Solr

问题:我们已经学过Lucene,为什么还要学习solr?

Lucene是一个工具包,不能单独运行,需要导入到java代码中。Solr可以独立运行在tomcat容器中,通过http协议,以接口的方式对外提供服务,java代码只需要专注于业务的处理就可以。

9240464153b74c6a1d7f80b621530bce.png

1.3 Solr目录结构说明

4a8a9c7cda02b274b1bab4a1eac58208.png

bin:solr的运行脚本

contrib:solr的一些扩展jar包,用于增强solr的功能

dist:该目录包含build过程中产生的jar文件,以及相关的依赖文件

example:solr工程的例子目录

licenses:solr相关的一些许可信息

2 入门示例

2.1 需求

将数据库的数据导入 solr 中,实现查询功能

2.2 配置步骤

2.2.1 启动 solr

进入 solr 解压路径下的 bin 目录,按 shift + 鼠标右键,选择在此次打开命令行工具

5b18ad2a6d7e96e22132ba41eebcd27b.png

输入命令: .solr start 启动 solr 服务

30f5d4835c5fdb4311ad37817fcd05f2.png

使用浏览器访问 localhost:8983 即可进入后台控制页面。

1257cf888fce7bde2626ea2d0aed0c1e.png

2.2.2 配置 solr core

继续使用命令工具创建一个 core,core 就相当于一个 solr 的项目实例。

命令:solr create -c

e72bbc058faaaa21112966f8c2df62db.png

成功创建后,可以在 solr-8.2.0/server/solr/ 目录下看到自动生成的默认配置文件

ebcc52a9b92a5c4746e95c19d2648178.png

创建完成后,重新进入后台控制页面,可以查看到新建的 core

cf4abf135817226b027249f09e1cdcb5.png

2.2.3 创建java程序访问solr服务器

步骤说明:

采集数据

将数据转换成Solr文档

连接solr服务器,将文档写入索引库

2.2.3.1 创建项目,导入 jar 包

需要导入的包有:

Solrj 核心包:solr-8.2.0distsolr-core-8.2.0.jar

Solrj 依赖包:solr-8.2.0distsolrj-lib 目录下的所有包

JDBC 驱动包:根据数据库版本而定,我这里拷的是 mysql 8 的驱动包

项目结构:

8596829bf6ddba8d0c528f637e8bcdec.png

2.2.3.2 采集数据

需求采集的字段说明:

参与搜索的字段:名称、价格、商品类别、描述信息

参与结果展示的字段:商品id、图片

(1)创建 pojo

public class Product {

private Integer pid;

private String name;

private String categoryName;

private Double price;

private String description;

private String picture;

//省略 getter、setter、constructor、toString

}

(2)创建 dao

public class ProductDao {

public List listAll() {

List products = new ArrayList<>();

//获取数据库连接

Connection conn = JdbcUtils.getConnection();

String sql = "select * from `products`";

Statement statement = null;

ResultSet resultSet = null;

try {

//创建 statement

statement = conn.createStatement();

//执行 sql 语句

resultSet = statement.executeQuery(sql);

//循环操作结果集

while (resultSet.next()) {

products.add(new Product(resultSet.getInt("pid"),

resultSet.getString("name"),

resultSet.getString("category_name"),

resultSet.getDouble("price"),

resultSet.getString("description"),

resultSet.getString("picture")));

}

} catch (SQLException e) {

e.printStackTrace();

} finally {

//关闭资源

if (null != resultSet) {

try {

resultSet.close();

} catch (SQLException e) {

e.printStackTrace();

} finally {

if (null != statement) {

try {

statement.close();

} catch (SQLException e) {

e.printStackTrace();

} finally {

if (null != conn) {

try {

conn.close();

} catch (SQLException e) {

e.printStackTrace();

}

}

}

}

}

}

}

return products;

}

}

(3)将数据转换成 solr 文档, SolrInputDocument 对象

Solr是通过一个配置文件managed-schema,事先定义域的信息的,需要先定义再使用。

d2ffed2f2f1633b119bae339fa7ddea3.png

配置文件里面事先定义好了各种 ,能够根据命名动态的指定域的类型,也就是 type 属性。

080fa0b5e4765bbb1b9189f1dfeebfdf.png

而域的类型也在此做了定义,用的是 标签。(可对比 lucene 理解)

b4b594cedee1efcb7c6eaec8e7670ec5.png

其中,text-general 指定了分词器,以及一些拓展配置文件

85523889fb8397db52c9f3d526495f27.png

我们可以根据需要,按照上述例子,手动的声明几个域,并使用中文分词。先将 lucene 中的 SmartChineseAnalyzer 的 jar 包拷入文件夹中

8cd8fdb5c8cf06718b45c99bf5cb716d.png

再修改 managed-schema 配置文件,添加以下内容

5df470652d7d0ee3a4a5ab876a9bc95c.png

重启服务器后,可以看到效果

ac1d2a623e42f1233c7465bcc0e7510a.png

为 dao 添加 getDocuments 方法

public List getDocuments(List products) {

List documents = new ArrayList<>();

products.forEach(product -> {

SolrInputDocument document = new SolrInputDocument();

document.addField("id", product.getPid());//对应solr的uniqueKey

document.addField("product_name", product.getName());

document.addField("product_price", product.getPrice());

document.addField("product_category_name", product.getCategoryName());

document.addField("product_picture", product.getPicture());

document.addField("product_description", product.getDescription());

documents.add(document);

});

return documents;

}

创建索引库

@Test

public void createIndex() {

//1.创建 HttpSolrClient.Builder 对象,通过它创建客户端通信

HttpSolrClient.Builder builder = new HttpSolrClient.Builder("http://localhost:8983/solr");

HttpSolrClient solrClient = builder.build();

//2.通过 client 将 document 加入索引库

ProductDao dao = new ProductDao();

try {

//参数1是 solr core 的名字

solrClient.add("product", dao.getDocuments(dao.listAll()));

solrClient.commit("product");

System.out.println("创建索引库完成");

} catch (SolrServerException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

导入成功后可以在后天控制页面看到结果

857351f9b11722c80cab7acc7505cc90.png

2.2.3.3 搜索索引

@Test

public void queryTest() {

//1.创建 HttpSolrClient.Builder 对象,通过它创建客户端通信

HttpSolrClient.Builder builder = new HttpSolrClient.Builder("http://localhost:8983/solr");

HttpSolrClient solrClient = builder.build();

//2.创建一个map封装搜索条件

Map queryMap = new HashMap<>();

queryMap.put("q","音乐盒");//关键字

queryMap.put("df", "product_name");//默认搜索域

//queryMap.put("sort","id asc");//结果以 id 升序排列,默认以关联度排序

queryMap.put("rows","20");//默认只有十条

//3.使用map创建 MapSolrParams 对象

SolrParams solrParams = new MapSolrParams(queryMap);

try {

//4.使用客户端进行查询

QueryResponse response = solrClient.query("product", solrParams);

//5.提取结果

SolrDocumentList documents = response.getResults();

System.out.println("一共查询到:" + documents.getNumFound() + "条结果");

//6.循环输出

documents.forEach(document ->{

System.out.println("编号" + document.get("id") + ":" + document.get("product_name"));

});

} catch (SolrServerException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

3 solr管理控制台

3.1 查询界面说明

08e8e020efbfc6ceb6722c1de9e297f2.png

可以根据查询界面各个关键字,设置上述代码 queryMap,实现复杂的查询功能。key 对应的就是关键字,value 就是输入框内的值。

3.2 安装DataImport插件

3.2.1 Dataimport插件说明

使用该插件后,可以在管理界面直接从数据库导入数据到索引库。(即:一个插件解决入门示例中,创建索引的全部操作)

3.2.2 安装步骤

(1)拷贝相关 jar 包到文件夹

1b942e5e05d92325916409d525a0494b.png

(2)修改 solr-8.2.0serversolrproductconfsolrconfig.xml 文件,增加以下代码

f2fdd75d135dfa94aed3394297aa8879.png

(3)在 solr-8.2.0serversolrproductconf 目录下新建 DIHconfig.xml 文件,并编写以下内容

driver="com.mysql.cj.jdbc.Driver"

url="jdbc:mysql://localhost:3306/solr?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false"

user="root"

password="password"

/>

query="SELECT * FROM products">

(4)重启 solr 服务

7427265cea0e2074d9b94b5674581fe5.png

3.2.3 测试

(1) 清空索引库

a5c1ade5d271ce8d86893d0b1c06e71d.png

(2)导入索引库

7fe30599133f4895bb207ed66a47bc40.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值