基于SpringBoot的Data Solr搜索引擎开发
关于Apache Solr的简介
Solr它是一种开放源码的、基于 Lucene Java 的搜索服务器,易于加入到 Web 应用程序中。Solr 提供了层面搜索(就是统计)、命中醒目显示并且支持多种输出格式(包括XML/XSLT 和JSON等格式)。它易于安装和配置,而且附带了一个基于HTTP 的管理界面。可以使用 Solr 的表现优异的基本搜索功能,也可以对它进行扩展从而满足企业的需要。Solr的特性包括:
- 高级的全文搜索功能
- 专为高通量的网络流量进行的优化
- 基于开放接口(XML和HTTP)的标准
- 综合的HTML管理界面
- 可伸缩性-能够有效地复制到另外一个Solr搜索服务器
- 使用XML配置达到灵活性和适配性
- 可扩展的插件体系
- 支持像英语,德语,中国,日本,法国和许多主要语言
Apache Solr和Lucene的关系
Solr 与Lucene 并不是竞争对立关系,恰恰相反Solr 依存于Lucene ,因为Solr 底层的核心技术是使用Apache Lucene 来实现的,简单的说Solr 是Lucene 的服务器化。需要注意的是Solr 并不是简单的对Lucene 进行封装,它所提供的大部分功能都区别于Lucene。
Apache Solr 相关目录说明
Solr程序包的结构说明
- bin :solr相关运行脚本
- docs:相关API参考文档和wiki资料等
- licenses:存放了solr相关证书
- contrib :solr相关扩展的jar包
- dist :存放Solr 构建完成的JAR 文件、WAR 文件和Solr 依赖的JAR 文件。
- example :是一个安装好的Jetty 中间件,其中包括一些样本数据和Solr 的配置信息。
- example/etc :Jetty 的配置文件。
- example/multicore :当安装Slor multicore 时,用来放置多个Solr 主目录。
- example/solr :默认安装时一个Solr 的主目录。
- example/example-DIH:数据库做索引数据源的示例
- example/webapps :Solr 的WAR 文件部署在这里。
- src :Solr 相关源码。
- src/java :Slor 的Java 源码。
- src/scripts :一些在大型产品发布时一些有用的Unix bash shell 脚本。
- src/solrj :Solr 的Java 客户端。
- src/test :Solr 的测试源码和测试文件。
- src/webapp :Solr web 管理界面。管理界面的Jsp 文件都放在web/admin/ 下面,可以根据你的需要修改这些文件。
Solr 主目录结构说明
- bin :建议将集群复制脚本放在这个目录下。
- conf :放置配置文件。
- conf/schema.xml :建立索引的schema 包含了字段类型定义和其相关的分析器。
- conf/solrconfig.xml :这个是Solr 主要的配置文件。
- conf/xslt :包含了很多xslt 文件,这些文件能将Solr 的XML 的查询结果转换为特定的格式,比如:Atom/RSS。
- data :放置Lucene 产生的索引数据。
- lib :放置可选的JAR 文件比如对Slor 扩展的插件,这些JAR 文件将会在Solr 启动时加载。
第一章:搭建Apache Solr开发环境
准备步骤 :Tomcat 8以上、JDK7以上、solr5.5.4版本
- 将 solr 压缩包解压,并将solr-5.5.4\solr_webapps下的文件夹webapp,将之复制到Tomcat\webapps\目录下,并且改名为solr(名字自己定义)
- 将 solr 压缩包中 solr-5.5.4\server\lib\ext所有jar包 全部复制到 Tomcat\ webapps\solr\WEB-INF\lib目录中
- 将 solr 压缩包中 solr-5.5.4\ server\resources \log4j.properties 复制到Tomcat\ webapps\solr\WEB-INF 目录中
- 创建一个solr_home 的目录(用户可以根据操作系统决定),并将 solr 压缩包中example下的solr 目录除了bin所有文件复制D:\solr_home目录下,如图所示:
- 打开Tomcat/webapps/solr/WEB-INF下的web.xml,增加如下配置内容(初始状态下该内容是被注释掉的):
<env-entry>
<env-entry-name>solr/home</env-entry-name>
<env-entry-value>D:/solr_home</env-entry-value>
<env-entry-type>java.lang.String</env-entry-type>
</env-entry>
将<env-entry-value>中的内容改成你的solrhome路径,这里是D:/solr_home
这项配置,主要是建立tomcat 与solr之间的关系的,它的作用是让tomcat找到你所配置的solr 目录。
- 启动tomcat,从地址栏输入如下网址:http://localhost:8080/solr会出现如下界面:
第二章:Apache Solr 从MySQL数据库中导入数据
-
导入solr自带的数据导入包放到tomcat 中的solr工程的web-inf下lib中
在collection1的目录中添加lib包,把data-import需要用的包拷贝到lib中
其中包括mysql包 -
在磁盘中的solr_home 打开solrconfig.xml 添加如下代码
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler"> <lst name="defaults"> <str name="config">data-config.xml</str> </lst> </requestHandler>
-
在同级目录下创建一个data-config.xml文件,添加如下内容
<?xml version="1.0" encoding="UTF-8" ?> <dataConfig> <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost/mydb" user="root" password="root" /> <document name="userinfo"> <entity name="userinfo" query="select id,name,address,birthday,age from userinfo "> <field column="ID" name="user_id" /> <field column="NAME" name="user_name" /> <field column="ADDRESS" name="user_address" /> <field column="BIRTHDAY" name="user_birthday" /> <field column="AGE" name="user_age" /> </entity> </document> </dataConfig>
备注说明:
document:表示搜索引擎的文档
entity:表示对应的实体类
query:执行的SQL查询语句
field:搜索引擎对应的域
column:数据库对应的列
name:搜索引擎对应的域名
-
在同级目录下schema.xml下配置如下代码,将数据库的字段和域一一对应关系配置好。
<field name="user_id" type="int" indexed="true" stored="true"/>
<field name="user_name" type="string" indexed="true" stored="true"/>
<field name="user_address" type="string" indexed="true" stored="true"/>
<field name="user_birthday" type="date" indexed="true" stored="true"/>
<field name="user_age" type="int" indexed="true" stored="true"/>
第三章:Apache Solr配置中文分词器
1、中文分词器采用的是lucene-analyzers-smartcn来做为Apache Solr的分词器,将该jar包拷贝到tomcat下的webapps-solr
工程中的WEB-INF的lib中。
2、在配置的solr_home目录中打开配置好的collection1下的conf的managed-schema文件添加如下代码
<!-- 添加中文分词器 -->
<dynamicField name="*_txt_cn" type="text_cn" indexed="true" stored="true"/>
<fieldType name="text_cn" class="solr.TextField">
<analyzer class="org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer"/>
</fieldType>
启动控制台,从地址栏中输入http://localhost:8080/solr会出现如下界面:
第四章:使用SpringBoot搭建solr开发环境
工程目录结构如下:
第一步:配置SpringBoot的属性文件
spring.data.solr.host=http://localhost:8081/solr
spring.thymeleaf.cache=false
spring.thymeleaf.encoding=utf-8
spring.thymeleaf.mode=HTML
spring.thymeleaf.suffix=.html
第二步:编写Apache Solr对应的实体类
package com.sudojava.springboot_solr.domain;
import org.apache.solr.client.solrj.beans.Field;
public class Product {
@Field
private String id;
@Field
private String price;
@Field
private String title;
@Field
private String pic_url;
@Field
private String selling_price;
@Field
private String sales_volume;
@Field
private String coupon_title;
@Override
public String toString() {
return "Product{" +
"id='" + id + '\'' +
", price='" + price + '\'' +
", title='" + title + '\'' +
", pic_url='" + pic_url + '\'' +
", selling_price='" + selling_price + '\'' +
", sales_volume='" + sales_volume + '\'' +
", coupon_title='" + coupon_title + '\'' +
'}';
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getPic_url() {
return pic_url;
}
public void setPic_url(String pic_url) {
this.pic_url = pic_url;
}
public String getSelling_price() {
return selling_price;
}
public void setSelling_price(String selling_price) {
this.selling_price = selling_price;
}
public String getSales_volume() {
return sales_volume;
}
public void setSales_volume(String sales_volume) {
this.sales_volume = sales_volume;
}
public String getCoupon_title() {
return coupon_title;
}
public void setCoupon_title(String coupon_title) {
this.coupon_title = coupon_title;
}
}
第三步:编写产品查询列表的Service以及实现类
package com.sudojava.springboot_solr.service;
import com.sudojava.springboot_solr.domain.Product;
import java.util.List;
public interface ProductService {
public List<Product> searchProductByName(String title);
}
package com.sudojava.springboot_solr.service;
import com.sudojava.springboot_solr.common.StringTrim;
import com.sudojava.springboot_solr.domain.Product;
import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.StringUtils;
import org.springframework