书的目录与索引
书与搜索引擎是类似的。
·目录页对应正排索引
·索引页对应倒排索引
搜索引擎
·正排索引
-文档Id到文档内容、单词的关联关系
·倒排索引
-单词到文档Id的关联关系css
正排与倒排索引简介
正排索引
-文档Id到文档内容、单词的关联关系
·倒排索引
-单词到文档Id的关联关系
html
倒排索引-查询流程
·查询包含"搜索引擎"的文档
-经过倒排索引得到"搜索引擎"对应的文档Id有1和3
-经过正排索引查询1和3的完整内容
-返回用户最终结果python
倒排索引详解
倒排索引组成:
倒排索引是搜索引擎的核心,主要包含两部分:
-单词词典( Term Dictionary)
-倒排列表( Posting List )
倒排索引一单词词典
·单词词典( Term Dictionary )是倒排索引的重要组成
-记录全部文档的单词,通常都比较大
-记录单词到倒排列表的关联信息
·单词字典的实现通常是用B+ Tree ,示例以下图:
-下图排序采用拼音实现,构造方法参见以下网址
https://www.cs.usfca.edu/~galles/visualization/BPlusTree.html
倒排索引-倒排列表
·倒排列表( Posting List )记录了单词对应的文档集合,由倒排索引项( Posting )组成git
·倒排索引项( Posting )主要包含以下信息:
-文档Id ,用于获取原始信息
-单词频率( TF, Term Frequency ) ,记录该单词在该文档中的出现次数,用于后续相关性算分
-位置( Position ) ,记录单词在文档中的分词位置(多个) ,用于作词语搜索(Phrase Query)
-偏移( Offset ) ,记录单词在文档的开始和结束位置,用于作高亮显示·
以“搜索引擎”为例github
. es存储的是一个json格式的文档,其中包含多个字段,每一个字段会有本身的倒排索引
相似下图:
web
分词介绍
·分词是指将文本转换成一系列单词( term or token )的过程,也能够叫作文本分析,在es里面称为Analysis ,以下图所示:
·分词器是es中专门处理分词的组件,英文为Analyzer ,它的组成以下
- Character Filters
-针对原始文本进行处理,好比去除html特殊标记符
- Tokenizer
-将原始文本按照必定规则切分为单词
- Token Filters
-针对tokenizer处理的单词就行再加工,好比转小写、删除或新增等处理
算法
analyze_api
. es提供了一个测试分词的api接口,方便验证分词效果, endpoint是_analyze
-能够直接指定analyzer进行测试
-能够直接指定索引中的字段进行测试
-能够自定义分词器进行测试
·直接指定analyzer进行测试,接口以下:
当没有定义analyzer的时候会使用默认分词器”analyzer”:”standard”
自定义分词器:tokenizer指名要用哪一个分词器,filter指明的是token filter:
json
自带分词器
.es自带以下的分词器
-Standard Simple
-Whitespace
-Stop
-Keyword
-Pattern
-Languageapi
Standard Analyzer
Simple Analyzer
Whitespace Analyzer
Stop Analyzer
Keyword Analyzer
Pattern Analyzer
Language Analyzer
中文分词
·难点
-中文分词指的是将一个汉字序列切分红一个一个单独的词。在英文中,单词之间是以空格做为天然分界符,汉语中词没有一个形式上的分界符。
-上下文不一样,分词结果迥异,好比交叉歧义问题,好比下面两种分词都合理
-乒乓球拍/卖完了
-乒乓球/拍卖/完了
- https://mp.weixin.qq.com/s/SiHSMrn8lxCmrtHbcwL-NQ
·经常使用分词系统
-IK
-实现中英文单词的切分,支持ik smart, ik maxword等模式
-可自定义词库,支持热更新分词词典,
- https://github.com/medcl/elasticsearch-analysis-ik
- jieba
-python中最流行的分词系统,支持分词和词性标注
-支持繁体分词、自定义词典、并行分词等
- https://github.com/sing1ee/elasticsearch-jieba-plugin
·基于天然语言处理的分词系统
- Hanlp
-由一系列模型与算法组成的Java工具包,目标是普及天然语言处理在生产环境中的应用
- https://github.com/hankcs/HanLP
-THULAC
-THU Lexical Analyzer for Chinese ,由清华大学天然语言处理与社会人文计算实验室研制推出的一套中文词法分析工具包,具备中文分词和词性标注功能
- https://github.com/microbun/elasticsearch-thulac-pluginmarkdown
自定义分词
CharacterFilter
·当自带的分词没法知足需求时,能够自定义分词
-经过自定义Character Filters, Tokenizer和Token Filter实现. Character Filters
-在Tokenizer以前对原始文本进行处理,好比增长、删除或替换字符等
-自带的以下:
-HTML Strip去除html标签和转换html实体
-Mapping进行字符替换操做
-Pattern Replace进行正则匹配替换
-会影响后续tokenizer解析的postion和offset信息
. Character Filters测试时能够采用以下api :
Tokenizer
Tokenizer
-将原始文本按照必定规则切分为单词( term or token )
-自带的以下:
-standard按照单词进行分割
-letter按照非字符类进行分割
-whitespace按照空格进行分割
-UAX URL Email按照standard分割,但不会分割邮箱和url
-NGram和Edge NGram连词分割
-Path Hierarchy按照文件路径进行切割
Tokenizer测试时能够采用以下api:
TokenFilter
. Token Filters
-对于tokenizer输出的单词( term )进行增长、删除、修改等操做
-自带的以下:
-lowercase将全部term转换为小写
-stop删除stop words
-NGram和Edge NGram连词分割
-Synonym添加近义词的term
Filter测试时能够采用以下api:
自定义分词
.自定义分词的api
-自定义分词须要在索引的配置中设定,以下所示:
自定义以下图所示的分词器:
自定义分词验证:
自定义以下图所示的分词器二:
自定义分词验证:
分词使用说明
·分词会在以下两个时机使用:
-建立或更新文档时(Index Time ) ,会对相应的文档进行分词处理
-查询时( Search Time ) ,会对查询语句进行分词
索引时分词
·索引时分词是经过配置Index Mapping中每一个字段的analyzer属性实现的以下:
不指定分词时,使用默认standard
查询时分词
·查询时分词的指定方式有以下几种:
-查询的时候经过analyzer指定分词器
-经过index mapping设置search_analyzer实现
.通常不须要特别指定查询时分词器,直接使用索引时分词器便可,不然会出现没法匹配的状况
分词建议
·明确字段是否须要分词,不须要分词的字段就将type设置为keyword ,能够节省空间和提升写性能
·善用_analyze API ,查看文档的具体分词结果
·动手测试,
官方文档分词连接
https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis.html