
Elasticsearch 倒排索引
正排与倒排索引
我们以一本书为例子,一本书的目录为正排索引,它将排列整本书的主要大纲。而倒排索引就像一些书的附页一样,上面记录着大量与本书相关的关键词。在搜索引擎当中,正排索引是从文档id,文档内容,单词的关联;倒排索引则是单词到文档id的关联。
倒排索引的核心索引
- 倒排索引包含两个部分
- 单词字典(Term Dictionary),记录所有文档的单词,记录单词到倒排索引的关联关系
- 单词字典比较大,可以通过 B+ 树或哈希拉链法的实现,以满足高性能的插入或查询
- 倒排列表(Posting List)记录了单词对应的文档结合,由倒排索引项组成
- 倒排索引项(Posting)
- 文档ID
- 词频 TF - 该单词在文档中出现的次数,用于相关性评分
- 位置(Position)- 单词在文档中分词的位置。用于语句搜索(phrase query)
- 偏移(Offset)- 记录单词的开始结束位置,实现高亮显示。
- 倒排索引项(Posting)
- 单词字典(Term Dictionary),记录所有文档的单词,记录单词到倒排索引的关联关系
举一个简单的例子
当我们从文档内容中去搜索Elasticsearch
时候,右边就是倒排索引显示的结果。
Elasticsearch 的倒排索引
- Elasticsearch 的JSON文档中的每个字段,都有自己的倒排索引。
- 可以指定某些字段不做索引
- 优点:节省存储空间
- 缺点:字段无法被搜索
Analysis 与 Analyzer
- Analysis - 文本分析是把全文本转换为一系列单词(term、token)的过程,也叫分词
- Analysis 是通过 Analyzer 来实现的
- 可以使用 Elasticsearch 内置的分析器 / 或者按需定制化分析器
- 除了在数据写入时转换词条,匹配 Query 语句的时候也需要用相同的分析器对查询语句进行分析
从上图我们可以看见,Elasticsearch Server
被分成elasticsearch
与server
,表明上看通过空格的方式进行的拆分,然后首字母进行小写。
Analyzer 的组成
- 分词器是专门处理分词的组件,Analyzer 由三部分组成
- Character Filters (针对原始文本处理,例如去除html) / Tokenizer(按照规则切分为单词)/ Token Filter(将切分的单词进行加工,小写,删除 stopwords,增加同义词)
Elasticsearch 的内置分词器
- Standard Analyzer - 默认分词器,按词切分,小写处理
- Simple Analyzer - 按照非字母切分(符号被过滤),小写处理
- Stop Analyzer - 小写处理,停用词过滤(the,a,is)
- Whitespace Analyzer - 按照空格切分,不转小写
- Keyword Analyzer - 不分词,直接将输入当作输出
- Patter Analyzer - 支持正则表达式,默认 \W+(非字符分割)
- Language - 提供了30多种常见语言的分词器
- Customer Analyzer 自定义分词器
使用 _analyzer API
- 直接指定 Analyzer 进行测试
- 指定索引的字段进行测试
- 自定义分词进行测试
Standard Analyzer
默认分词器、按词切分、小写处理
#standard
GET _analyze
{
"analyzer": "standard",
"text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening."
}
部分截图
Simple Analyzer
按照非字母切分,非字母的都被去除;小写处理
#simpe
GET _analyze
{
"analyzer": "simple",
"text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening."
}
Whitespace Analyzer
按照空格切分
GET _analyze
{
"analyzer": "whitespace",
"text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening."
}
Stop Analyzer
相比 Simple Analyzer 多了stop filter(会把 the、a、is 等修饰性词语去除)
GET _analyze
{
"analyzer": "stop",
"text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening."
}
Keyword Analyzer
不分词,直接将输入当一个term输出
#keyword
GET _analyze
{
"analyzer": "keyword",
"text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening."
}
Pattern Analyzer
通过正则表达式进行分词;默认是\W+,非字符当符号进行分割
GET _analyze
{
"analyzer": "pattern",
"text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening."
}
Language Analyzer
通过语言的方式进行分割。(这里用英语的方式)
#english
GET _analyze
{
"analyzer": "english",
"text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening."
}
中文分词(ICU Analyzer与其他)
中文分词难点在于不应该拆分成一个个字
- 需要安装
- Elasticsearch-plugin install analysis-icu
- 提供了 Unicode 的支持,更好的支持亚洲语言
POST _analyze
{
"analyzer": "icu_analyzer",
"text": "他说的确实在理”"
}
更多的中文分词器
- IK
- 支持自定义词库,支持热更新分词字典
- https://github.com/medci/elasticsearch-analysis-ik
- THULAC
- THC Lexucal Analyzer for Chinese,清华大学自然语言处理和社会人文计算实验室的一套中文分词
- https://github.com/microbun/elasticsearch-thulac-plugin
欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739
评价
排名
2
文章
657
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 :
好是好,这个对效率影响大不大哇,效率高不高
一个bug让程序员走上法庭 索赔金额达400亿日元
剑轩 : 有点可怕
ASP.NET Core 服务注册生命周期
剑轩 :
http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:
50010702506256


欢迎加群交流技术