solr

solr

solr简介

  • 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的配置和运行情况

为什么要用全文搜索搜索引擎

之前,有同事问我,为什么要用搜索引擎?我们的所有数据在数据库里面都有,而且 Oracle、SQL Server 等数据库里也能提供查询检索或者聚类分析功能,直接通过数据库查询不就可以了吗?确实,我们大部分的查询功能都可以通过数据库查询获得,如果查询效率低下,还可以通过建数据库索引,优化SQL等方式进行提升效率,甚至通过引入缓存来加快数据的返回速度。如果数据量更大,就可以分库分表来分担查询压力。

那为什么还要全文搜索引擎呢?我们主要从以下几个原因分析:

  • 数据类型
    全文索引搜索支持非结构化数据的搜索,可以更好地快速搜索大量存在的任何单词或单词组的非结构化文本。
    例如 Google,百度类的网站搜索,它们都是根据网页中的关键字生成索引,我们在搜索的时候输入关键字,它们会将该关键字即索引匹配到的所有网页返回;还有常见的项目中应用日志的搜索等等。对于这些非结构化的数据文本,关系型数据库搜索不是能很好的支持。
  • 索引的维护
    一般传统数据库,全文检索都实现的很鸡肋,因为一般也没人用数据库存文本字段。进行全文检索需要扫描整个表,如果数据量大的话即使对SQL的语法优化,也收效甚微。建立了索引,但是维护起来也很麻烦,对于 insert 和 update 操作都会重新构建索引。

什么时候使用全文搜索引擎:

  1. 搜索的数据对象是大量的非结构化的文本数据。
  2. 文件记录量达到数十万或数百万个甚至更多。
  3. 支持大量基于交互式文本的查询。
  4. 需求非常灵活的全文搜索查询。
  5. 对高度相关的搜索结果的有特殊需求,但是没有可用的关系数据库可以满足。
  6. 对不同记录类型、非文本数据操作或安全事务处理的需求相对较少的情况。

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>
  • yml加入solr连接参数
spring:
data:
  solr:
    host: http://192.168.11.217:8983/solr
  • 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;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值