搜索引擎原理之sphinx技术分享-@赵建亭
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4
某司使用sphinx的结构图
5
sphinx 全文检索两个过程
索引创建(indexing)将数据源通过一定方式提取信息 搜索索引(search)进根据用户查询请求,搜索创建的索引,返回索引内容
文档索引和属性的解释
文档索引 编制索引的源,sphinx以索引源来编制索引,编制完成后索引源不在存储 文档属性 搜索可以返回的内容,属性可以用来进行文档的过滤
1
7
8
wk.baidu.com
hash key value
Key(充电 宝) value 2
Key(鞋) value 3
Key(哈密 瓜) value 4
3
1
2
5
6
4
7
9
10
12
索引创建(indexing) 请对比与上图的联系 此图就是索引存储方式 13
搜索索引(search) 例如搜索运动鞋
14
搜索索引(search)
3
Sphinx 官方文档介绍
Sphinx官方网址: http://sphinxsearch.com/
Sphinx是一个基于SQL的全文检索引 擎,可以结合MySQL,PostgreSQL做 全文搜索,它可以提供比数据库本身 更专业的搜索功能,使得应用程序更 容易实现专业化的全文检索。Sphinx 特别为一些脚本语言设计搜索API接口, 如PHP,Python,Perl,Ruby等,同 时为MySQL也设计了一个存储引擎插 件。 Sphinx单一索引最大可包含1亿条记录, 在1千万条记录情况下的查询速度为 0.x秒(毫秒级)。Sphinx创建索引的 速度为:创建100万条记录的索引只 需 3~4分钟,创建1000万条记录的索 引可以在50分钟内完成,而只包含最 新10万条记录的增量索引,重建一次 只需几十秒。
赵建亭 大数据专家
Blog:https://blog.csdn.net/zhaojianting
2
我们为什么需要引擎
数据库关键词查询:例如现在有很多文档(文档内容比较长),但 是我们想查询哪些文档内容含有历史(假设查询关键字为 历史)这 个关键字。对于数据库查询方法而言,就是去遍历所有文档,并且 在文档中遍历查看是否存在历史这个关键词。 数据库属于顺序查找 如要找内容包含某个字符串的文件,会一个 文档一个文档的从头到尾的找,如 Like查找。
词法分析语言处理
索引
Mmseg Token 金龙鱼 油 700 ml
分词处理
索引处理(索 引文档关系建 立)
8
索引创建(indexing)
假设我们现在有10件商品从1-10(文档id) 商品名字通过切分后形成如下关系表
词典
hash key value
Key(运动) value 1
Key(充电 宝) value 2
Faster
搜索引擎(sphinx)
1
作者的新书电子版,欢迎您阅读 《elasticsearch7完全开发指南》: https://wenku.baidu.com/view/8ff2ce94591b6bd97f192279168884868762b8e7 《kibana权威指南》: https://wenku.baidu.com/view/24cfee1ce43a580216fc700abb68a98270feac21
listname) values (1,“李宁运动品牌商店”,“篮球运动鞋 运 动型”,“李宁运动品牌商店”,“篮球运动鞋 运动型”); 我们就只看运动这个keyword
Keyword 运动 Docs 1 (文档数目) hits 3 (hit次数)
11
索引创建(indexing)
词典
Key(运动) value 1
6
索引创建(indexing)
索引切分
例如现在我们有一个商品名字叫做金龙鱼油700ml,商品的id 1
现在我们以商品名字为索引插入sphinx Sphinx内置中文分词将切分金龙鱼油700ml 目前按照mmseg算法进行切分中文分词 切分完成后得到以下4个单词
金龙鱼 油 700 ml
用户搜索以上任何单词都可以找到id 1的商品(这是搜索最基本思路)
Key(鞋) value 3
Key(哈密 瓜) value 4
1
3
1
2
7
5
6
4
8
7
9
10 9
索引创建(indexing)
索引中常用名词解释
Keyword
关键词 就是代表切分后索引词 例如运动鞋切分为运动和鞋,那么这
两个词都是关键词
Docs
关键词 击中的文档数目 例如右图 运动下面有三个商品
Key(运动) value 1
7
索引创建(indexing) 分词过滤
带索引文件(例如 金龙鱼油700ml )
大小写处理 单词缩减为词根形式,如“cars”到“car”等 单词转变为词根形式,如“drove”到“drive”等 过滤词语,如去除 the a 中文例如 的 我们 这些没必要的词语 做一些同义词 特殊词语的处理 ,如C++ 等 …………
存在问题:数据库查询关键字的这种方法速度慢,效率低(数据库 对于这方面支持很有限),难以满足大规模并发量的查询。
引擎雏形:为了加速关键词查询这一过程,我们在用户与数据源 (例如mysql)之间加入引擎。引擎完成的功能我们可以简单这样 形容,在插入数据时候将文档进行了关键词分类,这样用户在查询 的时候能够快速锁定到文档位置,从而达到快速搜索。 引擎属于索引查找 把非结构化的数据中的内容提取出来一部分重 新组织,让它变的有结构化,这部分我们提取出来的数据就叫做 索引
那么运动这个keyword的docs数据就是3
hits
1
关键词 击中的文档域数目 2种情况
第一 例如有个商品名字叫做 运动牌运动鞋 那么运动hit就是2 7
第二
商品名字 和 商店名字中都存在 运动关键词(都出现一次) 那么hit
就是2
8
10
索引创建(indexing)
举例说明keyword docs hits Insert into listing (id,rt_shopname,rt_listname,shopname,
查询语句
词法分析处理
语法分析处理
a) 用户输入查询语句。 b) 对查询语句经过语法分析和语言分析 得到一系列词(Term)。 c) 通过语法分析得到一个查询树。 d) 利用查询树搜索索引,从而得到每个 词的文档链表,对文档链表进行交,差, 并得到结果文档。 e) 将搜索到的结果文档对查询的相关性 进行排序。 f) 返回查询结果给用户。
某司使用sphinx的结构图
5
sphinx 全文检索两个过程
索引创建(indexing)将数据源通过一定方式提取信息 搜索索引(search)进根据用户查询请求,搜索创建的索引,返回索引内容
文档索引和属性的解释
文档索引 编制索引的源,sphinx以索引源来编制索引,编制完成后索引源不在存储 文档属性 搜索可以返回的内容,属性可以用来进行文档的过滤
1
7
8
wk.baidu.com
hash key value
Key(充电 宝) value 2
Key(鞋) value 3
Key(哈密 瓜) value 4
3
1
2
5
6
4
7
9
10
12
索引创建(indexing) 请对比与上图的联系 此图就是索引存储方式 13
搜索索引(search) 例如搜索运动鞋
14
搜索索引(search)
3
Sphinx 官方文档介绍
Sphinx官方网址: http://sphinxsearch.com/
Sphinx是一个基于SQL的全文检索引 擎,可以结合MySQL,PostgreSQL做 全文搜索,它可以提供比数据库本身 更专业的搜索功能,使得应用程序更 容易实现专业化的全文检索。Sphinx 特别为一些脚本语言设计搜索API接口, 如PHP,Python,Perl,Ruby等,同 时为MySQL也设计了一个存储引擎插 件。 Sphinx单一索引最大可包含1亿条记录, 在1千万条记录情况下的查询速度为 0.x秒(毫秒级)。Sphinx创建索引的 速度为:创建100万条记录的索引只 需 3~4分钟,创建1000万条记录的索 引可以在50分钟内完成,而只包含最 新10万条记录的增量索引,重建一次 只需几十秒。
赵建亭 大数据专家
Blog:https://blog.csdn.net/zhaojianting
2
我们为什么需要引擎
数据库关键词查询:例如现在有很多文档(文档内容比较长),但 是我们想查询哪些文档内容含有历史(假设查询关键字为 历史)这 个关键字。对于数据库查询方法而言,就是去遍历所有文档,并且 在文档中遍历查看是否存在历史这个关键词。 数据库属于顺序查找 如要找内容包含某个字符串的文件,会一个 文档一个文档的从头到尾的找,如 Like查找。
词法分析语言处理
索引
Mmseg Token 金龙鱼 油 700 ml
分词处理
索引处理(索 引文档关系建 立)
8
索引创建(indexing)
假设我们现在有10件商品从1-10(文档id) 商品名字通过切分后形成如下关系表
词典
hash key value
Key(运动) value 1
Key(充电 宝) value 2
Faster
搜索引擎(sphinx)
1
作者的新书电子版,欢迎您阅读 《elasticsearch7完全开发指南》: https://wenku.baidu.com/view/8ff2ce94591b6bd97f192279168884868762b8e7 《kibana权威指南》: https://wenku.baidu.com/view/24cfee1ce43a580216fc700abb68a98270feac21
listname) values (1,“李宁运动品牌商店”,“篮球运动鞋 运 动型”,“李宁运动品牌商店”,“篮球运动鞋 运动型”); 我们就只看运动这个keyword
Keyword 运动 Docs 1 (文档数目) hits 3 (hit次数)
11
索引创建(indexing)
词典
Key(运动) value 1
6
索引创建(indexing)
索引切分
例如现在我们有一个商品名字叫做金龙鱼油700ml,商品的id 1
现在我们以商品名字为索引插入sphinx Sphinx内置中文分词将切分金龙鱼油700ml 目前按照mmseg算法进行切分中文分词 切分完成后得到以下4个单词
金龙鱼 油 700 ml
用户搜索以上任何单词都可以找到id 1的商品(这是搜索最基本思路)
Key(鞋) value 3
Key(哈密 瓜) value 4
1
3
1
2
7
5
6
4
8
7
9
10 9
索引创建(indexing)
索引中常用名词解释
Keyword
关键词 就是代表切分后索引词 例如运动鞋切分为运动和鞋,那么这
两个词都是关键词
Docs
关键词 击中的文档数目 例如右图 运动下面有三个商品
Key(运动) value 1
7
索引创建(indexing) 分词过滤
带索引文件(例如 金龙鱼油700ml )
大小写处理 单词缩减为词根形式,如“cars”到“car”等 单词转变为词根形式,如“drove”到“drive”等 过滤词语,如去除 the a 中文例如 的 我们 这些没必要的词语 做一些同义词 特殊词语的处理 ,如C++ 等 …………
存在问题:数据库查询关键字的这种方法速度慢,效率低(数据库 对于这方面支持很有限),难以满足大规模并发量的查询。
引擎雏形:为了加速关键词查询这一过程,我们在用户与数据源 (例如mysql)之间加入引擎。引擎完成的功能我们可以简单这样 形容,在插入数据时候将文档进行了关键词分类,这样用户在查询 的时候能够快速锁定到文档位置,从而达到快速搜索。 引擎属于索引查找 把非结构化的数据中的内容提取出来一部分重 新组织,让它变的有结构化,这部分我们提取出来的数据就叫做 索引
那么运动这个keyword的docs数据就是3
hits
1
关键词 击中的文档域数目 2种情况
第一 例如有个商品名字叫做 运动牌运动鞋 那么运动hit就是2 7
第二
商品名字 和 商店名字中都存在 运动关键词(都出现一次) 那么hit
就是2
8
10
索引创建(indexing)
举例说明keyword docs hits Insert into listing (id,rt_shopname,rt_listname,shopname,
查询语句
词法分析处理
语法分析处理
a) 用户输入查询语句。 b) 对查询语句经过语法分析和语言分析 得到一系列词(Term)。 c) 通过语法分析得到一个查询树。 d) 利用查询树搜索索引,从而得到每个 词的文档链表,对文档链表进行交,差, 并得到结果文档。 e) 将搜索到的结果文档对查询的相关性 进行排序。 f) 返回查询结果给用户。