Solr的工作原理以及如何管理索引库

Posted 江苏万和IT教育

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Solr的工作原理以及如何管理索引库相关的知识,希望对你有一定的参考价值。


1
Solr的简介


Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出查找请求,并得到XML格式的返回结果。


Solr是Apache软件基金会下的子项目之一。


Solr的工作原理以及如何管理索引库


2
工作原理


solr是基于Lucence开发的企业级搜索引擎技术,而lucence的原理是倒排索引。那么什么是倒排索引呢?接下来我们就介绍一下lucence倒排索引原理。


假设有两篇文章1和2:


文章1的内容为:老超在卡子门工作,我也是。


文章2的内容为:小超在鼓楼工作。


由于lucence是基于关键词索引查询的,那我们首先要取得这两篇文章的关键词。如果我们把文章看成一个字符串,我们需要取得字符串中的所有单词,即分词。分词时,忽略”在“、”的“之类的没有意义的介词,以及标点符号可以过滤。


我们使用Ik Analyzer实现中文分词,分词之后结果为:


文章1:


Solr的工作原理以及如何管理索引库



文章2:


Solr的工作原理以及如何管理索引库


接下来,有了关键词后,我们就可以建立倒排索引了。上面的对应关系是:“文章号”对“文章中所有关键词”。倒排索引把这个关系倒过来,变成: “关键词”对“拥有该关键词的所有文章号”。


文章1、文章2经过倒排后变成:


Solr的工作原理以及如何管理索引库


通常仅知道关键词在哪些文章中出现还不够,我们还需要知道关键词在文章中出现次数和出现的位置,通常有两种位置:


a.字符位置,即记录该词是文章中第几个字符(优点是关键词亮显时定位快);


b.关键词位置,即记录该词是文章中第几个关键词(优点是节约索引空间、词组(phase)查询快),lucene中记录的就是这种位置。


加上出现频率和出现位置信息后,我们的索引结构变为:


Solr的工作原理以及如何管理索引库


实现时,lucene将上面三列分别作为词典文件(Term Dictionary)、频率文件(frequencies)、位置文件 (positions)保存。其中词典文件不仅保存有每个关键词,还保留了指向频率文件和位置文件的指针,通过指针可以找到该关键字的频率信息和位置信息。



3
使用SolrJ管理索引库


使用SolrJ可以实现索引库的增删改查操作。


3.1 添加文档


第一步:把solrJ的jar包添加到工程中。


第二步:创建一个SolrServer,使用HttpSolrServer创建对象。


第三步:创建一个文档对象SolrInputDocument对象。


第四步:向文档中添加域。必须有id域,域的名称必须在schema.xml中定义。


第五步:把文档添加到索引库中。


第六步:提交。


 1@Test
2public void testSolrJAdd() throws SolrServerException, IOException {
3  // 创建一个SolrServer对象。创建一个HttpSolrServer对象
4  // 需要指定solr服务的url
5  SolrServer solrServer = new HttpSolrServer("http://101.132.69.111:8080/solr/collection1");
6  // 创建一个文档对象SolrInputDocument
7  SolrInputDocument document = new SolrInputDocument();
8  // 向文档中添加域,必须有id域,域的名称必须在schema.xml中定义
9  document.addField("id""123");
10  document.addField("item_title""红米手机");
11  document.addField("item_price"1000);
12  // 把文档对象写入索引库
13  solrServer.add(document);
14  // 提交
15  solrServer.commit();
16}


3.2 删除文档


3.2.1 根据id删除


第一步:创建一个SolrServer对象。


第二步:调用SolrServer对象的根据id删除的方法。


第三步:提交。


1@Test
2public void deleteDocumentById() throws Exception {
3  SolrServer solrServer = new HttpSolrServer("http://101.132.69.111:8080/solr/collection1");
4  solrServer.deleteById("123");
5  // 提交
6  solrServer.commit();
7}


3.2.2 根据查询删除


1@Test
2public void deleteDocumentByQuery() throws Exception {
3  SolrServer solrServer = new HttpSolrServer("http://101.132.69.111:8080/solr/collection1");
4  //这边会根据分词去删
5  solrServer.deleteByQuery("item_title:红米手机");
6  solrServer.commit();
7}


3.3 查询索引库


第一步:创建一个SolrServer对象


第二步:创建一个SolrQuery对象。


3 向SolrQuery中添加查询条件、过滤条件。。。


第四步:执行查询。得到一个Response对象。


5 取查询结果。


第六步:遍历结果并打印。


3.3.1 简单查询


 1@Test
2public void queryDocument() throws Exception 
{
3    // 第一步:创建一个SolrServer对象
4    SolrServer solrServer = new HttpSolrServer("http://101.132.69.111:8080/solr/collection1");
5    // 第二步:创建一个SolrQuery对象。
6    SolrQuery query = new SolrQuery();
7    // 第三步:向SolrQuery中添加查询条件、过滤条件。。。
8    query.setQuery("*:*");
9    // 第四步:执行查询。得到一个Response对象。
10    QueryResponse response = solrServer.query(query);
11    // 第五步:取查询结果。
12    SolrDocumentList solrDocumentList = response.getResults();
13    System.out.println("查询结果的总记录数:" + solrDocumentList.getNumFound());
14    // 第六步:遍历结果并打印。
15    for (SolrDocument solrDocument : solrDocumentList) {
16      System.out.println(solrDocument.get("id"));
17      System.out.println(solrDocument.get("item_title"));
18      System.out.println(solrDocument.get("item_price"));
19      }
20}



3.3.2 带高亮显示


 1@Test
2public void searchDocumet() throws Exception {
3  // 创建一个SolrServer对象
4  SolrServer solrServer = new HttpSolrServer("http://101.132.69.111:8080/solr/collection1");
5  // 创建一个SolrQuery对象
6  SolrQuery query = new SolrQuery();
7  // 设置查询条件、过滤条件、分页条件、排序条件、高亮
8  // query.set("q", "*:*");
9  query.setQuery("手机");
10  // 分页条件
11  query.setStart(0);
12  query.setRows(30);
13  // 设置默认搜索域
14  query.set("df""item_keywords");
15  // 设置高亮
16  query.setHighlight(true);
17  // 高亮显示的域
18  query.addHighlightField("item_title");
19  query.setHighlightSimplePre("<div>");
20  query.setHighlightSimplePost("</div>");
21  // 执行查询,得到一个Response对象
22  QueryResponse response = solrServer.query(query);
23  // 取查询结果
24  SolrDocumentList solrDocumentList = response.getResults();
25  // 取查询结果总记录数
26  System.out.println("查询结果总记录数:" + solrDocumentList.getNumFound());
27  for (SolrDocument solrDocument : solrDocumentList) {
28    System.out.println(solrDocument.get("id"));
29    // 取高亮显示
30    Map<StringMap<StringList<String>>> highlighting = response.getHighlighting();
31    List<String> list = highlighting.get(solrDocument.get("id")).get("item_title");
32    String itemTitle = "";
33    if (list != null && list.size() > 0) {
34      itemTitle = list.get(0);
35    } else {
36      itemTitle = (String) solrDocument.get("item_title");
37    }
38    System.out.println(itemTitle);
39    System.out.println(solrDocument.get("item_sell_point"));
40    System.out.println(solrDocument.get("item_price"));
41    System.out.println(solrDocument.get("item_image"));
42    System.out.println(solrDocument.get("item_category_name"));
43    System.out.println("=============================================");
44  }
45}



4
Solr服务器中的后台数据处理


这个其实是通过图形界面操作,只需手动填写查询条件,不需要进行代码处理。但是实际项目开发中,还是需要进行代码编写的。


Solr的工作原理以及如何管理索引库


4.1 solr的基础语法


 1q  查询的关键字,此参数最为重要,例如,q=id:1,默认为q=*:*,
2
3fq  (filter query)过虑查询,提供一个可选的筛选器查询。
4        返回在q查询符合结果中同时符合的fq条件的查询结果
5
6sort  排序方式,例如id  desc 表示按照 “id” 降序
7
8  
9start  返回结果的第几条记录开始,一般分页用,默认0开始
10
11rows  指定返回结果最多有多少条记录,默认值为 10,配合start实现分页
12
13fl  指定返回哪些字段,用逗号或空格分隔,注意:字段区分大小写,例如,fl= id,title,sort
14
15df   默认的查询字段,一般默认指定
16  
17wt  (writer type)指定输出格式,有 xml, json, php
18
19indent   返回的结果是否缩进,默认关闭
20
21hl 高亮
22    hl.fl  设定高亮显示的字段
23    hl.requireFieldMatch   如果置为true,除非用hl.fl指定了该字段,查询结果才会被高亮。它的默认值是false
24
25   hl.usePhraseHighlighter   如果一个查询中含有短语(引号框起来的)那么会保证一定要完全匹配短语的才会被高亮。
26
27      hl.highlightMultiTerm如果使用通配符和模糊搜索,那么会确保与通配符匹配的term会高亮。默认为false,同时hl.usePhraseHighlighter要为true
28
29      hl.fragsize   返回的最大字符数。默认是100.如果为0,那么该字段不会被fragmented且整个字段的值会被返回。





进入IT高薪圈,选万和!

不用担心自己零基础

不用担心自己不适合

不用担心如何选课程


扫一扫申请免费课程



点击“ 阅读原文”,申请免费课程

以上是关于Solr的工作原理以及如何管理索引库的主要内容,如果未能解决你的问题,请参考以下文章

#徐员外#Solr搜索 代码实现

solr索引基本原理

solr索引基本原理

solr 学习片段

solr分布式索引实战分片配置读取:工具类configUtil.java,读取配置代码片段,配置实例

JAVAEE——Solr:安装及配置后台管理索引库 使用SolrJ管理索引库仿京东的电商搜索案例实现