ELK--分词&Lunece


前言

百度浏览器搜索“Abner G的CSDN” 如下,如何实现,就需要知道检索的分词,倒排索引的概念。
在这里插入图片描述

结构化数据 VS 非结构化数据

我们生活中的数据总体分为两种:结构化数据 和 非结构化数据 。
结构化数据 :也称作行数据,是由二维表结构来逻辑表达和实现的数据,严格地遵循数据格式与长度规范,主要通过关系型数据库进行存储和管理。指具有固定格式或有限长度的数据,如数据库,元数据等。

非结构化数据 :又可称为全文数据,不定长或无固定格式,不适于由数据库二维表来表现,包括所有格式的办公文档、XML、HTML、word文档,邮件,各类报表、图片和咅频、视频信息等。

说明:如果要更细致的区分的话,XML、HTML可划分为 半结构化数据 。因为它们也具有自己特定的标签格式,所以既可以根据需要按结构化数据来处理,也可抽取出纯文本按非结构化数据来处理。

根据两种数据分类,搜索也相应的分为两种:结构化数据搜索 和非结构化数据搜索 。

对于结构化数据,因为它们具有特定的结构,所以我们一般都是可以通过关系型数据库(mysql,oracle等)的 二维表(table)的方式存储和搜索,也可以建立索引。

对于非结构化数据,也即对全文数据的搜索主要有两种方法:顺序扫描法 ,全文检索 。
----------来源 原来 Elasticsearch 还可以这么理解

顺序扫描 VS 全文检索

顺序扫描 :通过文字名称也可了解到它的大概搜索方式,即按照顺序扫描的方式查询特定的关键字。例如给你一张报纸,让你找到该报纸中*“平安”*的文字在哪些地方出现过。你肯定需要从头到尾把报纸阅读扫描一遍然后标记出关键字在哪些版块出现过以及它的出现位置。
这种方式无疑是最耗时的最低效的,如果报纸排版字体小,而且版块较多甚至有多份报纸,等你扫描完你的眼睛也差不多了。
全文搜索 :对非结构化数据顺序扫描很慢,我们是否可以进行优化?把我们的非结构化数据想办法弄得有一定结构不就行了吗?将非结构化数据中的一部分信息提取出来,重新组织,使其变得有一定结构,然后对此有一定结构的数据进行搜索,从而达到搜索相对较快的目的。
这种方式就构成了全文检索的基本思路。这部分从非结构化数据中提取出的然后重新组织的信息,我们称之索引 。这种方式的主要工作量在前期索引的创建,但是对于后期搜索却是快速高效的。
----------来源 原来 Elasticsearch 还可以这么理解

示例

先设想一个搜索的场景,假设要搜索一首诗句内容中带“龙虎”字的古诗。

nametextaythor
七律·人民解放军占领南京虎踞龙盘今胜昔,天翻地覆慨而慷毛泽东
登邯郸洪波台置酒观发兵风引龙虎旗,歌钟昔追攀李白
牧童词乱插蓬蒿箭满腰,不怕猛虎欺黄犊李涉

传统关系型数据库和 ES 区别

  • 传统关系型数据库
    如果用像 MySQL来存储古诗的话,我们应该会去使用like 的SQL查询
    这种称为顺序扫描法,需要遍历所有的记录进行匹配。不但效率低,而且不符合搜索时的期望。
  • 我们期望是搜索“龙虎”时,通常还希望看到"龙",“龙虎”,“虎” 的搜索结果,就需要搜索引擎来处理

搜索引擎的搜索原理简单概括的话可以分为这么几步:
内容爬取,停顿词过滤,比如一些无用的像"的",“了”之类的语气词/连接词
内容分词,提取关键词
根据关键词建立倒排索引
用户输入关键词进行搜索


分词

分词就是将句子、段落、文章这种长文本,分解为以字词为单位的数据结构,方便后续的处理分析工作。
文本都是一些“非结构化数据”,我们需要先将这些数据转化为“结构化数据”。

IK分词器

分词重点是如何分词,以IK分词器为例;
Java开源,目前分词效率性能第二,支持中文。(第一目前没公布源码);
分词是根据底层词库词库,将文本提取出关键词。

注意ElasticSearch和IK插件版本的对应。

强调下IK分词器的两种分词模式。

  • ik_max_word: 会将文本做最细粒度的拆分,比如会将"中华人民共和国国歌"拆分为"中华人民共和国,中华人民,中华,华人,人民共和国,人民,人,民,共和国,共和,和,国国,国歌",会穷尽各种可能的组合;
  • ik_smart: 会做最粗粒度的拆分,比如会将"中华人民共和国国歌"拆分为"中华人民共和国,国歌"。

IK分词器中字典树

底层将IK分词器中的词库创建字典树。分词的时候按照句子的字符顺序从字典树的root往下走,每走到一个结束节点则分出一个词。这样就会根据IK分词器中的配置,提取出关键字。

IK分词器使用

下载网盘链接:https://pan.baidu.com/s/1ys3x5BcJ8Zgb6uBQ1gRBDw?pwd=1121
提取码:1121

本文使用ELK&IK分词器 均为7.17.0版本(最好使用同一个版本,版本不同ES读取插件会有版本验证,有的博主有提供方法修改Plugin-descriptor.properties 文件中的版本号,有的版本依赖包不同,还是启动不起来,所以建议使用同一个版本)
在这里插入图片描述

安装分词器

解压下载好的文件,拷贝到ElasticSearch的plugins文件夹下
在这里插入图片描述
重启ElasticSearch就好了,安装前后对比

  • 安装之前启动页面
    在这里插入图片描述
  • 安装之后的启动页面
    在这里插入图片描述

分词器效果比较

ES自带分词器(standard)

逐个拆分
在这里插入图片描述

IK分词器( ik_max_word)

中文语法详细拆分
在这里插入图片描述

IK分词器(ik_smar)

智能中文语法拆分
在这里插入图片描述

IK分词器增加自定义词库

以一句绕口令为例“吃葡萄不吐葡萄皮”,默认IK分词器词库分词如下
葡萄皮被分为了葡萄,皮两个词。如果想要葡萄皮一个词,就需要增加自定义的词库。
在这里插入图片描述

配置

  • ik/config/IKAnalyzer.cfg.xml 配置文件下,新增自己的词库配置
    在这里插入图片描述
    配置如下
    在这里插入图片描述

  • 自定义词典
    在这里插入图片描述

  • 分词效果如下
    明显看到出现了葡萄皮这样的新关键词
    在这里插入图片描述

Lunece

全文检索能够快速查询,除了分词之外,还需要关键词和文本等建立倒排索引

倒排索引 VS 正向索引

以示例中的古诗为例

正向索引简图

在这里插入图片描述
一般是通过key,去找value。

假设只存在正向索引,查找存在关键词”虎“ 的古诗,那这样的话需要扫描所有的古诗,来找存在关键词”虎“ 的古诗。

倒排索引简图

在这里插入图片描述
如果是倒排索引,上面的例子就变的简单。

名词术语

  • 词条(Term) :索引里面最小的存储和查询单元,对于英文来说是一个单词,对于中文来说一般指分词后的一个词。
  • 词典(Term Dictionary) :或字典,是词条Term的集合。搜索引擎的通常索引单位是单词,单词词典是由文档集合中出现过的所有单词构成的字符串集合,单词词典内每条索引项记载单词本身的一些信息以及指向“倒排列表”的指针。
  • 倒排表(Post list) :一个文档通常由多个词组成,倒排表记录的是某个词在哪些文档里出现过以及出现的位置。每条记录称为一个倒排项(Posting)。倒排表记录的不单是文档编号,还存储了词频等信息。
  • 倒排文件(Inverted File) :所有单词的倒排列表往往顺序地存储在磁盘的某个文件里,这个文件被称之为倒排文件,倒排文件是存储倒排索引的物理文件。

在这里插入图片描述

Lunece 和ES

Lunece 是单机的,Es基于Lunece为基础做了一个分布式索引库,提供了集群的概念,还提供了api查询接口

ES 优化

ES 为了能快速查找到 term,将term dictionary中所有的 term 排了一个序,二分法查找。
ES 默认可是会对全部 text 字段进行索引,必然会消耗巨大的内存,为此 ES 针对索引进行了深度的优化。
在保证执行效率的同时,尽量缩减内存空间的占用。于是乎就有了 term index。
Term index:从数据结构上分类算是一个“Trie 树”,也就是我们常说的字典树。

全文搜索引擎索引

  • 创建索引使用最细颗粒度分
  • 查询按照最粗颗粒度分

参考博客

IK分词器使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Abner G

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值