为什么要用全文搜索引擎
-
Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器。Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化。
-
Solr可以独立运行,运行在Jetty、Tomcat等这些Servlet容器中,Solr 索引的实现方法很简单,用 POST 方法向 Solr 服务器发送一个描述 Field 及其内容的 XML 文档,Solr根据xml文档添加、删除、更新索引 。Solr 搜索只需要发送 HTTP GET 请求,然后对 Solr 返回Xml、json等格式的查询结果进行解析,组织页面布局。Solr不提供构建UI的功能,Solr提供了一个管理界面,通过管理界面可以查询Solr的配置和运行情况。
-
solr本身也可以看成数据库,(no sql类型),但它比数据库搜索速度更快,所以在项目中我们一般把搜搜的部分交给solr,就像我们在京东首页所看到的商品信息,并不是来自数据库,而是来源于sorl的索引库
-
数据库本身不能实现分词效果,而只能使用模糊查询,但是模糊查询非常低效,查询速度比较慢,由于在实际生活中,一般搜索是用的比较多的,这样数据库压力自然就很大,所以我们就让供专业的solr来做搜索功能
linux下安装solr
- 解压solr
tar zxvf solr-5.5.5.tgz
- 创建Solr数据和安装目录
mkdir -p /data/solr /usr/local/solr
- 安装solr(进入 solr-5.5.5/bin/ 目录)
./install_solr_service.sh /opt/solr-5.5.5.tgz -d /data/solr -i /usr/local/solr/
- Solr安装时,会自动创建一个solr用户,可以进入/etc/passwd中查看
cat /etc/passwd
如未创建用户则进行手工创建
groupadd solr
useradd -g solr solr
- 给Solr用户授权,防止创建core无权限的情况
chown -R solr.solr /data/solr /usr/local/solr
- 查看Solr状态
service solr status
- Solr命令
启动 service solr start
停止 service solr stop
重新启动 service solr restart
- 创建一个新的core
su - solr -c "/usr/local/solr/solr/bin/solr create -c javasm(core名称) -n data_driven_schema_configs"
core相当于一个文档集,存放着文档,文档字段类型配置,索引等等信息
- 将solr端口加入防火墙白名单
firewall-cmd --permanent --zone=public --add-port=8983/tcp
firewall-cmd --reload
- 访问Solr管理界面
http://192.168.14.204:8983
solr与springboot的简单集成
- 添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-solr</artifactId>
</dependency>
-
配置文件配置
-
service代码
// javasm为安装时创建的core
@Service
public class SolrServiceImpl implements SolrService {
@Resource
private SolrClient solrClient;
@Override
public String add(Integer aid, String aname) {
// TODO: 添加到数据库
if (aid != null && !StringUtils.isEmpty(aname)) {
new Thread(() -> {
// TODO: 添加到redis
// 添加到solr
SolrInputDocument sid = new SolrInputDocument();
sid.addField("aid", aid);
sid.addField("aname", aname);
try {
solrClient.add("javasm", sid);
solrClient.commit("javasm");
} catch (SolrServerException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}).start();
return "success";
}
return "error";
}
@Override
public SolrDocumentList query(String query) {
if (!StringUtils.isEmpty(query)) {
// 创建查询对象
SolrQuery solrQuery = new SolrQuery();
// 设置检索条件
solrQuery.setQuery(query);
try {
// 获得响应对象
QueryResponse query1 = solrClient.query("javasm", solrQuery);
// 从响应对象中获取数据
SolrDocumentList results = query1.getResults();
return results;
} catch (SolrServerException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
}