Solr的原理及使用

article/2025/9/18 21:25:08

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且整个字段的值会被返回。


http://chatgpt.dhexx.cn/article/75x9k2GD.shtml

相关文章

Solr原理剖析

一、简介 Solr是一个高性能、基于Lucene的全文检索服务器。Solr对Lucene进行了扩展&#xff0c;提供了比Lucene更为丰富的查询语言&#xff0c;并实现了强大的全文检索功能、高亮显示、动态集群&#xff0c;具有高度的可扩展性。同时从Solr 4.0版本开始&#xff0c;支持SolrCl…

solr的基本原理

solr介绍&#xff1a; solr是一个全局检索引擎&#xff0c;能够快速地从大量的文本数据中选出你所需要的数据&#xff0c;而你只需要提供相应的关键词进行检索。solr的高效率查询靠的是底层强大的索引库&#xff0c;所以solr最关键的技术也是其底层的索引设计。solr工作的时候可…

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

Solr 什么是Solr Solr是一个开源搜索平台&#xff0c;用于构建搜索应用程序。 它建立在Lucene(全文搜索引擎)之上。 Solr是企业级的&#xff0c;快速的和高度可扩展的。 使用Solr构建的应用程序非常复杂&#xff0c;可提供高性能。 为了在CNET网络的公司网站上添加搜索功能&…

Solr(一) Solr 简介及搜索原理

一、 Solr 简介 1 为什么使用 Solr 在海量数据下&#xff0c;对 MySQL 或 Oracle 进行模糊查询或条件查询的效率是很低的。而搜索功能在绝大多数项目中都是必须的&#xff0c;如何提升搜索效率是很多互联网项目必须要考虑的问题。 既然使用关系型数据库进行搜索效率比较低&a…

UML入门以及Plant UML工具介绍

简介 UML&#xff0c;Unified Modeling Language&#xff0c;可视化的统一建模语言&#xff0c;是一种开放的方法&#xff0c;用于说明、可视化、构建和编写一个正在开发的、面向对象的、软件密集系统的制品的开放方法。而非程序设计语言&#xff0c;支持从需求分析开始的软件…

UML工具 Astah Professional8.0下载

UML工具 Astah Professional8.0下载 开头功能特性使用方法 文件下载链接 开头 由于Astah目前社区版被取消了&#xff0c;在这提供Professional 8.0版本。 Astah官网&#xff1a;https://astah.net/ 功能特性 1、在一个工具中做所有事情 不要为每个工作阶段切换工具。 做UML设…

免费 UML 工具

选取了四款UML工具: astah 经常看到网上的黄色背景就是这个软件画的,最后一个免费的社区版本是:astah community 7.2 安装包大小50M 以下三个均为免费版本: Software Ideas Modeler 可以画序列图,安装包很小,只有十几兆,而且提供便携版下载 Modelio 这是一个大型的…

十二个开源UML工具

本文将为您介绍12个优秀的UML工具&#xff1a; 1. StarUML StarUML(简称SU)&#xff0c;是一种创建UML类图&#xff0c;是一种生成类图和其他类型的统一建模语言(UML)图表的工具。StarUML是一个开源项目之一发展快、灵活、可扩展性强(zj)。 2. Netbeans UML Plugin 目前支持&…

UML工具Visual Paradigm入门:业务流程建模 (BPM) 教程

Visual Paradigm是包含设计共享、线框图和数据库设计新特性的企业项目设计工具。现在你只需要这样单独的一款模型软件 Visual Paradigm就可以完成用UML设计软件&#xff0c;用BPMN去执行业务流程分析&#xff0c;用ERD企业设计数据库的任务。Visual Paradigm现已加入在线订购&a…

UML图及UML工具使用技巧

转自&#xff1a;UML图及UML工具使用技巧 Rational Rose 2003 之“Rational License key error”问题的解决方案 大家对UML这个可视化的建模语言应该不在陌生了。五种关系、九种图是UML的核心组成元素&#xff0c;而Rational Rose 是实现这些关系、图的重要工具。工具的重要性…

推荐Ubuntu使用UML工具-Drawio

最近在找一个免费的&#xff0c;漂亮的又能在ubuntu上使用的uml工具 先上一张图 网上搜索可以使用命令安装&#xff0c;个人没使用过 sudo snap install drawiosnap官网介绍&#xff1a;https://snapcraft.io/drawio 个人推荐直接在github直接下载最新版本的安装包 drawio的…

小瞥linux下UML工具

原文地址&#xff1a;https://blog.csdn.net/wangdingqiaoit/article/details/11991459 学习设计模式时&#xff0c;希望能好好练习类图&#xff0c;因此需要UML工具&#xff0c;linux下有很多uml工具&#xff0c;这里小瞥一眼&#xff0c;做个了解&#xff0c;并不打算并不全…

c++源码逆向UML工具踩坑

最近考虑走读一些源码&#xff0c;需要对源码类图结构关系首先有个大概了解&#xff0c;否则实在啃不下去&#xff0c;研究了几款逆向工具 个人MAC机&#xff0c;CSDN明确有几款&#xff0c;包括EA, starUML&#xff0c;Rational Rose &#xff0c;Visual Paradigm 试了下Cr…

UML工具(1)-Umbrello

1、UML是统一建模语言&#xff0c;是一种可视化的语言。 2、各类工具对比。 工具名称 优点 缺点 Rational Rose 功能全&#xff0c;可以正向和逆向工程 收费&#xff0…

Uml工具StarUML破解

1、下载安装包 地址&#xff1a;http://staruml.io/download 2、安装&#xff0c;很简单&#xff0c;双击下载的包就可以安装了 3、破解&#xff08;这里需要Nodejs的环境&#xff0c;如果你不是个程序员&#xff0c;没有环境&#xff0c;就先装个环境&#xff09; 3.1 安装…

免费的UML工具

今天我想介绍一个100%完全免费的UML工具, 请不要认为Visual Paradigm Community Edition是一个免费工具,你猜它不够好 事实上,它多次获得国际奖项 - 其一个中国际奖项甚至击败IBM和 Borland国际震动奖(Jolt Award) Download Here在这里下载 Visual Paradigm社区版 - 免费的 U…

免费且好用的UML工具推荐

免费且好用的UML工具推荐 1、引言 统一建模语言(Unified Modeling Language&#xff0c;UML)是一种为面向对象系统的产品进行说明、可视化和编制文档的一种标准语言&#xff0c;是非专利的第三代建模和规约语言。UML使用面向对象设计的的建模工具&#xff0c;但独立于任何具体…

UML建模工具

1、不收费的 编号软件名称软件连接备注1draw.io2eclipse的3亿图4Papyrushttp://www.eclipse.org/papyrus1、 支持UML 2.5但是UML官方没有UML2.5只有2.5.1&#xff1b;2、绘制UML 用例图当前个人没找到系统边界5StartUML6jetumlhttps://www.jetuml.org/ 2、收费的&#xff08;…

用于敏捷开发的免费 UML 工具 2022

敏捷时代的UML&#xff1a;为什么它仍然有意义&#xff1f; 它取决于目标系统的大小和复杂性&#xff1a; 建造一个狗屋可以由一个人完成。它涉及一个简单的过程&#xff0c;使用诸如钉子、锤子、锯子、胶带等基本工具执行。在几个小时内&#xff0c;您就可以为狗建造一座房子…

UML工具

UML 工具 draw.io desktop (https://www.draw.io/) wiki中插件draw.ioprocessonplantuml idea插件(代码生成)graphvizyEd 架构图 定义&#xff1a;描述系统的业务/服务之间的逻辑关系 技巧&#xff1a;1. 虚线划分边界 2.颜色表示状态/角色 3.同一角色背景色相同 4.核心交互…