《Elasticsearch核心技术与实战》笔记 -- 第三章:ElasticSearch 入门(2)

573 阅读5分钟

这是我参与11月更文挑战的第11天,活动详情查看:2021最后一次更文挑战

视频课程:极客时间 -- Elasticsearch核心技术与实战-- 配套代码 GitHub

系列文章:

《Elasticsearch核心技术与实战》笔记 -- 第一章:概述

《Elasticsearch核心技术与实战》笔记 -- 第二章:安装上手

《Elasticsearch核心技术与实战》笔记 -- 第三章:入门(1)

倒排索引介绍

正排与倒排索引

图书与搜索引擎的对比

  • 图书
    • 正排索引 - 目录页
    • 倒排索引 - 索引页
  • 搜索引擎
    • 正排索引 - 文档 id 到文档内容和单词的关联
    • 倒排索引 - 单词到文档 id 的关系

实际案例

1、倒排索引.png

倒排索引的核心组成

  • 倒排索引包含两个部分
    • 单词词典 (Term Dictionary),记录所有文档的单词,记录单词到倒排列表的关联关系
      • 单词词典一般比较大,可以通过 B+ 树或哈希拉链发实现,以满足高性能的插入与查询
    • 倒排列表(Posting List) - 记录了单词对应的文档组合,由倒排索引项组成
      • 倒排索引项目(Posting)
        • 文档 ID
        • 词频 TF - 该单词在文档中出现的次数,用于相关性评分
        • 位置(Position)- 单词在文档中分词的位置,用于语句搜索(phrase query)
        • 偏移(Offset)- 记录单词的开始结束位置,实现高亮显示

2、posting list.png

ElasticSearch 的倒排索引

  • ElasticSearch 的 JSON 文档中的每个字段,都有自己的倒排索引
  • 可以指定对某些字段不做索引
    • 优点:节省存储空间
    • 缺点:字段无法被搜索

通过Analyzer进行分词

Analysis 与 Analyzer

  • Analysis - 文本分析是把全文本转换为一系列单词(term / token)的过程,也叫分词
  • Analysis 是通过 Analyzer 来实现的
    • 可使用 ElasticSearch 内置的分析器 / 或者按需定制的分析器
  • 除了在数据写入时转换词条,匹配 Query 语句时候也需要相同的分析器对查询语句进行分析

3、Analysis分词.png

Analyzer 的组成

  • 分词器是专门处理分词的组件,Analyzer 由三部分组成
    • Character Filters :针对原始文本处理,例如去除 html
    • Tokenizer:按照规则切分为单词
    • Token Filter:将切分的单词进行处理、小写,删除 stopwords,增加同义词

4、Analyzer的组成.png

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(默认分词器)

5、standard-analyzer.png

api 操作

一、standard_analyzer.gif

Simple Analyzer

6、simple-analyzer.png api 操作

二、simple_analyzer.gif

Whitespace Analyzer

7、whitespace-analyzer.png

api 操作

三、whitespace_analyzer.gif

Stop Analyzer

8、stop_analyzer.png

api 操作

四、stop_analyzer.gif

KeyWord Analyzer

9、keyword-analyzer.png

api 操作

五、keyword_analyzer.gif

Pattern Analyzer

10、pattern-analyzer.png \W:匹配任何非单词字符,等价于 [^A-Z a-z 0-9_] ;W后有了+,X内的字符可以取任意多个。

api 操作

六、pattern_analyzer.gif

Language Analyzer

www.elastic.co/guide/en/el…

11、language-analyzer.png

api 操作

七、language_analyzer.gif

中文分词的难点

  • 中文句子,切分成一个一个词(不是一个一个字)
  • 英文中,单词由自然的空格作为分隔
  • 一句中文,在不同的上下文,有不同的理解
    • 这个苹果,不大好吃 / 这个苹果,不大,好吃

ICU Analyzer

12、icu-analyzer.png

附上上次安装 icu_analyzer 的步骤:

《Elasticsearch核心技术与实战》笔记 -- 第二章:安装上手

13、安装插件.png

api 操作

八、icu_analyzer.gif

更多的中文分词器

Search API 概览

Search API

  • URI Search
    • 在 URL 中使用查询参数
  • Request Body Search
    • 使用 ElasticSearch 提供的,基于 JSON 格式的更加完备的 Query Domain Specific Language (DSL)

指定查询的索引

语法范围
/_search集群上所有的索引
/index1/_searchindex1
/index1,index-2/_searchindex1和index2
/index*/_search以index开头的索引

URI 查询

  • 使用 "q" ,指定查询字符串
  • “query string syntax”。KV键值对

14、URI查询.png

Request Body

15、Request Body.png

搜索 Response

16、搜索Response.png

搜索的相关性 Relevance

17、搜索的相关性.png

  • 搜索是用户和搜索引擎的对话
  • 用户关心的是搜索结果的相关性
    • 是否可以找到所有相关的内容
    • 由多少不相关的内容被返回了
    • 文档的打分是否合理
    • 结合业务需求,平衡结果排名

Web 搜索

18、web搜索.png

  • Page Rank 算法
    • 不仅仅是内容
    • 更重要的是内容的可信度

电商搜索

19、电商搜索.png

  • 搜索引擎扮演 - 销售 的角色
    • 提高用户购物体验
    • 提升网站销售业绩
    • 去库存

衡量相关性

  • Information Retrieval (信息检索)
    • Precision(查准率) - 尽可能返回较少的无关文档
    • Recall(查全率)- 尽量返回较多的相关文档
    • Ranking(排序) - 是否能够按照相关度进行排序?

Precision & Recall

20、p&r.png

True Positive:正相关;False Positive 负相关;True Negative :正否定;False Negative 负否定;