什么是搜索引擎
搜索引擎是指根据一定的策略、运用特定的计算机程序从互联网上搜集信息,在对信息进行组织和处理后,为用户提供检索服务,将用户检索相关的信息展示给用户的系统
原始数据库查询的缺陷
-
- 慢, 当数据库中的数据量很庞大的时候, 整个的查询效率非常低, 无法及时返回内容
-
- 搜索效果比较差, 只能根据用户输入的完整关键字的进行首尾的模糊匹配
-
- 如果用户输入的关键字出现错别字, 或者多输入了内容, 可能就导致结果远离用户期望的内容
倒排索引技术
倒排索引, 又称为反向索引: 以字或者词,甚至是一句话一段话作为一个关键字进行索引, 每一个关键字都会对应着一个记录项, 记录项中记录了这个关键字出现在那些文档中, 已经在此文档的什么位置上
倒排索引, 是将数据提前按照格式分词放好,建立索引, 当用户进行搜索, 将用户的关键字进行分词, 然后根据分词后的单词到索引库中寻找对应词条,根据词条, 查到对应所在的文档位置, 将其文档内容直接获取即可
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中都有两个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);
}
}