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

2.工作原理
solr是基于Lucence开发的企业级搜索引擎技术,而lucence的原理是倒排索引。那么什么是倒排索引呢?接下来我们就介绍一下lucence倒排索引原理。
假设有两篇文章1和2:
文章1的内容为:老超在卡子门工作,我也是。
文章2的内容为:小超在鼓楼工作。
由于lucence是基于关键词索引查询的,那我们首先要取得这两篇文章的关键词。如果我们把文章看成一个字符串,我们需要取得字符串中的所有单词,即分词。分词时,忽略”在“、”的“之类的没有意义的介词,以及标点符号可以过滤。
我们使用Ik Analyzer实现中文分词,分词之后结果为:
文章1:

文章2:

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

通常仅知道关键词在哪些文章中出现还不够,我们还需要知道关键词在文章中出现次数和出现的位置,通常有两种位置:
a.字符位置,即记录该词是文章中第几个字符(优点是关键词亮显时定位快);
b.关键词位置,即记录该词是文章中第几个关键词(优点是节约索引空间、词组(phase)查询快),lucene中记录的就是这种位置。
加上出现频率和出现位置信息后,我们的索引结构变为:

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

3.使用SolrJ管理索引库
使用SolrJ可以实现索引库的增删改查操作。
3.1 添加文档
第一步:把solrJ的jar包添加到工程中。
第二步:创建一个SolrServer,使用HttpSolrServer创建对象。
第三步:创建一个文档对象SolrInputDocument对象。
第四步:向文档中添加域。必须有id域,域的名称必须在schema.xml中定义。
第五步:把文档添加到索引库中。
第六步:提交。

public voidtestSolrJAdd() throws SolrServerException, IOException {
// 创建一个SolrServer对象。创建一个HttpSolrServer对象
// 需要指定solr服务的url
SolrServer solrServer = newHttpSolrServer( "http://101.132.69.111:8080/solr/collection1");
// 创建一个文档对象SolrInputDocument
SolrInputDocument document= newSolrInputDocument();
// 向文档中添加域,必须有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删除的方法。
第三步:提交。

publicvoiddeleteDocumentById()throwsException {
SolrServer solrServer = newHttpSolrServer( "http://101.132.69.111:8080/solr/collection1");
solrServer.deleteById( "123");
// 提交
solrServer.commit();
}

3.2.2 根据查询删除

publicvoiddeleteDocumentByQuery()throwsException {
SolrServer solrServer = newHttpSolrServer( "http://101.132.69.111:8080/solr/collection1");
//这边会根据分词去删
solrServer.deleteByQuery( "item_title:红米手机");
solrServer.commit();
}

3.3 查询索引库
第一步:创建一个SolrServer对象
第二步:创建一个SolrQuery对象。
第三步:向SolrQuery中添加查询条件、过滤条件。
第四步:执行查询。得到一个Response对象。
第五步:取查询结果。
第六步:遍历结果并打印。

3.3.1 简单查询

publicvoidqueryDocument() throws Exception {
// 第一步:创建一个SolrServer对象
SolrServer solrServer = newHttpSolrServer( "http://101.132.69.111:8080/solr/collection1");
// 第二步:创建一个SolrQuery对象。
SolrQuery query = newSolrQuery();
// 第三步:向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 带高亮显示

public voidsearchDocumet() throws Exception {
// 创建一个SolrServer对象
SolrServer solrServer = newHttpSolrServer( "http://101.132.69.111:8080/solr/collection1");
// 创建一个SolrQuery对象
SolrQuery query = newSolrQuery();
// 设置查询条件、过滤条件、分页条件、排序条件、高亮
// 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( "<div>");
query.setHighlightSimplePost( "</div>");
// 执行查询,得到一个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< String>>> highlighting = response.getHighlighting();
List< String> list = highlighting. get(solrDocument. get( "id")). get( "item_title");
StringitemTitle = "";
if(list != null&& list.size() > 0) {
itemTitle = list. get( 0);
} else{
36itemTitle = ( 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"));
}

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

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

Solr的原理及使用相关推荐

  1. Java Solr:(二)Solr 搜索原理

    Solr 搜索原理 1.搜索原理 2.Solr 中数据存储说明 1.搜索原理 Solr 能够提升检索效率的主要原因就是分词和索引(反向索引). 分词:会对搜索条件/存储内容进行分词,分成日常所使用的词 ...

  2. Solr架构原理相关

    Solr的工作原理以及如何管理索引库 https://blog.csdn.net/qq_41717874/article/details/84026286 Solr工作原理 https://blog. ...

  3. 二、Solr搜索原理

    1.搜索原理 Solr能够提升检索效率的主要原因就是分词和索引(反向索引,通过). 分词:会对搜索条件/存储内容进行分词,分成日常所使用的词语. 索引:存储在Solr中内容会按照程序员的要求来是否建立 ...

  4. 理解solr工作原理:lucene

    文章目录 1, 下载lucene, 获取demo相关jar包 2, 源代码实现明细 org.apache.lucene.demo.IndexFiles : StandardAnalyzer index ...

  5. Solr核心原理倒排索引

    1.倒排索引基本概念 文档(Document):一般搜索引擎的处理对象是互联网网页,而文档这个概念要更宽泛些,代表以文本形式存在的存储对象,相比网页来说,涵盖更多种形式,比如Word,PDF,html ...

  6. Solr的工作原理(最直白的解释,简单易懂)懂?

    Solr 什么是Solr Solr是一个开源搜索平台,用于构建搜索应用程序. 它建立在Lucene(全文搜索引擎)之上. Solr是企业级的,快速的和高度可扩展的. 使用Solr构建的应用程序非常复杂 ...

  7. 【Solr空间搜索SpatialSearch】

    喂,这几个单词什么意思,你晓得伐 名词 含义 longitude 经度 latitude 纬度 LatLon 纬度经度的缩写 Grid 网格 空间搜索 空间搜索,又名Spatial Search(Sp ...

  8. Solr简介,功能,特性

    1,什么是solr? Solr是一个独立的企业级搜索应用服务器,他对外提供类似于Web-service的API接口.用户可以通过http请求,向搜索引擎服务提供一定格式的xml文件,生成索引:也可以通 ...

  9. 【solr】solr介绍

    什么是Solr Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器.Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置.可扩展,并对索引 ...

  10. 搜索解决方案Solr

    网页右边,向下滑有目录索引,可以根据标题跳转到你想看的内容 如果右边没有就找找左边 Solr Solr是基于Apache Lucene构建的用于搜索和分析的开源解决方案.可提供可扩展索引.搜索功能.高 ...

最新文章

  1. 机器学习入门(21)— 感受野概念
  2. pyhanlp 分词与词性标注
  3. Establishing SSL connection without server's identity verification is not recommended.
  4. linux 二级域名设置
  5. ssl1615-Frogger【图论,最小生成树,并查集】
  6. 一个快速生成元素背景的 React 组件
  7. 独家对话谢宝友:做一款类似于 Linux 的国产操作系统 | 人物志
  8. 40 MM配置-采购-采购订单-STO配置-定义凭证类型和可用性检查设置
  9. 联合光伏:雨后复斜阳 关山阵阵苍
  10. php tokenizer获取所有类,PHP Tokenizer 学习笔记
  11. mysql sql
  12. python用schedule库实现定时功能,可每天定时运行程序。
  13. debian9修改只读文件内容
  14. 用python画小仓鼠代码,用python画小仓鼠教程
  15. 软考备战:软考中级课程+参考资料
  16. 谷歌钦定的编程语言Kotlin大揭秘
  17. 单片机和plc的区别
  18. R关于一些字符串报错
  19. 攻防世界新手区misc 掀桌子
  20. 为了弄个微信公众号也是操碎了心,欢迎关注”恐漫屋“

热门文章

  1. python 获取foobar2000官网全部插件
  2. 动软代码生成器使用心得
  3. html5rpg游戏策划案,HTML 5开发RPG游戏之一(地图人物实现)
  4. 电子技术实训——多功能数字钟的设计
  5. 基于神经网络的文本特征提取——从词汇特征表示到文本向量
  6. 态密度(PDOS)曲线和声子色散曲线(PDC)之间的关系
  7. 基于JSP的旅游信息管理系统(含论文)
  8. win10系统键盘失灵怎么解决
  9. 最经典的大数据案例解析(附代码)
  10. 前后端开发接口文档模板(登录、注册、项目发布与需求发布)