前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >深入拆解'搜索引擎'实现原理二:创建索引

深入拆解'搜索引擎'实现原理二:创建索引

作者头像
浩说编程
发布2021-09-10 15:55:37
5080
发布2021-09-10 15:55:37
举报
文章被收录于专栏:Java经验之谈Java经验之谈

通过上一篇文章我们大致了解了'搜索引擎'的基本内容,包括'搜索引擎'的作用以及基本的实现过程:

  1. 拆分非结构化数据
  2. 建立索引
  3. 搜索索引

上期回顾

深入拆解'搜索引擎'实现原理一:初识 '搜索引擎'

今天我们来拆解'建立索引'的过程

以Java最经典的搜索引擎框架Lucence为例,之后的Solr以及ElasticSearch都是基于Lucence实现:

01

怦收集源文件

假设有两个源文件,以下是源文件的内容:

  1. 文件一:Students should be allowed to go out with their friends, but not allowed to drink beer.
  2. 文件二:My friend Jerry went to school to see his students but found them drunk which is not allowed.

02

将源文件传给分词组件

分词组件(Tokenizer)会做以下几件事情(此过程称为Tokenize):

1. 将文档分成一个一个单独的单词。

2. 去除标点符号。

3. 去除停词(Stop word)。

停词 停词是指一种语言中的过渡词或语气词等,通常没有特别的意义,所以不能作为搜索的关键词,这类词汇会被分词器过滤掉。

如英语中的停词:this、a、the等。

对于每种语言的分词组件,都有一个分词集合。

注:由于Lucence由国外人员开发,最初的分词器只支持英文。之后由国内大佬开发了支持中文的分词器。

文章在经过分词器处理后得到了一些列词汇的集合,叫做‘‘词元’’:

“Students”,“allowed”,“go”,“their”,“friends”,“allowed”,“drink”,“beer”,“My”,“friend”,“Jerry”,“went”,“school”,“see”,“his”,“students”,“found”,“them”,“drunk”,“allowed”

03

将词元传给语言处理组件

语言处理组件对不同语言的处理逻辑大同小异

对于英语,语言处理组件会对词元做以下几个处理:

  • 单词转小写
  • 将单词‘’缩减‘’为词根形式,如“cars ”到“car ”、去除“ing”加“e”,将“ational”变为“ate”,将“tional”变为“tion”等,这种操作称为:stemming 。
  • 将单词‘’转变‘’为词根形式,如“drove ”到“drive ”等。这种操作称为:lemmatization 。

我们的词元经过语言处理组件得到的集合叫做词:

“student”,“allow”,“go”,“their”,“friend”,“allow”,“drink”,“beer”,“my”,“friend”,“jerry”,“go”,“school”,“see”,“his”,“student”,“find”,“them”,“drink”,“allow”。

04

将得到的词传给索引组件

索引组件会做以下处理(Document ID : 文件编号):

1、将词组成词典:

Term

Document ID

student

1

allow

1

go

1

their

1

friend

1

allow

1

drink

1

beer

1

my

2

friend

2

jerry

2

go

2

school

2

see

2

his

2

student

2

find

2

them

2

drink

2

allow

2

2、词典排序:

Term

Document ID

allow

1

allow

1

allow

2

beer

1

drink

1

drink

2

find

2

friend

1

friend

2

go

1

go

2

his

2

jerry

2

my

2

school

2

see

2

student

1

student

2

their

1

them

2

3、合并相同的词,生成文档倒排链表:

Document Frequency 即文档频次,表示总共有多少文件包含此词(Term)

Document ID 文档编号

Frequency 即词频率,表示此文件中包含了几个此词(Term)

到这里,整个‘‘创建索引’’的过程就已经完成。

我将两篇文档的原文再复制一次:

文件一:

Students should be allowed to go out with their friends, but not allowed to drink beer.

文件二:

My friend Jerry went to school to see his students but found them drunk which is not allowed.

现在如果我们需要搜索包含‘‘allow’’的文档,直接就可以从索引中匹配第一条横向链表。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-08-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 浩说编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档