ElasticSearch 7.6 学习笔记
文章目录
分词器
分词器概述
分词器包含三部分
- character filter: 分词之前的预处理,过滤掉HTML标签,特殊符号转换等。
- tokenizer: 分词
- token filter: 标准化,大小写,同义词,单复数转换。
分词器的类别
keyword
: 不对输入做任何的处理,直接将输入当做一个 term 输出standard
: 对英文按 word 分词,对中文按照汉字分词- …
创建 & 使用分词器
下面为创建索引时指定类型的设置:
为索引创建了 person 类型,其中包含 user 字段
|
|
- search_analyzer 是搜索词的分词器
- analyzer 是字段文本的分词器
分词器的使用示例
|
|
聚合分析
- Bucket Aggregation
将一些列满足特定条件的文档聚合成一个桶
- Metric Aggreation
一些数学运算,可以对文档的字段进行统计分析
|
|
Term 查询
- Term Query / Range Query / Exists Query / Prefix Query / Wildcard Query
Term 是表达语意的最小单位。搜索和利用统计语言模型进行自然语言处理都需要处理 Term。 Term 查询不做分词,会将输入作为一个整体,在倒排索引中查找准确的词项,并且利用相关度算分公式为每个包含该词的文档进行相关度算分。
ES 默认为每个 text
字段都新建一个 keyword
字段,可以通过 keyword 进行精确查询。
|
|
- 通过
constant_score
可以跳过算分步骤
全文查询
-
Match Query / Match Phrase Query / Query string Query
-
搜索时会分词,查询字符串先找到一个合适的分词器,生成一个供查询的词项列表, 然后针对每个词项在倒排索引中进行查询。
-
Match 查询的过程
结构化搜索
日期,布尔类型和数字都是结构化的,结构化的数据可以使用 Term 查询。搜索结果只有"是"和"否"两个值。
|
|
搜索的相关性算分
相关性描述的是搜索语句和文档的匹配程度。ES 5之前,默认的相关性算分采用 TF-IDF,现在采用 BM 25。
- 词频(Term Frequency): 检索词在一篇文档中出现的频率,
检索词出现的次数 / 文档总字数
- DF: 检索词在所有文档中出现的频率
- 逆文档频率(Inverse Document Frequency):
log(全部文档数/检索词出现过的文档总数)
- TF-IDF 的本质是将 TF 求和变成了加权求和。
TF(Term1) * IDF(Term1) + TF(Term2) * IDF(Term2) ...
Lucene 中的 TF-IDF 评分公式:
|
|
多字符串多字段查询
在 ES 中,有 Query 和 Filter 两种不同的 Context:
- Query Context: 相关性算分
- Filter Context: 不需要算法(Yes or No),可以利用 Cache,获得更好的性能
布尔查询
布尔查询是一个或多个查询子句的组合。
相关性并不是全文本检索的独有特性,也适用于 Yes | No 的子句,匹配的子句越多,相关性越高。如果多条查询语句被合并成一条复合查询语句,例如 bool 查询,则每个查询子句计算出的评分会被合并到总的相关性评分中。
子句 | 说明 |
---|---|
must | 必须匹配,贡献算分 |
should | 选择性匹配,贡献算分 |
must_not | Filter Context,查询子句,必须不能匹配 |
filter | Filter Context,必须匹配,但不贡献算分 |
|
|
|
|
|
|
单字符串多字段查询
场景归纳
最佳字段 (Best Fields)
当字段之间相互竞争,又相互管理。例如 title 和 body 这样的字段
多数字段 (Most fields)
处理英文内容是:一种常见的手段是,在主字段( English Analyzer)上抽取词干,加入同义词,以匹配更多的文档。相同的文本,加入子字段(Standard Analyzer),以提供更加精确的匹配。其他字段作为匹配文档相关度的信号。匹配字段越多则越好。
|
|
混合字段 (Cross Field)
对于某些实体,例如人名,地址,图书信息。需要在多个字段中确定信息,单个字段只能作为整体的一部分。希望在任何列出的字段中找到尽可能多的词。
|
|
Disjunction Max Query
将任何与任一查询匹配的文档作为结果返回。采用字段上最匹配的评分作为最终评分返回。
|
|
多语言及中文分词与检索
- 使用拼音分词器进行分词
|
|
使用 Search-Template 和 Index-Alias 查询
Search Template 可以定义一个查询,将 查询优化 和 使用查询 这两个工作分开, SearchTemplate 的语法参考官方文档。
|
|
Index Alias,为索引创建一个别名,可以实现0停机运维。
|
|
利用 Function-Score-Query 优化算法
|
|
Term&Phrase Suggester
Term Suggester
|
|
Phrase Suggester
|
|