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
倒排索引的结果如下:
termdoc1doc2QuickXTheXbrownXXdogXdogsXfoxXfoxesXinXjumpedXlazyXXleapXoverXXquickXsummerXtheX现在如果我们想要搜索quick brown,结果如下:
termdoc1doc2brownXXquickX根据结果可以认为quick brown与两个结果都匹配,但是明显与doc1的匹配度更高,就相关性而言,doc1比doc2更好.
但是我们更希望: Quick 可以小写化为 quick 。 foxes 可以 词干提取 –变为词根的格式– 为 fox 。类似的, dogs 可以为提取为 dog 。 jumped 和 leap 是同义词,可以索引为相同的单词 jump 。4.分析
就是将文档拆分成词条然后进行标准化统一.这个过程主要由分析器来实现.
5.分析器
分析器包括:
字符过滤器 : 过滤掉无用词.例如:&变成and.分词器 : 遇到空格或者标点,将文本拆成词条.词条过滤器(token过滤器) : 过滤无用词,添加同义词.例如:去掉and,the,&等.或者添加像 jump 和 leap 这种同义词,elasticsearch里面内置了很多分析器:
注意
查询”全文”类型的数据时会用到分析器,”精确”类型的数据不会用到分析器去分析字符串,而是查询你指定的精确值.