ES倒排索引及类型映射与分析器/SE倒排及搜索实现基础
前言
ES快速搜索的基础是建立在逆序索引设计的基础上的, 逆序索引的建立最基础的设计则是对于字符串的词语拆分 ;
通过将全文文本拆分为唯一性单词表,并建立单词与文档的匹配关系,搜索引擎可以通过采用相同策略对于查询条件进行分析, 并根据查询条件所生成的关键词目录对应的从单词-文档映射关系表查找相关的文档,并根据条件匹配度实现相关性排序.
1 数据类型映射
ES会对字段类型进行猜测并动态生成字段和类型的映射关系,
在字段被映射为特定的非文本类型时,其查询方式不同于文本查询匹配规则;(确切值查询与全文文本查询的区别)
但一般来说在未指定查询字段的情况下由于会使用默认的_all进行匹配,也能查询到相应结果;
2 非结构化的全文文本查询与倒排索引(模糊的相关度的查询方式与倒排索引)
倒排索引的建立:(分词技术为基础)——包括单词到词根处理,大小写处理等
1. 文本分析与拆分:将全文文本拆分为唯一性单词表,并建立单词与相关文档的匹配关系
2. 根据单词去匹配相关的文档,并由匹配的程度可得出相关度;
3 分析器
包含三个主要组件:字符过滤器、分词器、标记过滤
3.1 字符过滤器
在标记化前处理字符串。字符过滤器能够去除HTML标记,或者转换 "&"为 “and”。
3.2 分词器
分词器(tokenizer)可以根据空格或逗号将单词分开(译者注:这个在中文中不适用)。
3.3 标记过滤
可以修改词(例如将 "Quick"转为小写),去掉词(例如停用词像 “a”、 “and”、 "the"等等),或者增加词(例如同义词像 "jump"和 “leap”)
ES有许多内建的分析器与子组件,也可以自行组合构建分析器,指定合适的分析器
自行测试分析器效果:
GET /_analyze?analyzer=standard&text=Text to analyze
4. 映射
核心简单字段类型
Elasticsearch支持以下简单字段类型:
类型 | 表示的数据类型 |
---|---|
String | string |
Whole number | byte, short, integer, long |
Floating point | float, double |
Boolean | boolean |
Date | date |
当你索引一个包含新字段的文档——一个之前没有的字段——Elasticsearch将使用动态映射猜测字段类型,这类型来自于JSON的基本数据类型,使用以下规则:
JSON type | Field type |
---|---|
Boolean: true or false | “boolean” |
Whole number: 123 | “long” |
Floating point: 123.45 | “double” |
String, valid date: “2014-09-15” | “date” |
String: “foo bar” | “string” |
注意
这意味着,如果你索引一个带引号的数字—— “123”,它将被映射为 "string"类型,而不是 "long"类型。然而,如果字段已经被映射为 "long"类型,Elasticsearch将尝试转换字符串为long,并在转换失败时会抛出异常。
GET /gb/_mapping/tweet 查看映射的情况
5 复合类型
5.1 多值字段
其类型按照第一个元素来取,因此需保证数组中的值类型相同
5.2 空值
这四个字段将被识别为空字段而不被索引:
"empty_string": "",
"null_value": null,
"empty_array": [],
"array_with_null_value": [ null ]
5.3 多层对象
内部对象并不被特别关注,他们在底层都是一样的
{
"tweet": [elasticsearch, flexible, very],
"user.id": [@johnsmith],
"user.gender": [male],
"user.age": [26],
"user.name.full": [john, smith],
"user.name.first": [john],
"user.name.last": [smith]
}
且对于一个文档的多个对象的数组,在该种结构下会失去数据间的一些映射关系,因此内部对象的关联或嵌套是有必要的。
{
"followers.age": [19, 26, 35],
"followers.name": [alex, jones, lisa, smith, mary, white]
}