最近在协助部署es集群,es在全文搜索方面还是比较强劲的,还有一个工具叫solr,这两个底层都是基于lucene来处理的,建立倒排索引来提升查询的效率。这一节简单理解下全文检索。

为什么要有全文检索
全文搜索是一种高效、精准的信息检索方法。当下大部分的应用系统都是有它的身影的,那为什么需要有全文检索呢?
对于结构化数据(有固定格式或是有限长度的数据),我们可以使用基于SQL的语法,在大量数据中查询某个字段包含某个字段,可能会使用如下的语法
select * from test where name like '%我是中国人%'
这种语法会带来以下的问题
- 不能使用索引,需要全表扫描
- 不能进行拆开查询,如搜索 “我是中国人”, 只能是搜索整个包含 “我是中国人” 的行项,不能拆分成 中国、中国人等来查询。
- 不能给数据相关性评分,如对于包含中国人词比较多的数据排在前面。
对于结构化的数据,我们来思考下,如果要提升效率,避免全表扫描,一般的做法是将需要查询的字段建立索引,而建立索引后,数据库就会生成索引相关的信息,在查找时,优先查找索引,再由索引查找对应的行项,而索引是经过特殊处理的结构,如二叉树。
那有没有办法对于非结构化的数据,转成结构化数据,再对这个结构化数据进行索引呢?实则这就是全文检索的正常做法,就是将非结构化的数据抽取出来,再重新组织,让其变得有必定的结构,之后再对其结构化的数据进行搜索,抽取部分信息,重新组织的过程就是创建索引的过程。
全文检索的流程
- 建立索引:在全文搜索引擎中,建立索引是超级重大的一步。使用分词器对文本进行分词处理(抽取词语、去除标点、去除停词),将每一个词语都存储到索引中,这是建立倒排索引的过程。这样,当用户输入关键词时,搜索引擎就能够快速地找到相关的文本内容。
- 计算权重:在建立索引之后,我们需要为每一个词语计算权重。权重的计算方法(影响因素可以包含词频、权重)可以根据不同的算法来进行。列如,我们可以使用TF-IDF算法(实则还挺复杂,后面专门篇章分析下)来计算每一个词语在文本中的重大程度。这样,当用户输入多个关键词时,就能够优先展示与关键词相关度最高的文本内容。
- 搜索:在用户输入关键词之后,通过索引和权重计算来匹配相关的文本内容。可以使用布尔查询、短语查询、通配符查询等多种查询方式来进行匹配。当找到了相关的文本内容之后,会按照权重排序,将最相关的文本内容展示给用户。
- 结果展示:将匹配的文本内容展示给用户。我们可以使用各种方式来展示搜索结果。列如,我们可以使用文本摘要、图片、视频等方式来呈现搜索结果,以便让用户更加直观地了解搜索结果。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...

