Elasticsearch(2)全文搜索和Lucene


学习ES之前先了解一下全文搜索和Lucene吧,本文只是蜻蜓点水,具体的内部实现和详细的资料请自行google查阅~~


全文搜索


全文搜索是指计算机搜索程序通过扫描文章的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询的时候,搜索程序会根据之前建立的索引去查找,并将查找结果返回给用户,这个过程类似于查字典。Lucene是目前全球使用最广的全文搜索引擎开源库。

Lucene介绍

Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。Lucene是一套用于全文检索和搜寻的开源程式库,由Apache软件基金会支持和提供。Lucene提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻。在Java开发环境里Lucene是一个成熟的免费开源工具。就其本身而言,Lucene是当前以及最近几年最受欢迎的免费Java信息检索程序库。人们经常提到信息检索程序库,虽然与搜索引擎有关,但不应该将信息检索程序库与搜索引擎相混淆。

Lucene倒排索引

首先我们看一个实际问题:有一些学生信息,包括了姓名,家庭住址,联系电话。现在我们需要找到甘肃省的学生。传统的数据库我们需要建一张学生信息表:

id name address mobile
1 田狗 甘肃省陇南市 13310002212
2 唐狗 甘肃省嘉峪关市 12210001121
3 老马 广州市城关区 12210001121

当我们在查询甘肃省的学生时只需用sql去匹配甘肃省

select * from student where address like "%甘肃省%";

但是当我们在查询的时候输入了甘肃省广州,我们希望可以查出甘肃省和兰州的所有信息,这样的话通过一条sql是无法完成的,这个时候我们就有了一种新的选择方式:我们将学生的住址进行分词,取得关键字,即

甘肃省, 陇南市,嘉峪关市,广州市,城关区

我们用关键词和学生记录建立对应关系得到

关键词 记录编号
城关区 3
甘肃省 1,2
陇南市 1
嘉峪关市 2
广州市 3

通常情况下我们不仅需要知道关键词在哪条记录,也需要知道在记录中的位置和出现的次数,一般有两种位置:

  1. 字符位置,即记录该词是记录中的第几个字符(优点是显示并定位关键词速度快)。
  2. 关键词位置,记录该词是记录中的第几个关键词(优点是节约索引空间、词组查询快),Lucene使用这种方式。

加上出现频率和出现位置,我们得到如下的索引结构

关键词 记录编号【出现评率】 出现位置
城关区 3[1] 2
甘肃省 1[1],
2[1]
1,
1
陇南市 1[1] 2
嘉峪关市 2[1] 2
广州市 3[1] 1

当我们在查询“甘肃省广州”时,会同时匹配到甘肃省和广州两个词,得到1,2,3三条记录。这种由属性值来确定记录的索引方式就叫做–倒排索引。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章