全文搜索

  为什么使用ES,这里算是一个引申。

一:数据的分类

  结构化数据:指具有固定格式或有限⻓度的数据,如数据库,元数据等。 对于结构化数据,我们⼀般都是可以通过关系型数据库(mysql,oracle等)的 table 的⽅ 式存储和搜索,也可以建⽴索引。通过b-tree等数据结构快速搜索数据。

  ⾮结构化数据:全⽂数据,指不定⻓或⽆固定格式的数据,如邮件,word⽂档等。 对于⾮结构化数据,也即对全⽂数据的搜索主要有两种⽅法:顺序扫描法,全⽂搜索 法。

  顺序扫描

  按字⾯意思,我们可以了解它的⼤概搜索⽅式,就是按照顺序扫描的⽅式查找特定的关键 字。⽐如让你在⼀篇篮球新闻中,找出"科⽐"这个名字在哪些段落出现过。那你肯定需要从 头到尾把⽂章阅读⼀遍,然后标记出关键字在哪些地⽅出现过。 这种⽅法毋庸置疑是最低效的,如果⽂章很⻓,有⼏万字,等你阅读完这篇新闻找到"科 ⽐"这个关键字,那得花多少时间。

  全⽂搜索

  对⾮结构化数据进⾏顺序扫描很慢,我们是否可以进⾏优化?把我们的⾮结构化数据想办法 弄得有⼀定结构不就⾏了吗?将⾮结构化数据中的⼀部分信息提取出来,重新组织,使其变 得有⼀定结构,然后对这些有⼀定结构的数据进⾏搜索,从⽽达到搜索相对较快的⽬的。这 种⽅式就构成了全⽂搜索的基本思路。这部分从⾮结构化数据中提取出的然后重新组织的信 息,我们称之索引。 我们以NBA中国⽹站为例,假设我们都是篮球爱好者,并且我们是科密,那如何快速找到有 关科⽐的新闻呢?全⽂搜索的⽅式就是,将所有新闻中所有的关键字进⾏提取,⽐如"科 ⽐","詹姆斯","总冠军","MVP"等关键字,然后对这些关键字建⽴索引,通过索引我们就 可以找到对应的该关键词出现的新闻了。

二:什么是全⽂搜索引擎

  根据百度百科中的定义,全⽂搜索引擎是⽬前⼴泛应⽤的主流搜索引擎。它的⼯作原理是计算机索 引程序通过扫描⽂章中的每⼀个词,对每⼀个词建⽴⼀个索引,指明该词在⽂章中出现的次数和位 置,当⽤户查询时,检索程序就根据事先建⽴的索引进⾏查找,并将查找的结果反馈给⽤户的。

 搜索引擎

  Lucene

  Solr

  Elastic search

 数据类型

  全⽂索引搜索很好的⽀持⾮结构化数据的搜索,可以更好地快速搜索⼤量存在的任何单词⾮ 结构化⽂本。例如 Google,百度类的⽹站搜索,它们都是根据⽹⻚中的关键字⽣成索引,我 们在搜索的时候输⼊关键字,它们会将该关键字即索引匹配到的所有⽹⻚返回;还有常⻅的 项⽬中应⽤⽇志的搜索等等。对于这些⾮结构化的数据⽂本,关系型数据库搜索不是能很好 的⽀持。

 搜索性能

  如果使⽤mysql做搜索,⽐如有个player表,这个表有user_name这个字段,我们要查找出 user_name以james开头的球员,和含有James的球员。我们⼀般怎么做?数据量达到千万级 别的时候怎么办?

 灵活的搜索

  如果我们想查出名字叫james的球员,但是⽤户输⼊了jame,我们想提示他⼀些关键字

 索引的维护

   ⼀般传统数据库,全⽂搜索都实现的很鸡肋,因为⼀般也没⼈⽤数据库存⻓⽂本字段,因为 进⾏全⽂搜索的时候需要扫描整个表,如果数据量⼤的话即使对SQL的语法进⾏优化,也是 效果甚微。即使建⽴了索引,但是维护起来也很麻烦,对于 insert 和 update 操作都会重新 构建索引。

 适合全⽂索引引擎的场景

  搜索的数据对象是⼤量的⾮结构化的⽂本数据。

  ⽂本数据量达到数⼗万或数百万级别,甚⾄更多。

  ⽀持⼤量基于交互式⽂本的查询。

  需求⾮常灵活的全⽂搜索查询。

  对安全事务,⾮⽂本数据操作的需求相对较少的情况。

原文地址:https://www.cnblogs.com/juncaoit/p/12592098.html