JAVA语言之Solr的工作原理以及如何管理索引库
赵泽红 2019-04-10 来源 : 阅读 521 评论 0

摘要:本文主要向大家介绍了JAVA语言之Solr的工作原理以及如何管理索引库,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。

本文主要向大家介绍了JAVA语言之Solr的工作原理以及如何管理索引库,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。

JAVA语言之Solr的工作原理以及如何管理索引库

1. Solr的简介

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

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

JAVA语言之Solr的工作原理以及如何管理索引库

2. 工作原理

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

假设有两篇文章1和2:

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

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

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

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

文章1:

JAVA语言之Solr的工作原理以及如何管理索引库

文章2:

JAVA语言之Solr的工作原理以及如何管理索引库

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

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

JAVA语言之Solr的工作原理以及如何管理索引库

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

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

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

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

JAVA语言之Solr的工作原理以及如何管理索引库

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

3. 使用SolrJ管理索引库

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

3.1 添加文档

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

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

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

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

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

第六步:提交。

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

3.2 删除文档

3.2.1 根据id删除

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

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

第三步:提交。

@Testpublic void deleteDocumentById() throws Exception {
  SolrServer solrServer = new HttpSolrServer(""http://101.132.69.111:8080/solr/collection1"");
  solrServer.deleteById(""123"");  // 提交
  solrServer.commit();
}

3.2.2 根据查询删除

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

3.3 查询索引库

第一步:创建一个SolrServer对象

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

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

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

5 取查询结果。

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

3.3.1 简单查询

@Testpublic void queryDocument() throws Exception {    // 第一步:创建一个SolrServer对象
    SolrServer solrServer = new HttpSolrServer(""http://101.132.69.111:8080/solr/collection1"");    // 第二步:创建一个SolrQuery对象。
    SolrQuery query = new SolrQuery();    // 第三步:向SolrQuery中添加查询条件、过滤条件。。。
    query.setQuery(""*:*"");    // 第四步:执行查询。得到一个Response对象。
    QueryResponse response = solrServer.query(query);    // 第五步:取查询结果。
    SolrDocumentList solrDocumentList = response.getResults();
    System.out.println(""查询结果的总记录数:"" + solrDocumentList.getNumFound());    // 第六步:遍历结果并打印。    for (SolrDocument solrDocument : solrDocumentList) {
      System.out.println(solrDocument.get(""id""));
      System.out.println(solrDocument.get(""item_title""));
      System.out.println(solrDocument.get(""item_price""));
    }
}

3.3.2 带高亮显示

@Testpublic void searchDocumet() throws Exception {  // 创建一个SolrServer对象
  SolrServer solrServer = new HttpSolrServer(""http://101.132.69.111:8080/solr/collection1"");  // 创建一个SolrQuery对象
  SolrQuery query = new SolrQuery();  // 设置查询条件、过滤条件、分页条件、排序条件、高亮  // query.set(""q"", ""*:*"");
  query.setQuery(""手机"");  // 分页条件
  query.setStart(0);
  query.setRows(30);  // 设置默认搜索域
  query.set(""df"", ""item_keywords"");  // 设置高亮
  query.setHighlight(true);  // 高亮显示的域
  query.addHighlightField(""item_title"");
  query.setHighlightSimplePre("""");
  query.setHighlightSimplePost("""");  // 执行查询,得到一个Response对象
  QueryResponse response = solrServer.query(query);  // 取查询结果
  SolrDocumentList solrDocumentList = response.getResults();  // 取查询结果总记录数
  System.out.println(""查询结果总记录数:"" + solrDocumentList.getNumFound());  for (SolrDocument solrDocument : solrDocumentList) {
    System.out.println(solrDocument.get(""id""));    // 取高亮显示
    Map<String, Map<String, List>> highlighting = response.getHighlighting();
    List list = highlighting.get(solrDocument.get(""id"")).get(""item_title"");
    String itemTitle = """";    if (list != null && list.size() > 0) {
      itemTitle = list.get(0);
    } else {
      itemTitle = (String) solrDocument.get(""item_title"");
    }
    System.out.println(itemTitle);
    System.out.println(solrDocument.get(""item_sell_point""));
    System.out.println(solrDocument.get(""item_price""));
    System.out.println(solrDocument.get(""item_image""));
    System.out.println(solrDocument.get(""item_category_name""));
    System.out.println(""============================================="");
  }
}

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

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

JAVA语言之Solr的工作原理以及如何管理索引库

4.1 solr的基础语法

q  查询的关键字,此参数最为重要,例如,q=id:1,默认为q=*:*,

fq  (filter query)过虑查询,提供一个可选的筛选器查询。
        返回在q查询符合结果中同时符合的fq条件的查询结果

sort  排序方式,例如id  desc 表示按照 “id” 降序

  
start  返回结果的第几条记录开始,一般分页用,默认0开始

rows  指定返回结果最多有多少条记录,默认值为 10,配合start实现分页

fl  指定返回哪些字段,用逗号或空格分隔,注意:字段区分大小写,例如,fl= id,title,sort

df   默认的查询字段,一般默认指定
  
wt  (writer type)指定输出格式,有 xml, json, php等

indent   返回的结果是否缩进,默认关闭

hl 高亮
    hl.fl  设定高亮显示的字段
    hl.requireFieldMatch   如果置为true,除非用hl.fl指定了该字段,查询结果才会被高亮。它的默认值是false。

   hl.usePhraseHighlighter   如果一个查询中含有短语(引号框起来的)那么会保证一定要完全匹配短语的才会被高亮。

    hl.highlightMultiTerm如果使用通配符和模糊搜索,那么会确保与通配符匹配的term会高亮。默认为false,同时hl.usePhraseHighlighter要为true。

    hl.fragsize   返回的最大字符数。默认是100.如果为0,那么该字段不会被fragmented且整个字段的值会被返回。

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注编程语言JAVA频道!

本文由 @职坐标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论
本文作者 联系TA

行是知之始,知是行之成,知行合一,方能大成。

  • 10
    文章
  • 1280
    人气
  • 100%
    受欢迎度

已有2人表明态度,100%喜欢该老师!

进入TA的空间
名师指导直通车
  • 资料索取
    资料索取
  • 答疑解惑
    答疑解惑
  • 技术交流
    技术交流
  • 职业测评
    职业测评
  • 面试技巧
    面试技巧
  • 高薪秘笈
    高薪秘笈
TA的其他文章 更多>>
JAVA语言之Spring知识复习
经验技巧 0% 的用户喜欢
JAVA语言之mysql表锁、行锁、索引之间暧昧的关系
经验技巧 0% 的用户喜欢
JAVA语言之Git内部原理之Git引用
经验技巧 0% 的用户喜欢
JAVA语言之Java 11 正式发布,这 8 个逆天新特性教你写出更牛逼的代码
经验技巧 0% 的用户喜欢
JAVA语言之Spring Boot(十三)RabbitMQ安装与集成
经验技巧 0% 的用户喜欢
其他海同名师 更多>>
刘新华
刘新华 联系TA
实力型。激情饱满,对专业充满热情
吴翠红
吴翠红 联系TA
独创“教、学、练、测”循环教学模式
吕益平
吕益平 联系TA
熟悉企业软件开发的产品设计及开发
黄泽民
黄泽民 联系TA
擅长javase核心技术
程钢
程钢 联系TA
擅长大型企业商业网站开发和管理
经验技巧30天热搜词 更多>>

您输入的评论内容中包含违禁敏感词

我知道了

X
免费获取海同IT培训资料
验证码手机号,获得海同独家IT培训资料
获取验证码
提交

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    ICP许可  沪B2-20190160

站长统计