前言
本篇文章摘抄于官方文档,作为学习笔记记录
- 全文搜索:我们希望在文本类型的域中进行搜索,还希望搜索能够理解我们的意图
1.1 搜索UK,我们希望返回包含UK AAA,而不返回United Kindom 的文档 - Elasticsearch首先分析文档,之后根据结果创建倒排索引
倒排索引
- 一个倒排索引由文档中所有不重复词的列表构成,对于其中每个词,有一个包含它的文档列表
- 为了创建倒排索引,首先将每个文档的content域拆分成单独的词(词条),创建一个包含所有不重复词条的排序列表,然后列出每个词条出现在哪个文档
- 将词条规范为标准模式,可以找到与用户搜索的词条不完全一致,但具有足够的相关性的文档
3.1 Quick 可以小写化为 quick
3.2 foxes 可以 词干提取 --变为词根的格式-- 为 fox 。类似的, dogs 可以为提取为 dog
3.3 jumped 和 leap 是同义词,可以索引为相同的单词 jump
分析与分析器
- 分析过程
1.1 将一块文本分成适合于倒排索引的独立的词条
1.2 将这些词条统一化为标准格式化以提高“搜索性” - 分析器实际上是将三个功能封装到一个包里:
2.1 字符过滤器
(1)字符串按顺序通过每个字符过滤器:分词前整理字符串
2.2 分词器
(1)字符串被分词器分成单个词条
(2)一个简单的分词器遇到空格和标点的时候,可能会将文本拆分成词条
2.3 Token过滤器
(1)词条按顺序通过每个token过滤器,
(2)这个过程可能会改变词条(例如,小写化Quick),删除词条(例如,像a、and、the等无用词),或者增加词条(例如,像jump和leap这种同义词)
全文查询
该查询使用一种语法来基于操作符(and或or)解析和分割提供的查询字符串。然后,在返回匹配文档之前,查询会独立地分析每个拆分文本
GET /_search
{
"query": {
"query_string": {
"query": "(new york city) OR (big apple)",
"default_field": "content"
}
}
}
- 上面的查询,query_string查询拆分成两部分:new york city和big apple
1.1 在返回匹配的文档之前,内容字段的分析器将每个部分独立地转换为token(因为查询语法没有使用空格作为操作符) - query_string的顶级参数
2.1 analyze_wildcard:如果true,则查询尝试分析查询字符串的通配符
2.2 analyzer:用于将查询字符串中的文本转换为token的分析器