elasticsearch笔记_字段(名词)类型_分析过程(三)

来源:互联网 发布:php页面输出乱码 编辑:程序博客网 时间:2024/06/11 20:38

映射

1.映射

索引(名词)中每个文档都有自己的类型,每种类型都有自己的映射.映射定义了类型中的域:映射定义了每种类型的,以及域的类型,以及elasticsearch如何处理这些域.

elasticsearch里面常用的的类型如下:

  • 字符串: string.
  • 整数 : byte, short, integer, long.
  • 浮点数: float, double.
  • 布尔型: boolean.
  • 日期: date.

查看映射的命令 : GET /索引名称/_mapping/索引类型.

2.string(字符串)的自定义映射

string类型默认是全文类型的数据,也就是说,它的值在索引(动词)前会经过一次分析器,在被搜索时也要经过一次分析器(分析器的解释在下面).

string 域映射的最重要的两个属性indexanalyzer.

  • 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里面内置了很多分析器:
这里写图片描述

注意

查询”全文”类型的数据时会用到分析器,”精确”类型的数据不会用到分析器去分析字符串,而是查询你指定的精确值.

0 0
原创粉丝点击