Solr基础理论【倒排索引,模糊查询】
一.简介
现有的许多不同类型 的技术系统,如关系型数据库、键值存储、操作磁盘文件的map-reduce【映射-规约】引擎、图数据库等,都是为了帮助用户解决颇具挑战性的数据存储与检索问题而设计的。而搜索引擎,尤其是Solr,致力于解决一类特定的问题:搜索大量非结构化的文本数据,并返回最相关的搜索结果。
二.文档
Solr是一个文档存储与检索引擎。提交给solr处理的每一份数据都是一个文档。文档可以是一篇新闻报道、一份简历、社交用户信息,甚至是一本书。
每个文档包含一个或多个字段,每个字段被赋予具体的字段类型:字符串、标记化文本、布尔值、日期/时间、经纬度等。潜在的字段类型数量是无限的,因为一个字段类型是有若干个分析步骤组成的,这些步骤会决定数据如何在字段中被处理,以及如何映射到Solr索引中。每个字段在solr的schema文件中被指定特定的字段类型,并告知solr接收到此类内容的处理办法。
如下:

要在solr上执行一个查询,可以在文档上搜索一个或多个字段,即使字段未包含在该文档中。solr将返回哪些包含了与查询匹配的字段内容的文档。值得注意的是,虽然solr为每个文档提供了一个灵活的schema文件,但灵活并不代表无模式。在solr的schema文件中,所有的字段必须被定义,所有的字段名称【包括动态字段命名模式】必须被指定类型。这并不意味着每个文档必须包含所有字段,仅当所有可能的字段出现在一个文档中需要处理时,才会被全部映射到特定字段类型中。当首次接收到包含新字段的文档时,solr会自动猜测未知的新字段类型。通过检查字段中的数据类型,自动将字段增加到solr的schema中。如果输入的数据难以理解,solr可能会对字段类型识别失败,因此,更好的做法是预先定义好字段类型。
三.倒排索引
Solr使用Lucene倒排索引来驱动快速搜索功能,并且在查询时提供了许多其他附加功能。
原理:

在传统数据库中,多个文档的表征是一个文档id对应一个或多个内容字段,这些字段包含文档中出现的单词/词项。倒排索引将这个模型颠倒过来,将语料库中的每个单词/词项与出现它们的文档对应起来。在插入倒排索引之前,原始输入的文本会根据空格进行拆分【英文分词,汉语分词使用分词器】,每个词项转换为小写,其它部分保持不变。值得注意的是,在实际中可能还需要很多其它的文本转化,不仅仅是这些简单的处理。在内容分析处理中词项可以被修改,添加或删除。
倒排索引的两个特点:
1.倒排索引中的所有词项对应一个或多个文档。
2.倒排索引中的词项根据字典顺序升序排列。
3.布尔逻辑
Solr默认配置为查询词之间是OR运算。OR运算符为二元运算符,solr还支持+【正,表示true】,-【负,表示false,取反】等一元运算符。
例如:id:'zhangsan' AND -name:'lisi'
4.实现逻辑

四.模糊查询
既定查询在solr索引中能找到怎样的搜索结果,这并不是总能提前准确知晓,所以solr提供了几种模糊匹配查询功能。模糊匹配可以对索引中的词项进行并不那么准确的匹配。例如,有人想搜索特定的前缀开头的查询【通配符搜索】,有人下个搜索一个或两个字符的拼写变化【模糊搜索或编辑距离搜索】,有人想根据特定距离来匹配两个查询词【邻近搜索】。查询词与短语的多种变化存在于被搜索的文档中,这种情况正是模糊匹配的用武之地。
1.通配符搜索
由于能匹配到的词汇变化已经存在于solr的索引中,所以可以使用星号【*】通配符实现相同的查询功能。星号通配符匹配查询词中0个或多个字符。若只匹配单个字符,可以使用问好【?】来实现。
备注:首位通配符,虽然solr的通配符功能相当强大,但特定的通配符查询执行可能花销巨大。当通配符搜索执行时,倒排索引中的所有词项与第一个通配符之前的查询词部分匹配。接下来,检查每个候选词项是否与查询中的通配符相匹配。正因为如此,在通配符之前指定越多的字符,查询执行速度越快。执行首位通配符查询是一项花销甚大的操作。例如,假设你需要匹配以ing结尾的所有词项,那么可能会导致严重的性能问题。这是可以做一些额外的配置,在字段类型的分析链中增加ReversedWildcardFilterFactory类。这个类表示在solr索引中两次插入被索引的内容,一次是每个词项的文本,另一个是每个文本的反向文本。带有*ing首位通配符的查询提交后,solr会搜索反向版本【*ing也会转为gni*】,将首位通配符搜索转为标准通配符搜索,这会在反向内容中导致性能问题。在Solr中对所有词项开启双索引,会增加索引的大小且拖慢整体搜索效率。除非必须,否则不建议开启这个功能。
2.区间搜索
solr还提供了在已知区间值中进行搜索的功能,适用于在一个区间内搜索特定文档子集。例如,year:[18 TO 20],匹配:18,19,20,区间查询使用方括号,这是包含边界值的语法。另外,solr还支持使用大括号实现不包含边界值的搜索。;例如:year:[18,20},匹配:18,19。
3.模糊/编辑距离搜索
对于多数搜索应用而言,精确匹配用户输入的文本,灵活处理拼写错误,甚至对正确拼写做出细微修正都是非常重要的。solr基于Damerau-Levenshtein距离的编辑距离度量方法提供了字符变体的处理手段,可以有效解决80%以上的人为拼写错误。solr使用~符号表示模糊编辑距离搜索。例如:adm~。这个查询匹配到原始词项【admin】及与之相距两个编辑距离的其它词项【adman,admni等】。编辑距离被定义为字符的一次插入、删除、替换或位置互换。另外可以修改编辑距离的大小,让搜索可以匹配任意编辑距离的词项。例如:adm~1匹配1个以内的编辑距离。adm~2匹配两个以内的编辑距离【默认值】。请注意,两个以上的编辑距离会使搜索速度大幅下降,也可能匹配出意外的词项。一个或两个编辑距离的搜索使用有效的Levenshtein自动机方法执行,但超过两个编辑距离的查询就会退回更慢的编辑距离实现方法。
4.邻近搜索
与编辑距离搜索类似,邻近搜索可以搜索词与词之间间隔多少词来进行搜索。例如:chief officer ~1匹配两词之间最多间隔一个词这种情况。注意,邻近搜索并不适用于真实的编辑距离,换位可能只算是一次编辑操作。
Solr基础理论【倒排索引,模糊查询】的更多相关文章
- solr之~模糊查询
有的时候,我们一开始不可能准确地知道搜索的关键字在 Solr 中查询出的结果是什么,因此,Solr 还提供了几种类型的模糊查询.模糊匹配会在索引中对关键字进行非精确匹配.例如,有的人可能想要搜索某个前 ...
- solr之~模糊查询【转】
solr之~模糊查询 有的时候,我们一开始不可能准确地知道搜索的关键字在 Solr 中查询出的结果是什么,因此,Solr 还提供了几种类型的模糊查询.模糊匹配会在索引中对关键字进行非精确匹配.例如,有 ...
- Solr基础理论与维护管理快速上手(含查询参数说明)
1. solr基础 因为 Solr 包装并扩展了 Lucene,所以它们使用很多相同的术语.更重要的是,Solr 创建的索引与 Lucene 搜索引擎库完全兼容.通过对 Solr 进行适当的配置,某些 ...
- 详解TableStore模糊查询——以订单场景为例
背景 订单系统在各行各业中广泛应用,为消费者.商家后台.促销系统等第三方提供用户.产品.订单等多维度的管理和查询服务.为了挖掘出海量订单数据的潜能,丰富高效的查询必不可少.然而很多时候并不能给出完整准 ...
- Mybatis框架的模糊查询(多种写法)、删除、添加(四)
学习Mybatis这么多天,那么我给大家分享一下我的学习成果.从最基础的开始配置. 一.创建一个web项目,看一下项目架构 二.说道项目就会想到需要什么jar 三.就是准备大配置链接Orcl数据库 & ...
- js—模糊查询
首先要明白什么是模糊查询(废话又来了),就是根据关键字把列表中符合关键字的一项或某项罗列出来,也就是要检查列表的每一项中是否含有关键字,因此抽象一下就是一个字符串中是否含有某个字符或者字符串. 以下例 ...
- mybatis : trim标签, “等于==”经验, CDATA标签 ,模糊查询CONCAT,LIKE
一.My Batis trim标签有点类似于replace效果. trim 属性, prefix:前缀覆盖并增加其内容 suffix:后缀覆盖并增加其内容 prefixOverrides:前缀判断的条 ...
- combobox实现模糊查询自动填充
利用winform设计软件界面时,经常用到combobox控件,但有时需要绑定数据表中的数据,更进一步,需要实现对数据表中数据的模糊查询功能.本文就讲讲述如何用C#实现combobox下拉列表的模糊查 ...
- [转]ORACLE中Like与Instr模糊查询性能大比拼
instr(title,'手册')>0 相当于 title like '%手册%' instr(title,'手册')=1 相当于 title like '手册%' instr(titl ...
随机推荐
- 【java异常】expected at least 1 bean which qualifies as autowire candidate for this depende
1.查看接口实现类是否加入注解,如service.repository等 2.查看spring配置文件是否自动扫描包 <context:component-scan base-packag ...
- 在VMMap中跟踪不可用的虚拟内存
VMMap是一个很好的系统内部工具,它可以可视化特定进程的虚拟内存,并帮助理解内存的用途.它有线程堆栈.映像.Win32堆和GC堆的特定报告.有时,VMMap会报告不可用的虚拟内存,这与可用内存不同. ...
- ESP8266 SDK开发: 开发环境搭建
前言 这节安装下编程软件, 可以去官网下载, https://wiki.ai-thinker.com/ai_ide_install 也可以安装我提供的(我使用的为官方以前版本) 建议安装我提供的,有问 ...
- Hadoop Capacity调度器概念及配置
在Yarn框架中,调度器是一块很重要的内容.有了合适的调度规则,就可以保证多个应用可以在同一时间有条不紊的工作.最原始的调度规则就是FIFO,即按照用户提交任务的时间来决定哪个任务先执行,但是这样很可 ...
- Salesforce Lightning开发学习(三)Component表单初解
初步了解了Lightning的组件开发流程后,我们来认识下lightning的表单 点击对象管理器,选择对象:电影(Movie__c),创建字段 标签 API 数据类型 票价 Number__c ...
- docker for mac的JSON配置文件中的hosts项修改后无法生效
docker for mac的JSON配置文件中的hosts项修改后无法生效 docker 2.1k 次浏览 问题对人有帮助,内容完整,我也想知道答案0问题没有实际价值,缺少关键内容,没有改进余地 增 ...
- linux shell提示输入 输错字符解决方法
linux shell提示输入 输错字符解决方法ctrl+回车 删除单个字符ctrl+u删除光标前全部字符ctrl+k删除光标后全部字符
- HTML基础(一)基本语法知识
HTML 基本文档 <!DOCTYPE html> <html> <head> <title>文档标题</title> </head& ...
- thinkphp验证码不现实多半是bom惹的祸
thinkphp 验证码不现实多半是bom惹的祸,下面是驱除bom的代码: 链接:https://pan.baidu.com/s/1v5gm7n0L7TGyejCmQrMh2g 提取码:x2p5 免费 ...
- Docker从入门到实践(3)
三.安装 Docker Docker 分为 CE 和 EE 两大版本.CE 即社区版(免费,支持周期 7 个月),EE 即企业版,强调安全,付费使用,支持周期 24 个月. Docker CE 分为 ...