映射
1.映射
索引(名词)中每个文档都有自己的类型,每种类型都有自己的映射.映射定义了类型中的域:映射定义了每种类型的域,以及域的类型,以及elasticsearch如何处理这些域.
elasticsearch里面常用的域的类型如下:
- 字符串: string.
- 整数 : byte, short, integer, long.
- 浮点数: float, double.
- 布尔型: boolean.
- 日期: date.
查看映射的命令 : GET /索引名称/_mapping/索引类型.
2.string(字符串)的自定义映射
string类型默认是全文类型的数据,也就是说,它的值在索引(动词)前会经过一次分析器,在被搜索时也要经过一次分析器(分析器的解释在下面).
string 域映射的最重要的两个属性index和analyzer.
index : 可以定义怎样控制字符串.包括:
- analyzed : 用分析器(以全文形式搜索).
- not_analyzed : 不用分析器(以精确形式搜索).
- no : 本域不可被搜索.
analyzer : 对于analyzed的域指定分析器.(elasticsearch默认指定standard分析器,可以替换为whitespace 、 simple 或者english).
注意
- elasticsearch允许增加一个映射(可以是已经存在的),但是不可以修改一个已经存在的映射,如果想要修改,只能通过先删除,再添加.
- 尤其不能将一个存在的域从 analyzed 改为 not_analyzed
- 原因 : 如果一个域的映射已经存在,那么该域的数据可能已经被索引。如果你意图修改这个域的映射,索引的数据可能会出错,不能被正常的搜索。
3.复杂核心类型的域
- 多值域 : 一个域里面有好几个值.例如:{ “tag”: [ “search”, “nosql” ]}这样的域以数组的形式处理标签,数组中所有的值必须是同一类型的.从elasticsearch里面获取的_source域是按照添加的顺序被显示,但是索引(动词)的时候是无序的.
lucene实际上对于数组的存储是:
{
"followers": [
{ "age": 35, "name": "Mary White"},
{ "age": 26, "name": "Alex Jones"},
{ "age": 19, "name": "Lisa Smith"}
]
}
存储结果如下:
{
"followers.age": [19, 26, 35],
"followers.name": [alex, jones, lisa, smith, mary, white]
}
空域(null):其实Lucene是不会存储null值的,只不过将以下三种形式不会被索引(动词).
“null_value”: null,
“empty_array”: [],
“array_with_null_value”: [ null ]多层级对象:对象里面套着对象.
{
"tweet": "Elasticsearch is very flexible",
"user": {
"id": "@johnsmith",
"gender": "male",
"age": 26,
"name": {
"full": "John Smith",
"first": "John",
"last": "Smith"
}
}
}
Lucene内部的存储结果如下:
{
"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]
}
分析
elasticsearch中的数据分为两类 : “精确值”和”全文”.
1.精确值 :
精确值是指一些精确的数据,通常是用来精确的完全匹配的数据.例如:人的名称,性别,手机号码等几乎唯一的数据.
2.全文
全文是指文本数据,通常是指非结构化数据,或者人类很容易辨识的语言书写而计算机却无法准确解析的数据.例如:邮件的内容,一篇文章的内容等.
3.倒排索引
将文档的content拆分成单个的词条,创建一个包含所有不重复词条的列表,然后列出每个词条出现在那个文档.例如(来自elasticsearch官网):
假设现在有两个文档:
1.The quick brown fox jumped over the lazy dog
2.Quick brown foxes leap over lazy dogs in summer倒排索引的结果如下:
term doc1 doc2 Quick X The X brown X X dog X dogs X fox X foxes X in X jumped X lazy X X leap X over X X quick X summer X the X
现在如果我们想要搜索quick brown,结果如下:
term doc1 doc2 brown X X quick X 根据结果可以认为quick brown与两个结果都匹配,但是明显与doc1的匹配度更高,就相关性而言,doc1比doc2更好.
但是我们更希望:
- Quick 可以小写化为 quick 。
- foxes 可以 词干提取 –变为词根的格式– 为 fox 。类似的, dogs 可以为提取为 dog 。
- jumped 和 leap 是同义词,可以索引为相同的单词 jump 。
4.分析
就是将文档拆分成词条然后进行标准化统一.这个过程主要由分析器来实现.
5.分析器
分析器包括:
- 字符过滤器 : 过滤掉无用词.例如:&变成and.
- 分词器 : 遇到空格或者标点,将文本拆成词条.
- 词条过滤器(token过滤器) : 过滤无用词,添加同义词.例如:去掉and,the,&等.或者添加像 jump 和 leap 这种同义词,
elasticsearch里面内置了很多分析器:
注意
查询”全文”类型的数据时会用到分析器,”精确”类型的数据不会用到分析器去分析字符串,而是查询你指定的精确值.