Spring Data Solr教程:Solr简介

大多数应用程序必须具有某种搜索功能。 问题在于搜索功能通常是巨大的资源消耗,它们可能通过给数据库造成沉重的负担而破坏我们应用程序的性能。 因此,将负载转移到外部搜索服务器是个好主意。

这是我的Spring Data Solr教程的第一部分。 在本教程中,我们将对todo应用程序实现搜索功能,这是我的Spring MVC Test教程的示例应用程序。

我们搜索功能的要求很简单。 它必须返回一个待办事项列表,其标题或说明包含使用的搜索词。 搜索结果
页面还必须提供指向用于查看待办事项信息的页面的链接。

在开始执行搜索功能之前,我们需要看一下Solr搜索服务器。 此博客条目为我们提供了有关Solr的基本信息,分为三个部分:

  • 第一部分为我们简要介绍了Solr及其数据模型。
  • 第二部分描述了如何为Solr实例创建模式。
  • 最后一部分描述了如何使用Solr提供的类似REST的HTTP API。

让我们开始吧。

Solr简介

首先让我们简要介绍一下Solr搜索服务器。 本简介非常薄,仅提供我们需要了解的信息,以了解我们搜索功能的实现。

同样,即使Solr严重依赖Lucene ,此博客条目也没有区别。

本节介绍

  • Solr搜索服务器的数据模型。
  • 将新文档添加到Solr后会发生什么。
  • 对索引数据执行搜索查询时会发生什么。

数据模型

索引由本质上是字段集合的文档组成。 如果我们将此数据模型与关系数据库的数据模型进行比较,则会发现以下相似之处:

  • 索引与数据库表大致相同。
  • 文档与数据库表的一行相似。
  • 字段的含义与数据库表的列相同。

文档的每个字段都可以被索引存储或两者都被索引 。 这些术语的含义如下所述:

  • 索引字段是可搜索和可排序的字段。 在搜索结果中不返回索引字段。
  • 存储的字段是在搜索结果中返回其值的字段。
  • 如果一个字段既被索引又被存储 ,则该字段既可搜索又可排序。 其值也会在搜索结果中返回。

向索引添加信息

将新文档添加到Solr后,以不同的方式处理索引字段和存储字段。 下面描述了这种差异:

  • 索引字段经过分析阶段,该阶段通常将文本分解为单词并对其应用不同的转换。 该分析阶段的结果将保存到Solr索引中。
  • 存储的字段的值按原样保存。

从索引中搜索信息

搜索功能可分为以下三个步骤:

  • 通常,搜索查询所经历的分析阶段与索引字段相似。 这样做的目的是确保搜索查询与索引的内容匹配。
  • Solr使用其索引执行搜索。
  • 匹配的文档以请求的格式返回。 每个文档都包含其存储字段的值。

创建模式

该架构用于配置以下内容:

  • 文档的字段。
  • 将新文档添加到索引时,如何处理文档的字段。
  • 对索引执行搜索时如何处理字段。

该模式是在名为schema.xml的文件中配置的,我们可以按照以下步骤为我们的应用程序创建模式:

  1. 配置使用的字段类型。
  2. 配置我们文档的字段。
  3. 配置复制字段。
  4. 配置文档的唯一键字段。

在以下小节中将更详细地描述这些步骤。 Solr实例的框架架构如下所示:

<?xml version="1.0" encoding="UTF-8" ?>
<schema name="todo" version="1.5"><fields><!-- Configure fields here --></fields><!-- Configure unique key --><!-- Configure copy fields here --><types><!-- Configure field types here --></types>
</schema>

注意 :本节描述了我的博客条目“ 使用Maven运行Solr ”的示例应用程序的架构。

配置字段类型

字段类型指定以下内容:

  • 字段的数据类型。
  • 将信息添加到索引后如何对其进行分析。
  • 从索引中搜索信息时如何处理信息。

我们可以使用fieldType元素配置字段类型。 下面描述了在我们的模式中使用的其属性:

  • name属性说明字段类型的名称。 它基本上是一个别名,用于声明字段的类型。
  • class属性声明实现所涉及字段类型的类。
  • sortMissingLast属性指定当缺少此字段的值时如何进行排序。 如果此属性的值设置为“ true”,则最后返回在相关字段中没有值的文档。
  • positionIncrementGap属性声明在同一文档的多个字段之间放置的空白空间。 此属性的值用于多值字段,其思想是防止跨不同字段的错误匹配。
  • precisionStep属性用于数字字段的范围查询。 通过阅读NumericRangeQuery类的API文档,我们可以获得有关此信息的更多信息。

我们可以按照以下步骤配置架构的字段类型:

  1. 配置长字段的字段类型
  2. 配置字符串字段的字段类型
  3. 为包含文本的字段配置字段类型

下面将更详细地描述这些步骤。

配置长字段的字段类型

让我们从为未在索引或搜索阶段进行分析的长字段配置简单字段类型开始。 我们可以按照以下步骤配置此字段类型:

  1. 将字段类型的名称设置为“ long”。
  2. 将实现的名称设置为“ solr.TrieLongField”。
  3. precisionStep属性的值设置为零。
  4. positionIncrementGap属性的值设置为零。

我们的字段类型声明如下所示:

<fieldType name="long" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0"/>

配置字符串字段的字段类型

下一步是为在索引或搜索阶段未分析的字符串字段配置简单的字段类型。 我们可以按照以下步骤配置此字段类型:

  1. 将字段类型的名称设置为“字符串”。
  2. 将实现的名称设置为“ solr.StrField”。
  3. sortMissingLast属性的值设置为'true'。

我们的字符串字段的声明如下所示:

<fieldType name="string" class="solr.StrField" sortMissingLast="true" />

为包含文本的字段配置字段类型

最后一步是配置text_general字段类型。 我们可以按照以下步骤进行操作:

  1. 创建一个新的字段类型。 将字段类型的名称设置为“ text_general”。 将实现的名称设置为“ solr.TextField”。 将positionIncrementGap的值设置为100。
  2. 创建一个在索引时间运行的新分析器。 使用Unicode文本分段算法的分词规则配置将文本分成单词。 创建一个过滤器,以从文本中删除从stopwords.txt文件中找到的单词。 将文本转换为小写。
  3. 创建一个在查询阶段运行的新分析器。 配置使用Unicode文本分段算法的分词规则将搜索查询分解为多个词 。 创建一个过滤器,以从搜索查询中删除从stopwords.txt文件中找到的单词。 确保已应用从onymous.txt找到的同义词 。 将搜索查询转换为小写。

text_general字段类型的声明如下所示:

<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100"><!-- Configures the analysis done at the index phase --><analyzer type="index"><!-- Uses word break rules of the Unicode Text Segmentation algorith when splitting text into words. --><tokenizer class="solr.StandardTokenizerFactory"/><!-- Removes words found from stopwords.txt file. This filter is case insensitive. --><filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" /><!-- Transforms text to lower case --><filter class="solr.LowerCaseFilterFactory"/></analyzer><!-- Configures the analysis done at the query time --><analyzer type="query"><!-- Uses word break rules of the Unicode Text Segmentation algorith when splitting text into words. --><tokenizer class="solr.StandardTokenizerFactory"/><!-- Removes words found from stopwords.txt file. This filter is case insensitive. --><filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" /><!-- Applies synonyms found from the synonyms.txt file. --><filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/><!-- Transforms text to lower case --><filter class="solr.LowerCaseFilterFactory"/></analyzer>
</fieldType>

通过阅读以下文档,我们可以获得有关分析阶段的更多信息:

  • 分析器,令牌生成器和令牌过滤器 。

配置文档的字段

我们可以通过向schema.xml文件中添加字段元素来向文档中添加新字段。 字段元素具有许多属性,但是在这一点上,我们需要了解以下属性的含义:

  • name属性指定字段的名称。
  • 索引属性(true / false)指定是否将字段添加到搜索索引中。 只有索引字段是可搜索和可排序的。
  • 存储的属性(true / false)指定是否应在搜索结果中返回该字段。
  • multiValued (true / false)指定该字段是否可以在文档中多次出现。
  • type type属性指定字段的类型。
  • 必填项 (是/否)指定是否需要该字段。

为了最大程度地发挥Solr实例的性能,我们必须遵循以下准则:

  • 我们不应存储搜索结果中不需要的字段。
  • 我们不应该为搜索功能未使用的字段建立索引。

通过阅读以下文档,我们可以获得有关最佳现场配置的更多信息:

  • 用例的字段选项
  • Solr性能因素

现在,我们准备配置架构的实际字段。 让我们先谈谈我们需要在搜索结果页面上显示的信息。 下面描述了此信息:

  • 我们需要待办事项条目的ID,用于创建指向视图待办事项条目页面的链接。
  • 我们需要待办事项的标题,该标题用作已创建链接的锚文本。

当我们知道我们的应用程序必须能够搜索待办事项条目的标题和描述的内容时,可以按照以下步骤将所需字段添加到我们的模式中:

  1. 在架构中添加一个名为“ id”的必填字段,并将其类型设置为“ string”。 确保同时索引和存储该字段。 将multiValued属性的值设置为false。
  2. 在模式中添加一个名为“ title”的必填字段,并将其类型添加至“ text_general”。 将该字段配置为既索引又存储。 将多值属性的值设置为false。
  3. 添加一个名为“描述”的字段,该模式将其类型设置为“ text_general”。 配置此字段为索引但不存储。 将multiValued属性的值设置为false。
  4. 添加一个名为“ text”的字段,并将其类型设置为“ text_general”。 配置此字段为索引但不存储。 将其multiValue属性的值设置为true。 该字段是存储所有其他索引文本字段的内容的字段。
  5. 添加一个名为“ _version_”的字段,并将其类型设置为“ long”。 配置此字段以进行索引和存储。

我们的字段声明如下所示:

<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
<field name="title" type="text_general" indexed="true" stored="true" required=“true” multiValued="false"/>
<field name="description" type="text_general" indexed="true" stored="false" multiValued="false"/>
<field name="text" type="text_general" indexed="true" stored="false" multiValued="true"/>
<field name="_version_" type="long" indexed="true" stored="true"/>

配置复制字段

我们使用复制字段将标题描述字段的内容复制到文本字段。 我们可以使用copyField元素配置复制字段。 我们可以按照以下步骤创建所需的配置:

  1. 创建一个复制字段,将“标题”字段的值复制到“文本”字段。
  2. 创建一个复制字段,将“说明”字段的值复制到“文本”字段。

我们的复制字段的声明如下所示:

<copyField source="title" dest="text"/>
<copyField source="description" dest="text"/>

配置文档的唯一键字段

唯一键是一个字段,该字段对于所有文档都是唯一的。 指定文档的唯一键不是强制性的,但是如果我们决定这样做,则意味着索引不能包含在配置为唯一键的字段中具有相同值的两个文档。

在本例中,我们将字段“ id”用作文档的唯一键。 我们可以通过将以下XML添加到schema.xml文件中来进行此配置:

<uniqueKey>id</uniqueKey>

使用类似REST的HTTP API

Solr提供了类似REST的HTTP API,我们可以使用它来向Solr添加信息并针对其索引执行搜索查询。 下面将描述这两种用例。

注意 :本部分假定我们正在使用我的博客条目“ 运行Solr和Maven”的示例应用程序。

向Solr添加信息

我们可以按照以下步骤向Solr添加新信息:

  1. 将POST请求发送到url'http:// localhost:8983 / solr / update / json?commit = true'。
  2. 将请求的内容类型设置为“ application / json”。
  3. 在请求的正文中以JSON发送添加的信息。

我们的请求正文的内容如下:

[{"id":"1","title":"Write introduction to Solr","description":"This blog entry provides an introduction to Solr search server"},{"id":"2","title":"Implement example application","description":"This application demonstrates the usage of spring-data-solr."}
]

现在,我们使用Solr提供的类似REST的API将两个文档添加到Solr索引中。

但是,很高兴知道还有其他选项可以用来向Solr索引添加信息。 以下文档中介绍了这些选项:

  • POST JSON文档
  • 从数据库导入记录
  • 从CSV文件加载数据
  • 索引二进制文件
  • 使用SolrJ

从Solr索引中搜索信息

现在,我们准备搜索存储在Solr实例索引中的信息。 我们可以按照以下准则对Solr索引执行搜索查询:

  • 通过将GET请求发送到url'http:// localhost:8983 / solr / todo / select'来执行搜索查询。
  • 查询字符串必须设置为q request参数的值。
  • 查询结果的格式必须设置为wt request参数的值。

让我们继续前进,找出如何列出从索引中找到的所有文档,并对索引数据执行简单的搜索查询。

查找索引的所有文档

我们可以按照以下步骤列出所有JSON格式的文档:

  1. 将GET请求发送到网址“ http:// localhost:8983 / solr / todo / select”。
  2. q请求参数的值设置为'*。*'
  3. wt request参数的值设置为'json'。

当我们将GET请求发送到url'http:// localhost:8983 / solr / todo / select?q = *%3A *&wt = json'时,我们应该收到以下JSON:

{"responseHeader": {"status":0,"QTime":1,"params":{"wt":"json","q":"*:*"}},"response":{"numFound":2,"start":0,"docs":[{"id":"1","title":"Write introduction to Solr","_version_":1425949176574771200},{"id":"2","title":"Implement example application","_version_":1425949176662851584}]}
}

从索引中搜索信息

我们可以按照以下步骤搜索标题或描述中包含“申请”一词的所有文档:

  1. 将GET请求发送到网址“ http:// localhost:8983 / solr / todo / select”。
  2. q请求参数的值设置为'application'
  3. wt request参数的值设置为'json'。

当我们发送GET请求到URL'http:// localhost:8983 / solr / todo / select?q = application&wt = json'时,我们应该收到以下JSON:

{"responseHeader":{"status":0,"QTime":7,"params":{"wt":"json","q":"application"}},"response":{"numFound":1,"start":0,"docs":[{"id":"2","title":"Implement example application","_version_":1425949176662851584}]}
}

结束

现在,我们已经获得了理解Spring Data Solr教程的下一部分中描述的概念所需的信息。 这篇博客文章教会了我们三件事:

  • 我们了解Solr数据模型的基础。
  • 我们知道如何配置Solr实例的架构。
  • 我们知道如何使用Solr的HTTP API将文档添加到Solr索引并从中搜索信息。

参考: Spring Data Solr教程:我们的JCG合作伙伴 Petri Kainulainen在Petri Kainulainen博客上对Solr的介绍 。

翻译自: https://www.javacodegeeks.com/2013/05/spring-data-solr-tutorial-introduction-to-solr.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/368517.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Liunx常用的100条命令汇存

1、关机 shutdown -h now 立刻关机 poweroff shutdown -r now 立刻重启 reboot logout 注销2、进入图形界面 startx3、vi编辑器 [vi] [path]/[file]&#xff1b; [i]进入编辑模式&#xff1b; [esc]进入命令模式&#xff1b; [:wq]保存并退出&#xff1b;[:q!]退出…

分布式是什么意思_机架式ups是什么意思?与分布式DPS有何不同之处?

ups电源很多人听过了&#xff0c;主要是让设备在突然断电的情况下遭遇停电的损坏&#xff0c;保障数据及重要程序运行。那么&#xff0c;机架式ups电源可能就是很多人不太了解的了&#xff0c;在说到与分布式DPS有何不同之处那是很少有人清楚了解了&#xff0c;不管怎么说&…

【原】老生常谈-从输入url到页面展示到底发生了什么

刚开始写这篇文章还是挺纠结的&#xff0c;因为网上搜索“从输入url到页面展示到底发生了什么”&#xff0c;你可以搜到一大堆的资料。而且面试这道题基本是必考题&#xff0c;二月份面试的时候&#xff0c;虽然知道这个过程发生了什么&#xff0c;不过当面试官一步步追问下去的…

WebApi在MVC 4中一个Controll多个post方法报错处理

http://blog.csdn.net/lqh4188/article/details/53542400&#xff08;原创&#xff09; 转载于:https://www.cnblogs.com/william-CuiCui0705/p/8023832.html

光耀卡服务器维修,3月28日服务器更新维护公告

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼亲爱的战友&#xff1a;我们将于03月28日08:00-13:00对所有服务器进行更新维护。在此期间无法登录游戏&#xff0c;给大家带来的不便我们深表歉意。- 商城兑换1)无限紫晶幸运箱 限时兑换※使用后必定获得一款限定永久武器※可重复获…

JPA – Hibernate –包级别的类型映射

当我们最终成熟到可以在JPA中使用某些自定义类型映射时&#xff0c;我们通常会停留在某些提供程序特定的解决方案上&#xff0c;因为JPA本身并未定义任何实现此功能的机制。 让我为您展示一个JPA提供程序Hibernate的自定义类型映射定义的示例。 假设我们在项目中使用Joda Money…

关于文件关联的图标不能正常显示

不知道有没有人遇到过这种情况&#xff1a; 这两种情况都是关联的图标不能正常显示&#xff0c;但是可以正常打开。总觉得看着挺碍眼的&#xff0c;就看了下注册表&#xff0c;发现可以用以下方法解决&#xff1a; 打开注册表&#xff0c;[HKEY_CLASSES_ROOT]找到需要修改的文件…

web前端常用知识点

1、常见的块级元素 内联元素 div -最常用的块级元素 dl - 和dt-dd 搭配使用的块级元素 form - 交互表单 h1 -h6- 大标题 hr - 水平分隔线 ol – 有序列表 p - 段落 ul - 无序列表 fieldset - 表单字段集 colgroup-col - 表单列分组元素 table-tr-td 表格及行-单元格 pre - 格…

Android 7.0 fiddler代理抓不到https请求的解决办法

Android 7.0 fiddler代理抓不到https请求的解决办法 解决方法&#xff1a; 1.在源码res目录下新建xml目录&#xff0c;增加network_security_config.xml文件 &#xff08;工程名/app/src/main/res/xml/network_security_config.xml&#xff09;network_security_config.xml文件…

华为畅享8plus停产了吗_牢记华为手机“三不买”原则,不花冤枉钱,选错要吃亏!...

如今华为手机已经占据国内手机市场份额的半壁江山&#xff0c;华为自然也就成为了买手机的首选。那么华为手机真的好吗&#xff1f;我认为应该理性看待&#xff0c;因为每个手机品牌都有好手机也有差手机&#xff0c;其实买华为你只需要牢记“三不买”原则&#xff0c;就可以不…

Spring MVC:MySQL和Hibernate的安全性

Spring有很多不同的模块。 所有这些对于具体目的都是有用的。 今天&#xff0c;我将讨论Spring Security。 该模块提供了灵活的方法来管理访问Web应用程序不同部分的许可。 在这篇文章中&#xff0c;我将研究Spring MVC &#xff0c; Hibernate &#xff0c; MySQL与Spring Sec…

Python 离线 安装requests第三方库

一、介绍 requests是Python的一个HTTP客户端库&#xff0c;跟urllib&#xff0c;urllib2类似&#xff0c;不过requests的优势在于使用简单&#xff0c;相同一个功能&#xff0c;用requests实现起来代码量要少很多。毕竟官方文档都很直白的说&#xff1a; python的标准库urllib2…

JS分页条插件

目标 制作js分页导航jq插件,用于无刷新分页或者刷新分页 实现目标参考京东和天猫的分页条. 有四个固定按钮,前页码,后页码,首页,末页. 程序关键点在于计算中间页面的起止位置.逻辑是以当前页码为参照点,根据需要显示的页码按钮个数,计算参照点前后的页码数量. 当起止点小于1或者…

头同尾合十的算法_乘法速算之首同尾合十

两位数乘两位数中&#xff0c;有一种特殊情况不需要列竖式&#xff0c;可以直接说出答案&#xff0c;那就是“首同尾合十”——十位相同&#xff0c;个位数字之和是10。一、巧算方法前两位&#xff1a;十位数字(十位数字1)&#xff0c;后两位&#xff1a;个位相乘例如&#xff…

Bootstrap定制开发

Bootstrap作为目前很受欢迎的前端框架&#xff0c;越来越多的网站开始使用基于Bootstrap框架进行开发。 1、定制开发方法 &#xff08;1&#xff09;Bootstrap定制开发可以使用LESS和Grunt实现定制化 &#xff08;2&#xff09;在线实现定制化开发&#xff0c;地址为&#x…

JavaFX逆运动学库2.0

这是第一篇讲解javafx-ik的基础教程&#xff0c; javafx-ik是JavaFX的逆运动学库。 该库的源代码可以从GitHub下载。 什么是 图1&#xff1a;单骨 骨骼是使用javafx-ik库进行逆运动学的基本基础。 骨骼具有一定长度和关节&#xff0c;骨骼可以围绕该关节旋转。 具有关节的一端…

html权重值_史上最全的web前端面试题汇总及答案HtmlCss(二)

作者&#xff1a;樱桃小丸子儿链接&#xff1a;https://www.jianshu.com/p/abadcc84e2a4HTML&CSSimg的alt和title的异同&#xff1f;**alt **是图片加载失败时&#xff0c;显示在网页上的替代文字&#xff1b;**title **是鼠标放上面时显示的文字,title是对图片的描述与进一…

解决问题SyntaxError: Unexpected token import

ES6语法的模块导入导出(import/export)功能,我们在使用它的时候&#xff0c;可能会报错&#xff1a; SyntaxError: Unexpected token import 语法错误&#xff1a;此处不应该出现import 我遇到的情况是import语法不识别导致的。在这里&#xff0c;有两种方法可以解决。 1: 使用…

linux下添加用户并赋予root权限

1、添加用户&#xff0c;首先用adduser命令添加一个普通用户&#xff0c;命令如下&#xff1a; #adduser tommy //添加一个名为tommy的用户#passwd tommy //修改密码Changing password for user tommy.New UNIX password: //在这里输入新密码Retype new UNIX password: …

CSS定位机制

css定位机制和css动画变换 css定位机制 定位属性position&#xff08;相生相克&#xff09; 1 static&#xff1a;静态定位 2 relative&#xff1a;相对定位&#xff08;相对于自己原来的位置定位&#xff09; 3. absolute&#xff1a;绝对定位&#xff08;float&#xff09;…