学习目标
分析器的组成 内置分析器 什么是mapping 手动创建mapping mapping复合数据类型
分析器的组成
分析器(analyzer)就是将一句话切分成各个词语,同时也可能对单词就行时态转化,单复数转化等,方便es建立倒排索引,主要由字符过滤器、分词器、标记过滤组成。
字符过滤器(character filter)主要是在分词之前对句子进行预处理,比如将html过滤掉,将&转成and
分词器(tokenizer)被标记化成独立的词。一个简单的分词器可以根据空格或逗号将单词分开(中文不适用)
标记过滤(token filters),主要将大写转小写,去掉 a,the an 这种没有意义的停用词,同义词转化等。
内置分析器
es提供了一些内建分析器。
"Set the shape to semi-transparent by calling set_trans(5)"
//
标准分析器(standard):是es默认的分析器,如果没有特殊要求,是任何语言最佳的选择。
set, the, shape, to, semi, transparent, by, calling, set_trans, 5
//
简单分析器(simple):非单个字母的文本切分,然后把每个词转为小写
set, the, shape, to, semi, transparent, by, calling, set, trans
//
空格分析器(whitespace):简单的根据空格拆分
Set, the, shape, to, semi-transparent, by, calling, set_trans(5)
语言分析器:特定语言分析器适用于很多语言,例如,english分析器
当我们对文档新增新的字符串字段,它将自动设置它为全文string字段并用standard分析器分析,当然我们通常都需要设置,所以我们需要人工设置映射(mapping)来改变这些字段。
什么是mapping
映射(mapping)就是确认字段数据类型,数据类型不一样,分词的结果可能就不一样,可以理解成传统数据库的模式定义。
es支持下面这些字段
string、byte、short、integer、long、float、double、boolean、date
JSON type | Field type |
---|---|
true or false | boolean |
123 | long |
“123” | string |
123.45 | double |
2014-09-15 | date |
“foo bar” | string |
手动创建mapping
查询映射
格式:GET /index/_mapping/type
如:GET /test_index/_mapping/test_type
指定数据类型
{
"number_of_clicks": {
"type": "integer"
}
}
映射中最重要的字段参数是type,用它来指定数据类型,但是通常我们使用string会比较多,
对于string类型还有两个重要的映射参数是index和analyer。
index的值可以是 analyzed、not_analyzed、no,介绍见下面表格
analyer的值可以是 whitespace、simple或english 默认是standard
{
"tag": {
"type": "string",
"index": "not_analyzed"
}
}
值 | 解释 |
---|---|
analyzed | 首先分析这个字符串,然后索引。换言之,以全文形式索引此字段。 |
not_analyzed | 索引这个字段,使之可以被搜索,但是索引内容和指定值一样。不分析此字段。 |
no | 不索引这个字段。这个字段不能为搜索到 |
注意 其他简单类型(long、double、date等等)也接受index参数,但相应的值只能是no和not_analyzed,它们的值不能被分析。 重要 如果一个字段的映射已经存在,我们不能修改它,所以就必须在创建索引的时候就确定了,但是我们可以新增一个新字段和新字段的mapping
新增一个index,并指定各个字段的mapping
PUT /gb
{
"mappings": {
"tweet" : {
"properties" : {
"tweet" : {
"type" : "string",
"analyzer": "english"
},
"date" : {
"type" : "date"
},
"name" : {
"type" : "string"
},
"user_id" : {
"type" : "long"
}
}
}
}
}
对一个已经存在的index,新增字段的mapping
PUT /gb/_mapping/tweet
{
"properties" : {
"tag" : {
"type" : "string",
"index": "not_analyzed"
}
}
}
mapping复合数据类型
空字段:空字段没有任何意义,所以将会被识别为空字段而不被索引
"empty_string": "",
"null_value": null,
"empty_array": [],
"array_with_null_value": [ null ]
数组
{ "tag": [ "search", "nosql" ]}
数组每个值他的类型必须一样。