学习了一段时间的solr了,用自己的方式总结下目前学到的内容,这是个系列文章,这里面的有些说法可能不准确,也可能有问题

欢迎大家指正。

一、搜索引擎目的

搜索引擎在我们的生活中,已经无处不在,除了我们常用的baidu、Google等,还有一些电商的搜索 比如亚马逊搜书等。除了网页搜索外,企业内部可能涉及到知识库搜索,一般称为企业搜索。现在搜索要主要的目的是,在海量信息中,从非结构化数据快速找到符合我们含义的信息。注意这里的几个关键词语。

"海量信息"  :搜索引擎一般处理的数据量很大,普通数据库在搜索的数据量非常大的时候,比如上亿条数据的时候,就算建立索引,查询速度也不是很快,不能满足现实的需求。

“符合我们的含义”:我觉得这可以称为语意搜索(还没有看到过这个叫法:),第一条也许数据库还可以勉强达到,但是数据库搜索难以达到符合含义这个目的,这在搜索过程中要涉及到同义词的转换。比如你在亚马逊中搜索solr,可以找到Lucene、搜索引擎相关的书籍,这里面就涉及到同义词的转换;我觉得这是搜索引擎最重要的特征。

一般的搜索引擎都会根据相关性对我们搜索的内容和现存的文档进行匹配,对相似度进行打分,并且按照相似度的进行排序,相似的排在前面。

"非结构化数据": 这个是指没有固定格式和固定长度的数据,比如一篇文章,这种数据也称为全文数据。

二、搜索引擎原理

2.1 常用的非结构化数据检索方法

按照上节所说,搜索引擎主要处理的是非结构化数据,故名思议,非结构化数据的特点就是没有固定的结构,这也正是处理比较困难的原因;结构化数据可以通过数据库等方式处理。非结构化数据如何处理,据说有两种方法:

一种是顺序搜索,比如在linux下用grep方式来搜索包含特定字符串的文档,这在文档数量少的时候比较有效。

二种是全文检索,它是通过对非结构化数据进行结构化转化,对非结构化数据进行抽取(从文档中抽取词),然后重新组合,再利用它进行搜索。

这个被抽取出来重新组织的信息称为索引

第二种方法是搜索引擎中用的主要方法了。

2.2 全文检索的三大问题

这就涉及到三个问题:1、索引里面保存什么信息?2、索引如何建立? 3、如何利用索引进行搜索?

索引保存的是什么

让我们思考下,既然全文搜索是通过建立索引的方式进行搜索的,那么我们的索引内容必然是为了方便查找到我们要的信息的。

以搜索文章为例,假如我们需要海量的文章,为了方便管理我们给这些文章进行编号,

搜索就是要找到搜索关键词和文章编号的对应关系,然后通过编号再找到对应的文档。那么很自然的存储的索引的内容必然有和关键字匹配的部分,还有文章编号的部分。

实际情况也是如此,全文搜索建立的索引简单来说就是词和文章编号的对应关系,由于一个词可以放在多个文章中,所以这种索引一般就是一个个词后面对应一串文章编号(文档编号链表)。

从文章对应词比较自然,所以从词对应文档是文档对应词的反过程,保存这种信息的索引称为反向索引(倒排索引)。

盗用一张网上说明Lucene的倒排索引原理图,solr是基于Lucene的,所以solr的索引也是倒排索引。

这里面,关键词一般叫词典,后面对应的一串文档号文章号叫做倒排表

索引如何建立

创建索引的过程盗用个网上图,索引过程如下:

我们来思考下,我们要建立的索引为倒排索引即是词典和倒排表。

我们首先要从文档中得到词,所以我们首要工作是分词,这里面用到的就是分词组件(Tokenizer)本次得到的结果是词元(Token)

其次从词元(Token)经过语言处理组件(Linguistic Processor)的处理输出为词(Term)。这一部分主要完成的是词义转化等

词边变的更纯碎些。最后一步就是将词传递给相关的索引组件,建立索引。

1、分词做的主要工作

1)切词,英语比较好拆分就是按照空格分隔,汉字要涉及到利用词典进行切词或单独按照字来进行切词。

2)去掉标点符号。

3)去掉停词,停词是指语言中没有特殊含义的副词,比如英语中的this、is、a、汉语中的“的”等。

在solr中有专门的配置文件配置停词,stopwords_开头的配置文件。

使得到的词更有意义,减少索引的长度,因为停词在很多文档中都有,如果加到索引里面,后面的文档号要排很长,专业名词叫拉链过长。

不光占用过多的空间,而且还会导致搜索变慢。

中文由于没有明显的词语直接的间隔,所以中文分词要复杂的多。solr中默认StandardTokenizerFactory是按照字来分隔,好处是实现字级匹配,坏处索引变大。

也可以利用网上开源的分词组件,比如:庖丁分词、IK分词等。

效率solr默认的分词的建索引效率大概是IK分词的1倍,但是查询效率却慢4倍原因,是按字分词拉链过长原因。

2、语言处理主要工作

1)对英语来说是大小写转换。

2)将词缩减或简化为词根。(比如cars转成car、running转成run)

语言处理组件得到的结果是为Term(词)。

3、将此传递给索引组件

1)利用词创建词典和文档ID的对应关系表。

2)按照字典顺序对词典进行排序。

3)合并相同的词典,文档ID变成文档ID链表。

实际建立的倒排索引,还包含词在文档中的位置、出现的频次等信息。

搜索过程

1)我们利用搜索引擎的语法输入查询的语句。我们常用的搜索引擎百度

常用语法举例子如下:

1.  如果你想让百度作为整体搜索而不进行分词,用双引号包括。

2.  如果你不想要一些信息可以用-号,比如手机-推广,将不会显示百度的推广广告。

3.  比如搜索关键词之间是或者关系,可以通过搜索xxx|yyy方式搜索。

2) 对查询的语句进行词法分析、语法分析和语义处理。

类似建索引的过程,需要进行分词、转化后,还有多一个内容要区分关键字和搜索词、

关键字代表搜索词之间的逻辑关系,在solr搜索中是op标示,比如AND标示逻辑与、

OR标示或关系,经过这种语法分析后形成一个语法树。

3)搜索

在solr中大概分为三步完成:

1、在反向索引表中查找符合要求的文档ID。第一次查询返回的是文档ID和匹配度得分。

2、根据语法树进行逻辑与或或等操作,得到最终符合要求的文档ID列表。

3、通过这些文档ID列表,结合要求查询的内容去查询具体到具体的内容信息返回。

4)排序返回

文档列表查到之后,把查询的语句当做一个文档,来计算被查询的文档和查询到的文档之间的相关度,并进行打分,

相关度高的排在前面。

相关度得分的计算比较复杂,主要涉及有:

词频TF: 即词在文档中出现的次数。

DF: 即这个词在多少个文档中出现。

词的权重:词在文档中的重要性。

solr学习之一 搜索基本知识相关推荐

  1. 基于Solr的空间搜索学习笔记

    基于Solr的空间搜索学习笔记 在Solr中基于空间地址查询主要围绕2个概念实现: (1) Cartesian Tiers 笛卡尔层 Cartesian Tiers是通过将一个平面地图的根据设定的层次 ...

  2. DSt:数据结构的最强学习路线之数据结构知识讲解与刷题平台、刷题集合、问题为导向的十大类刷题算法(数组和字符串、栈和队列、二叉树、堆实现、图、哈希表、排序和搜索、动态规划/回溯法/递归/贪心/分治)总

    DSt:数据结构的最强学习路线之数据结构知识讲解与刷题平台.刷题集合.问题为导向的十大类刷题算法(数组和字符串.栈和队列.二叉树.堆实现.图.哈希表.排序和搜索.动态规划/回溯法/递归/贪心/分治)总 ...

  3. 即将实习的应届毕业生 学习java SpringMVC 数据库 知识总结

    即将实习的应届毕业生 学习java SpringMVC 数据库 知识总结 1.Java语言的优点: 1)Java是纯面向对象语言 2)与平台无关性,一次编译到处运行 3)Java提供了狠多内置类库 4 ...

  4. 论文合集 | 李飞飞新论文:深度学习代码搜索综述;Adobe用GAN生成动画(附地址)...

    来源:机器之心 本文约3200字,建议阅读7分钟. 本文介绍了李飞飞新论文,深度学习代码搜索综述,Adobe用GAN生成动画. 本周有李飞飞.朱玉可等的图像因果推理和吴恩达等的 NGBoost 新论文 ...

  5. ElasticSearch搜索语法进阶学习(搜索+聚合,过滤+聚合)

    ElasticSearch聚合+搜索语法学习 目录 搜索+聚合:统计指定品牌下每个颜色的销量 global bucket:单个品牌与所有品牌销量对比 过滤+聚合:统计价格大于1200的电视平均价格 b ...

  6. 深度学习在搜索和推荐领域的应用

    /* 版权声明:可以任意转载,转载时请标明文章原始出处和作者信息 .*/ author: 张俊林 深度学习在搜索和推荐领域的应用 (想更系统地学习深度学习知识?请参考:深度学习枕边书) 大纲: •深度 ...

  7. 实时事理学习与搜索平台DemoV1.0正式对外发布

    我们团队探索了一种将事件.概念.逻辑.实时学习.多类知识库实时更新串起来的知识服务新模式.一个面向事理的实时学习和搜索系统Demo,取名叫"学迹",取自"学事理,知行迹& ...

  8. Solr学习总结(四)Solr查询参数

    今天还是不会涉及到.Net和数据库操作,主要还是总结Solr 的查询参数,还是那句话,只有先明白了solr的基础内容和查询语法,后续学习solr 的C#和数据库操作,都是水到渠成的事.这里先列出sol ...

  9. 开发一款浏览器内核需要学习哪些方面的知识?

    开发一款浏览器内核需要学习哪些方面的知识? 最近参加毕业设计,题目选的是<基于Linux平台的网页浏览器设计与实现>. 想认真做一下,所以不准备直接用现成的开源浏览器内核(比如WebKit ...

最新文章

  1. C 语言编程利器 之CLion
  2. 服务 托管型呼叫中心的核心竞争力
  3. JavaScript的方法和技巧
  4. 动态规划——最长公共子序列(LCS)
  5. 区块链BaaS云服务(17)纸贵科技Zeus多链网络Z-Ledger联盟链
  6. Django之请求和响应
  7. 鸿蒙系统被烧毁,华为鸿蒙操作系统再次被质疑 国产是原罪
  8. hashmap转红黑树的阈值为8_面试必考的 HashMap,这篇总结到位了
  9. 找一个程序员当男朋友是什么样的体验?
  10. 【Java教程系列】JavaSE核心知识点总结
  11. java jdom进行xml的增删改差_java使用DOM对XML文档进行增删改查操作实例代码
  12. BZOJ4516: [Sdoi2016]生成魔咒(后缀自动机)
  13. 【模型压缩系列】一:模型替换
  14. 天气预报城市代码对应表
  15. uniapp开发微信小程序canvas动画入门
  16. 39. 组合总和:给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列
  17. WIN10家庭版增加本地安全策略
  18. 从超融合到混合云,深信服有了哪些新“畅想”?
  19. Class::DBI模块简介
  20. MySQL在RR级别下到底有没有修复幻读

热门文章

  1. cron表达式 每隔1个小时_2-1!1-1!短短51个小时,西班牙人获4大喜讯,天佑武磊...
  2. python写水仙花的作文_python自动打开浏览器下载zip,并且提取内容写入excel
  3. python 下载文件 登录信息-Python爬虫 登录网页后下载图片,怎么保持登录状态?...
  4. c语言标准输入输出ppt,c语言输入输出语句PPT
  5. 没有终结点在侦听可以接受消息的_【大卫聊股】2019.05.05 周末重要消息分析及下周一走势预判...
  6. JAVA输出希腊union,希腊文化认为,最为抽象的艺术形式是()。
  7. (2) 用java实现一个简易编译器1-词法解析入门
  8. java 抽象类和接口有什么区别
  9. python 标准化_数据标准化
  10. web安全攻防从入门到放弃-记录