solr in action第三章.docx
- 文档编号:3499060
- 上传时间:2022-11-23
- 格式:DOCX
- 页数:28
- 大小:739.19KB
solr in action第三章.docx
《solr in action第三章.docx》由会员分享,可在线阅读,更多相关《solr in action第三章.docx(28页珍藏版)》请在冰豆网上搜索。
solrinaction第三章
第三章Solr的关键概念
本章涵盖了
•Solr有别于传统的数据库技术是什么
•Solr内部索引的基本结构
•Solr如何执行复杂查询使用术语、短语,和模糊匹配
•Solr如何计算分数匹配查询最相关的文档
•如何平衡返回相关结果和返回所有可能的结果
•如何模型内容到规范化的文档
•Solr跨服务器如何处理数十亿的文档和查询
现在我们已经Solr启动并运行,获得一个基本的了解是很重要的,搜索引擎如何运作,以及为什么你会选择使用Solr存储和检索你的内容。
这一章我们的主要目标是提供理论基础,所以你能理解并最大化使用Solr。
如果你在搜索和信息检索有一个坚实的背景,那么您可能希望跳过这一章的部分或全部,但如果没有,它将帮助你了解更先进主题在这本书和最大化的质量用户的搜索体验
虽然在本章的内容通常是适用于大多数搜索引擎,我们会是特别关注Solr的每个概念的实现。
这一章结尾,你应该有一个坚实的理解Solr的内部索引是如何工作的,Solr如何执行复杂的布尔和模糊查询,Solr的违约相关性如何评分模型作品,Solr的架构使查询保持最快的速度处理数十亿的文件在许多服务器。
让我们开始讨论背后的核心概念在Solr搜索,包括如何搜索索引,搜索引擎如何匹配查询和文档,以及如何Solr使强大的查询功能,以便使寻找内容的问题。
3.1。
搜索、匹配和发现内容
许多不同种类的系统来帮助我们解决具有挑战性的数据存储和存在检索问题:
关系数据库、键值存储-reduce引擎操作在磁盘上的文件,图形数据库,在许多其他人。
搜索引擎,Solr特别有助于解决一个特定类的问题相当well-problems要求能搜索大量的非结构化文本和拉回相关的结果。
在本节中,我们将描述现代搜索引擎的核心功能,包括一个解释一个搜索“文档”,概述反向搜索索引的核心Solr的快速全文搜索功能,和一个广泛的概述如何倒排搜索索引允许任意复杂的词、短语和partial-matching查询。
3.1.1。
一个文档是什么?
我们发布了一些文档Solr在第二章,然后运行示例搜索Solr,所以这不是我们第一次提到的文件。
然而,它是我们充分理解的信息我们可以投入Solr搜索(文档)和如何结构化信息重要的。
Solr文档存储和检索引擎。
每一个数据报Solr处理一个文档。
一个文档可能是报纸的一篇文章中,简历或社会配置文件,或者在极端情况下,整本书。
每个文档包含一个或多个字段,每个被建模为一个特定的领域类型:
字符串,标记化的文本、布尔值、日期/时间,纬度/经度等潜在的数量字段类型是无限的,因为一个字段类型是由零个或多个步骤,分析改变字段中的数据处理和映射到Solr索引。
每个字段Solr中定义的模式(在第五章讨论)作为一个特定的字段类型,它允许Solr知道如何处理接收到的内容的。
清单3.1显示了一个示例文档,为每个字段定义的值。
清单3.1。
Solr示例文档
26:
37Z
当我们运行一个查询Solr,我们可以搜索一个或多个字段(甚至字段不包含在这个特定的文档),Solr将返回在这些字段包含内容匹配查询的文档。
值得注意的是,虽然Solr灵活的模式为每个文档,它不是“非模式化。
“所有必须定义字段类型,字段名称(或动态field-naming模式)应该在Solr中指定schema.xml,我们将进一步讨论在第5章。
这并不意味着每个文档必须包含各个领域,只有这一点所有可能的领域必须可映射到一个特定的字段类型应该出现在文档,需要处理。
Solr包含自动猜测的能力以前看不见的字段名称的字段类型当它第一次收到的文档新字段名。
这是通过检查字段和数据类型自动添加字段Solr的模式。
因为Solr可能猜出错误的字段类型如果输入是混乱的,这是一个更好的实践来预先确定。
一个文档,是一集合字段映射到特定的字段类型中定义模式。
文档中每个字段的内容分析根据其字段类型,和这种分析的结果保存到后来搜索索引来检索文档通过发送一个相关的查询。
主要从Solr搜索结果返回查询文件包含一个或多个字段。
3.1.2。
基本的搜索问题
在我们深入概述Solr搜索是如何工作的理解很有帮助搜索引擎要解决的基本问题。
比方说你是负责创建搜索功能,帮助用户搜索书。
初始原型看起来如图3.1所示。
图3.1。
示例搜索界面,会看到在一个典型的网站上,展示用户如何提交一个查询到您的应用程序
现在假设一个客户想找一本关于采购一个新家搜索买房。
一些潜在相关书名你可能想要返回表3.1列出了。
表3.1。
相关书籍查询“买房”
潜在的相关书籍
买房子的初学者的指南
如何购买你的第一个房子吗
潜在的相关书籍
买房
成为一个新的业主
买新房子
装饰你的家
其他书名,如表3.2所示,将不会被认为是相关的客户购买新房子感兴趣。
表3.2。
书与查询无关的“买房”
无关紧要的书
一个有趣的烹饪指南
如何提高孩子的事情吗
买一辆新车
一个天真的方法来实现这种搜索使用传统的SQL数据库查询的用户输入的文本:
SELECT*FROMBooksWHEREName='buyinganewhome';
这种方法的问题是,在你的书的书名目录匹配文本,客户类型,这意味着他们将不会找到任何结果
对于这个查询。
此外,客户只会看到未来的查询,如果查询的结果匹配准确完整的书名。
也许一个更宽容的方法是在一个客户的查询寻找每一个词:
SELECT*FROMBooks
WHERENameLIKE'%buying%'
ANDNameLIKE'%a%'
ANDNameLIKE'%home%';
前面的查询,虽然相对昂贵的传统数据库来处理因为它不能使用可用的数据库索引,至少会产生一个匹配客户包含所有所需的单词,如表3.3所示。
表3.3。
结果从数据库查询要求的模糊匹配每个term
匹配的书
没有匹配的书
买新房子
买房子的初学者的指南
如何购买你的第一个房子吗
买房
成为一个新的业主
一个有趣的烹饪指南
如何提高孩子的事情吗
买一辆新车
装饰你的家
当然,你可能会认为,客户包括在他们的查询要求文档匹配你所有的单词过于严格的。
您可以轻松地搜索体验更灵活的只需要一个词存在于任何匹配的书标题,通过发出以下SQL查询:
SELECT*FROMBooks
WHERENameLIKE'%buying%'
ORNameLIKE'%a%'
ORNameLIKE'%home%';
这个查询的结果中可以看到在表3.4。
你会发现这个查询匹配很多比之前的查询书名因为该查询只需要最少的其中一个关键字匹配。
此外,由于这个查询的方法是执行部分字符串匹配的每个关键字,任何书名包含字母“a”也返回。
前面的示例,它要求所有的条款,也匹配字母“a”,但我们没有经历这个问题返回的结果,因为太多了另一个关键字更严格。
表3.4。
结果从数据库查询只需要一个模糊匹配的至少一个term
匹配的书
没有匹配的书
一个有趣的烹饪指南
如何购买你的第一个房子吗
装饰你的家
如何提高孩子的事情吗
买一辆新车
买新房子
买房子的初学者的指南
买房
成为一个新的业主
第一个查询(要求所有单词匹配)导致了许多不相关的书籍发现;第二个查询(只需要其中一个单词匹配)导致了许多更相关的书被发现但导致许多无关紧要的书被发现好。
这些例子展示几个与这个实现的困难:
•它只执行子字符串匹配和无法区分单词。
•它不懂语言的变化,如“买”与“买”。
•它不理解同义词的单词,如“购买”和“采购”或家”和“房子。
”
•不重要的词如“a”(防止结果匹配预期排除等相关结果或不相关的结果,这取决于是否“所有”或“任何”的单词必须匹配)。
•没有意义的相关性排序结果;只有一个匹配的书籍查询词经常出现高于匹配多个或全部的书在客户的查询。
随着图书目录的大小或数量客户查询的增长这些查询将变得缓慢,因为查询必须通过每一本书的标题找到扫描部分匹配,而不是使用索引来查找单词。
搜索引擎Solr照耀在解决此类问题。
Solr是能够执行文本分析内容和搜索查询来确定文本相似的单词,理解和匹配同义词,删除不重要“,”这样的词“的”和“,”,得分每个结果基于传入的查询,以确保它匹配
最好的结果返回第一个,你的客户不需要页面无数less-relevant结果找到他们期望的内容。
Solr完成所有这些通过使用地图内容的索引文件,而不是映射文件内容在传统的数据库模型。
这种反向索引是搜索引擎如何工作的核心。
3.1.3。
反向索引
Solr使用Lucene的反向索引其快速搜索功能,以及许多额外的,它提供的查询。
虽然我们不会进入许多内部Lucene数据结构在这本书中,重要的是要了解的高层结构的反向索引。
(我们建议Luceneinaction,第二版,由迈克尔•麦卡Erik孵卵,奥蒂斯Gospodnetić[曼宁,2010]你可以看看)。
回忆我们以前book-searching的例子中,我们可以领略到一个索引每个术语映射到每个文档看起来就像从表3.5。
表3.5。
将多个文档的文本映射到一个反向索引。
正确的表包含一个反向搜索索引显示的每一个条款,
连同它的位置,在从左表原始文档。
原始文档
Lucene的反响索引
Doc
内容
Term
Doc
Continued
456
Cooking
789
DecoratingYourHome
HowtoRaiseaChild
BuyingaNewCarBuyingaNewHome
TheBeginner’sGuide
toBuyingaHouse
Purchasinga
HomeBecominga
NewHomeOwner
HowtoBuyYour
FirstHouse
beginner’s
buybuying
car
child
cooking
decorating
firstfun...
8694,5,64
31291...
homehouse2,5,7,8
hownew6,93,9
owner4,5,88
purchasing736
raisetheto1,6,9
your2,9
而传统数据库的多个文档将包含一个表示文档的ID映射到一个或多个内容字段包含的所有单词/条款
文档,一个反向索引反转这个模型和地图每一个字/词语料库中,似乎所有的文档。
你可以告诉从表3.5
原始输入文本分割空间,每个术语转换成小写字母文本前插入到反向索引,但一切仍相同的。
值得注意的是,许多额外的文本转换是可能的,不是只是这些简单的;术语可以被修改,补充说,期间或删除本文的过程,这将在第六章中详细介绍。
反向索引两个最终重要的细节应该注意的:
•所有term在索引映射到一个或多个文件。
•在反向索引是辞典编纂的升序排列。
这一观点的反向索引是大大简化;3.1.6节中我们将看到这一点附加信息可以存储在索引来提高Solr的查询和得分能力。
在下一节中您将看到,Lucene的反向索引的结构允许许多强大的查询功能,关键字搜索最大化的速度和灵活性。
3.1.4。
term、短语和布尔逻辑
现在我们所看到的内容是什么样子在Lucene的反向索引,让我们跳进如何查询的机制能够利用这个索引来查找匹配文档。
在本节中,我们将复习的基础知识查找术语和短语的反向搜索索引,利用布尔逻辑来增强这些和模糊查询查找功能。
回顾book-searching的例子,让我们看一个简单的查询新房子,如图3.2中描述的。
图3.2。
简单的搜索查询的细微差别而展示解释
你看到在上一节,所有的文本在内容字段分成term时插入到Lucene索引。
现在有一个传入的查询,你需要从几个选项中选择查询索引:
•寻找两个不同的term,newhouse,要求这两个都匹配
•寻找两个不同的term,newhouse,要求只有一个匹配
•寻找“newhouse”确切的词
所有这些选项都是完全有效的方法取决于你的用例,且多亏了Solr的强大的查询功能,使用Lucene,他们很容易使用布尔逻辑完成。
必需的条件
让我们看看第一个选项,将查询分解成多个term和要求他们所有的匹配。
有两个相同的方式写这个查询使用默认查询在Solr解析器:
•+new+house
•newANDhouse
这两个逻辑上相同,事实上,第二个例子解析和最终减少到第一个例子。
+符号是一元运算符意味着查询的一部分后立即应在任何存在文档匹配;和关键字是一个二元运算符,意味着的一部分查询马上前,紧跟着它的查询的一部分这两个要求。
优化term
相比之下,Solr还支持或二进制运算符,这意味着前查询的一部分,或者查询的一部分后它是必需的存在于任何文档匹配。
默认情况下,Solr还配置了治疗的任何部分查询没有一个明确的操作符作为一个可选的参数,使下面的也是相同的:
•newhouse
•newORhouse
否定方面
除了使部分查询可选的或必需的,也有可能需要他们不存在于任何匹配的文档通过下面的等价的查询:
•newhouse–rental
•newhouseNOTrental
在这些查询,没有文档,包含这个词租赁将返回,文档匹配new或house。
Solr的默认操作符
在缺省配置Solr假设本身就是一个词或短语可选的词,这是可配置的每个查询的基础上使用opURL参数与许多Solr的查询处理程序。
/select/?
q=newhouse&q.op=ORversus/select?
q=newhouse&q.op=AND
注意,如果您更改默认ORANDoperator,这将转向要求所有条trem定没有明确的布尔操作符。
如果默认操作符或查询新房子,然后只有一个条件是必需的。
如果默认的操作符和相同的查询,那么新term和房子都是必需的。
你也可以显式地指定operator之间的term(如新和家庭或新或家)来覆盖默认的操作符。
短语
Solr不仅支持搜索单一条件;它还可以搜索短语,确保多个词汇顺序出现:
•"newhome"OR"newhouse"
•"3bedrooms"AND"walkincloset"AND"granitecountertops"
分组表达式
除了前面的查询表达式,最后一个Solr的基本逻辑结构支持分组的术语、短语和其他查询表达式。
Solr查询语法可以代表任意复杂的查询通过分组条件使用括号,比如下面的例子:
•NewAND(houseOR(homeNOTimprovementNOTdepotNOTgrown))
•(+(buyingpurchasing-renting)+(homehouseresidence–(+property-bedroom)))
使用所需的条件,可选term,否定,并分组表达式提供了一组功能强大且灵活的查询功能,允许任意复杂
对搜索索引查找操作,下一节我们将看到。
3.1.5.Findingsetsofdocuments
基本了解的术语中,短语,和布尔查询,我们现在可以深入到底如何能够使用Solr的内部Lucene反向索引匹配的文件。
记得书的索引表3.5,这是的一部分复制在表3.6。
表3.6。
书名的集合反向索引术语
如果客户现在传入查询是newhome,Solr究竟是如何能够找到文档匹配查询,因为前面的反向索引?
答案是,查询的newhome是twoterms查询(有一个默认的操作符new和home之间,记得吗?
)。
这样,这两个条件必须单独抬起头在Lucene索引:
Term
Document
Home
2,5,7,8
new
4,5,8
一旦找到匹配的文档列表为每个术语,Lucene将执行操作到达一个适当的最终的结果集相匹配的查询。
假设默认操作符是一个OR,这个查询将导致一个结果集的联盟而言,在维恩图如图3.3。
同样,如果查询new和home或者默认操作符被设置为AND,然后结果方面都将被计算5只返回一个结果集的文档和文档,如图3.4所示。
3.1.6。
短语查询和词的位置
我们之前看到的,除了Lucene索引查询的条件,它是可能的查询Solr短语。
回忆,该index仅包含单个term,然而,您可能想知道如何寻找完整的短语。
3.1.7。
模糊匹配
预先不总是可以知道任何给定的搜索在Solr索引将会被发现,所以Solr提供执行fuzzy-matching的几种类型的能力查询。
模糊匹配被定义为执行不精确的匹配条件的能力搜索索引。
例如,有人可能想要搜索开始的任何单词特定的前缀(称为通配符搜索),可能想找到拼写变体在一个或两个字符(称为模糊搜索和编辑距离搜索),或可能想要互相匹配的最大距离在一定范围内的两个术语(称为接近搜索)。
用例中多种类型的术语或短语整个文档搜索,查询可能存在这些fuzzy-matching功能作为一个强大的工具。
在本节中,我们将探讨Solr多个模糊匹配查询功能,包括通配符搜索、搜索范围edit-distance搜索和邻近搜索。
通配符搜索
最常见的一种形式的模糊匹配Solr是使用通配符。
假设你想找到任何文件从字母office开始。
就是一种方式创建一个查询,枚举所有可能的变化:
•Query:
officeORofficerORofficialORofficiateOR...
要求这个单词列表变为查询可以是不合理的客户期望,甚至为你代表你的客户。
因为所有的变化可以匹配Solr索引中已经存在,您可以使用星号(*)通配符来执行同样的功能:
•Query:
offi*Matchesoffice,officer,official,andsoon
除了匹配的术语,可以使用通配符的内部搜索词,比如如果你想匹配官和提供:
•Query:
off*rMatchesoffer,officer,officiator,andsoon
星号通配符(*)一词匹配零个或多个字符。
如果你想匹配只有一个字符,可以使用问号(?
)的目的:
•Query:
off?
rMatchesoffer,butnotofficer
领先的通配符
虽然Solr的通配符功能相当强大,它可以是昂贵的执行某些通配符查询。
每当一个通配符搜索被执行,所有的条款反向索引匹配的部分术语之前必须找到第一个通配符。
然后,每个候选人的条件必须检查,以查看它们是否匹配通配符在查询模式。
因此,您所指定的多个字符的开始这个词在通配符之前,查询应该运行得越快。
例如,查询engineer*不会昂贵的(因为它匹配反向索引中的一些术语),但是查询e*将是昂贵的,因为它匹配所有条款开头字母e。
执行一个通配符查询是一项昂贵的操作。
如果您需要匹配结束term的结束(likecaring,liking,andsmiling),例如,这可能会引发重大性能问题。
•Query:
*ing
如果你需要能够使用这些主要搜索通配符,更快的解决方案存在,但它需要额外的配置。
解决方案是通过添加ReversedWildcardFilterFactory字段类型的链(配置文本分析第六章将讨论处理)。
ReversedWildcardFilterFactory作品double-insertingSolr索引内容index(每个term一次文本,一旦逆转文本的每个词):
当提交一个查询的主要通配符*ing,Solr知道搜索逆转的版本,绕过相关的性能问题领导通配符搜索将自身改造为标准通配符搜索了内容。
但是请注意,把这个功能需要dual-indexingSolr的所有term已经索引,增加索引的大小和减缓整体搜索。
这个功能不建议除非是需要在你的搜索应用程序。
最后一个重要的一点需要注意通配符搜索是通配符为了工作对个人搜索条件,而不是短语搜索,如
下面的例子:
•Works:
softwar*eng?
neering
•Doesnotwork:
"softwar*eng?
neering"
如果您需要执行通配符搜索的能力在一个短语,你要存储整个短语的索引作为一个词,你应该感到舒适的做在第6章末尾。
范围搜索
Solr还提供了搜索的能力方面,已知值之间。
这可以是有用的,当你想要寻找一个特定的文档子集在下降的范围内。
例如,如果你只是想匹配文档中创建六个月在2012年2月2日到,2012年8月2日,,您可以执行以下搜索:
•Query:
created:
[2012-02-01T00:
00.0ZTO2012-08-02T00:
00.0Z]
这个范围查询格式也适用于其他字段类型:
•Query:
yearsOld:
[18TO21]Matches18,19,20,21
•Query:
title:
[boatTOboulder]Matchesboat,boil,book,boulder,etc.
•Query:
price:
[12.99TO14.99]Matches12.99,13.000009,14.99,etc.
这些范围查询周围方括号的范围,这是“包容性”范围的语法。
Solr还支持独家通过使用搜索范围花括号:
•Query:
yearsOld:
{18TO21}匹配19and20butnot18or21
尽管它可能看起来奇怪的语法,Solr还提供混合和匹配的能力包容性和排他的界限:
•Query:
yearsOld:
[18TO21}Matches18,19,20,butnot21
虽然范围搜索执行慢于在单个词的搜索,他们提供的巨大的灵活性寻找文档匹配的动态定义组值,躺在一个特定范围内的Solr索引。
注意,是很重要的term范围查询的排序是:
它们被发现的顺序Solr索引,这是一个按字母顺序。
如果你想创建一个文本字段包含整数,整数会发现按照以下顺序:
1,11日,111年,
120、13日等。
在Solr数值类型,至少我们会建议在未来的人章,弥补通过索引的内容在一个特殊的方式,但它的一定要明白,Solr索引内的排序顺序取决于如何领域内的数据处理的时候写入Solr索引。
我们会潜水深入这种内容分析在章节5和6。
模糊/edit-distance搜索
对于许多搜索应用程序,重要的是不仅要匹配客户的文本,但也允许的灵活性处理正确拼写错误,甚至轻微的变化拼写。
Solr提供了使用edit-distance处理角色变化的能力基于Damerau-Levensh
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- solr in action第三章 action 第三
![提示](https://static.bdocx.com/images/bang_tan.gif)