这是我参与11月更文挑战的第11天,活动详情查看:2021最后一次更文挑战
视频课程:极客时间 -- 《Elasticsearch核心技术与实战》-- 配套代码 GitHub
系列文章:
《Elasticsearch核心技术与实战》笔记 -- 第一章:概述
倒排索引介绍
正排与倒排索引
图书与搜索引擎的对比
- 图书
- 正排索引 - 目录页
- 倒排索引 - 索引页
- 搜索引擎
- 正排索引 - 文档 id 到文档内容和单词的关联
- 倒排索引 - 单词到文档 id 的关系
实际案例
倒排索引的核心组成
- 倒排索引包含两个部分
- 单词词典 (Term Dictionary),记录所有文档的单词,记录单词到倒排列表的关联关系
- 单词词典一般比较大,可以通过 B+ 树或哈希拉链发实现,以满足高性能的插入与查询
- 倒排列表(Posting List) - 记录了单词对应的文档组合,由倒排索引项组成
- 倒排索引项目(Posting)
- 文档 ID
- 词频 TF - 该单词在文档中出现的次数,用于相关性评分
- 位置(Position)- 单词在文档中分词的位置,用于语句搜索(phrase query)
- 偏移(Offset)- 记录单词的开始结束位置,实现高亮显示
- 倒排索引项目(Posting)
- 单词词典 (Term Dictionary),记录所有文档的单词,记录单词到倒排列表的关联关系
ElasticSearch 的倒排索引
- ElasticSearch 的 JSON 文档中的每个字段,都有自己的倒排索引
- 可以指定对某些字段不做索引
- 优点:节省存储空间
- 缺点:字段无法被搜索
通过Analyzer进行分词
Analysis 与 Analyzer
- Analysis - 文本分析是把全文本转换为一系列单词(term / token)的过程,也叫分词
- Analysis 是通过 Analyzer 来实现的
- 可使用 ElasticSearch 内置的分析器 / 或者按需定制的分析器
- 除了在数据写入时转换词条,匹配 Query 语句时候也需要相同的分析器对查询语句进行分析
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
GET _analyze
{
"analyzer": "standard",
"text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening;"
}
复制代码
- 指定索引字段进行测试
# 对案例索引 kibana_sample_data_ecommerce中的product_name进行测试
POST kibana_sample_data_ecommerce/_analyze
{
"field": "products.product_name",
"text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening;"
}
复制代码
- 自定义分词器进行测试
# 自定义分词器
POST _analyze
{
"tokenizer": "standard",
"filter": ["lowercase"],
"text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening;"
复制代码
Standard Analyzer(默认分词器)
扫描二维码关注公众号,回复:
13294591 查看本文章

api 操作
Simple Analyzer
api 操作
Whitespace Analyzer
api 操作
Stop Analyzer
api 操作
KeyWord Analyzer
api 操作
Pattern Analyzer
\W:匹配任何非单词字符,等价于 [^A-Z a-z 0-9_] ;W后有了+,X内的字符可以取任意多个。
api 操作
Language Analyzer
api 操作
中文分词的难点
- 中文句子,切分成一个一个词(不是一个一个字)
- 英文中,单词由自然的空格作为分隔
- 一句中文,在不同的上下文,有不同的理解
- 这个苹果,不大好吃 / 这个苹果,不大,好吃
ICU Analyzer
附上上次安装 icu_analyzer
的步骤:
api 操作
更多的中文分词器
- IK
- 支持自定义词库,支持热更新分词字典
- github.com/medcl/elast…
- THULAC
- thulac analysis plugin for elasticsearch,清华大学自然语言处理和社会人文计算实验室的一套中文分词器
- github.com/microbun/el…
Search API 概览
Search API
- URI Search
- 在 URL 中使用查询参数
- Request Body Search
- 使用 ElasticSearch 提供的,基于 JSON 格式的更加完备的 Query Domain Specific Language (DSL)
指定查询的索引
语法 | 范围 |
---|---|
/_search | 集群上所有的索引 |
/index1/_search | index1 |
/index1,index-2/_search | index1和index2 |
/index*/_search | 以index开头的索引 |
URI 查询
- 使用 "q" ,指定查询字符串
- “query string syntax”。KV键值对
Request Body
搜索 Response
搜索的相关性 Relevance
- 搜索是用户和搜索引擎的对话
- 用户关心的是搜索结果的相关性
- 是否可以找到所有相关的内容
- 由多少不相关的内容被返回了
- 文档的打分是否合理
- 结合业务需求,平衡结果排名
Web 搜索
- Page Rank 算法
- 不仅仅是内容
- 更重要的是内容的可信度
电商搜索
- 搜索引擎扮演 - 销售 的角色
- 提高用户购物体验
- 提升网站销售业绩
- 去库存
衡量相关性
- Information Retrieval (信息检索)
- Precision(查准率) - 尽可能返回较少的无关文档
- Recall(查全率)- 尽量返回较多的相关文档
- Ranking(排序) - 是否能够按照相关度进行排序?
Precision & Recall
True Positive:正相关;False Positive 负相关;True Negative :正否定;False Negative 负否定;