搜索引擎 lucene andsolr

什么是搜索引擎

搜索引擎是指根据一定的策略、运用特定的计算机程序从互联网上搜集信息,在对信息进行组织和处理后,为用户提供检索服务,将用户检索相关的信息展示给用户的系统

原始数据库查询的缺陷

    1. 慢, 当数据库中的数据量很庞大的时候, 整个的查询效率非常低, 无法及时返回内容
    1. 搜索效果比较差, 只能根据用户输入的完整关键字的进行首尾的模糊匹配
    1. 如果用户输入的关键字出现错别字, 或者多输入了内容, 可能就导致结果远离用户期望的内容

倒排索引技术

倒排索引, 又称为反向索引: 以字或者词,甚至是一句话一段话作为一个关键字进行索引, 每一个关键字都会对应着一个记录项, 记录项中记录了这个关键字出现在那些文档中, 已经在此文档的什么位置上
倒排索引, 是将数据提前按照格式分词放好,建立索引, 当用户进行搜索, 将用户的关键字进行分词, 然后根据分词后的单词到索引库中寻找对应词条,根据词条, 查到对应所在的文档位置, 将其文档内容直接获取即可

Lucene

Lucene是Apache提供的一个开源的全文检索引擎工具包, 其本质就是一堆jar包而已, 而非一个完整的搜索引擎, 但是我们可以通过Lucene来构建一个搜索引擎

Solr

solr是一个独立的企业级的应用搜索服务器, 如果想要连接solr服务器, 需要发送http请求, solr基于lucene实现的可配置可扩展的服务器

SolrCloud

SolrCloud(solr 云)是Solr提供的分布式搜索方案,当你需要大规模,容错,分布式索引和检索能力时使用 SolrCloud。当一个系统的索引数据量少的时候是不需要使用SolrCloud,当索引量很大,搜索请求并发很高,这时需要使用SolrCloud来满足这些需求。
SolrCloud为了降低单机的处理压力,需要由多台服务器共同来完成索引和搜索任务。实现的思路是将索引数据进行Shard(分片)拆分,每个分片由多台的服务器共同完成,当一个索引或搜索请求过来时会分别从不同的Shard的服务器中操作索引。

SolrCloud需要Solr基于Zookeeper部署,Zookeeper是一个集群管理软件,由于SolrCloud需要由多台服务器组成,由zookeeper来进行协调管理。

物理结构:

  • 指定就是三台solr服务器(直白一点就是三个部署了solr的tomcat)

    • 每个tomcat中都有两个core(索引库)
      逻辑结构
  • 我们把整个集群看做了一个整体(一个大的索引库), 在这个索引库下有两个分片(也就是把索引库分成两部分), 每一个分片都有三个节点(对应就是物理结果中各个tomcat的索引库),其中一个为主节点,两个备份节点

使用solrj连接集群, 完成基本的索引库操作

//1. 创建一个solrj连接solrCloud的服务对象
String zkHost = “192.168.72.141:2181,192.168.72.142:2181,192.168.72.143:2181”;
CloudSolrServer solrServer = new CloudSolrServer(zkHost);
//1.1 一个必须参数
solrServer.setDefaultCollection(“collection2”); // 指定默认连接那个大索引库

    //1.2 两个可选参数
    solrServer.setZkClientTimeout(5000); // 获取和zookeeper连接的超时时间
    solrServer.setZkConnectTimeout(5000); // 从zookeeper中获取连接的超时时间

    //1.3  获取连接 (可选的 )
    solrServer.connect();

    //2. 添加文档数据
    SolrInputDocument doc = new SolrInputDocument();
    doc.addField("id",1);
    doc.addField("title","猛龙获取NBA总冠军11111");
    doc.addField("content","这是猛龙建队年首次夺冠");

    solrServer.add(doc);
    //3. 提交文档数据
    solrServer.commit();

// 删除索引操作
@Test
public void delIndexSolrjCloudTest() throws Exception{

    //1. 创建solrj连接solrCloud的服务对象 : Windows
    String zkHost = "node01:2181,node02:2181,node03:2181";
    CloudSolrServer solrServer = new CloudSolrServer(zkHost);

    //1.1 一个必须, 两个可选的
    solrServer.setDefaultCollection("collection2");
    solrServer.setZkClientTimeout(5000);
    solrServer.setZkConnectTimeout(5000);
    //1.2 获取连接
    solrServer.connect();

    //2. 添加删除索引的条件

    solrServer.deleteById("1");
    //3. 提交删除操作
    solrServer.commit();
}

// 查询索引
@Test
public void indexSearcherSolrjCloudTest() throws Exception {
//1. 创建 solrj连接solrCloud的服务对象
String zkHost = “node01:2181,node02:2181,node03:2181”;
CloudSolrServer solrServer = new CloudSolrServer(zkHost);
//1.1 一个必须, 两个可选
solrServer.setDefaultCollection(“collection2”);
solrServer.setZkClientTimeout(5000);
solrServer.setZkConnectTimeout(5000);
//1.2 获取连接
solrServer.connect();

    //2.封装查询条件
    SolrQuery solrQuery = new SolrQuery("*:*"); // 查询所有
    //3. 执行查询
    QueryResponse response = solrServer.query(solrQuery);
    //4. 获取数据
    SolrDocumentList documentList = response.getResults();

    for (SolrDocument document : documentList) {
        Object id = document.get("id");
        Object title = document.get("title");
        Object content = document.get("content");

        System.out.println("文档的id:"+id+"; 文档的标题:"+title+";文档的的内容:"+content);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值