ElasticSearch(四):关于es的一些基础知识讲解

上一篇博客更新完以后,我发现一个问题:在我建立索引的时候依旧没法准确的理解每一个字段的意义,因此就有了这个。sql

1. 关于索引

1.1 关于索引的一些基础知识

在建立标准化索引的时候,咱们传入的请求体以下:数据库

{ "settings":{ "number_of_shards":5, "number_of_replicas":1 }, "mappings":{ "novel":{ "properties":{ "id":{ "type":"integer" }, "book_name":{ "type":"text" }, "author":{ "type":"keyword" }, "brief_introduction":{ "type":"text" }, "publish_date":{ "type":"date", "format":"yyyy-MM-dd HH:mm:ss || yyyy-MM-dd" }, "word_count":{ "type":"integer" } } } } }

首先,ElasticSearch的对象模型以下:服务器

  • 索引(Index):至关于数据库,用于定义文档类型的存储;在同一个索引中,同一个字段只能定义一个数据类型;
  • 文档类型(Type):至关于关系表,用于描述文档中的各个字段的定义;不一样的文档类型,可以存储不一样的字段,服务于不一样的查询请求;
  • 文档(Document):至关于关系表的数据行,存储数据的载体,包含一个或多个存有数据的字段;
    • 字段(Field):文档的一个Key/Value对;
    • 词(Term):表示文本中的一个单词;
    • 标记(Token):表示在字段中出现的词,由该词的文本、偏移量(开始和结束)以及类型组成;

因此,上面的请求体咱们就能够这样标记:数据结构

详细的解释下:app

type:目前在6.0的时候,有keyword和text,区别为:ui

  keyword:数据类型用来创建电子邮箱地址、姓名、邮政编码和标签等数据类型,不须要进行分词。能够被用来检索过滤、排序和聚合。keyword 类型字段只能用自己来进行检索。编码

  text:Text 数据类型被用来索引长文本,这些文本会被分析,在创建索引前会将这些文本进行分词,转化为词的组合,创建索引。好比你配置了IK分词器,那么就会进行分词,搜索的时候会搜索分词来匹配这个text文档。可是:text 数据类型不能用来排序和聚合spa

1.2 关于索引的自动建立禁止与否

在上篇博客中,咱们提到,当咱们插入数据的时候,若是有超出咱们结构化的数据的时候,索引会自动更新数据,可是不少时候会出现,不是同一我的操做的时候,插入的数据各式各样的,最后致使索引没法使用!如何解决?3d

dynamic属性有三个值:日志

  true:默认,能够自动建立索引,插入数据字段不符合的话就建立新的索引。

  false:不自动建立索引,当插入数据不符合默认属性的时候,忽略新插入的不符合的字段的值。

  strict:精确的,不容许插入不符合默认属性的值,若是不符合,直接报错。

咱们能够在建立索引的时候,指定索引是绝对的,精确的,就能够避免由于写错而更新了新的字段,以下图:固然咱们也能够设置当插入字段和咱们预先定义的映射不符的话,忽略这些新插入的字段,可是这样的话后期查找问题可能会比较麻烦。

这样的话,当你插入不符合标准化索引的时候,就会提示错误而致使没法插入,固然这样也有麻烦的地方,若是插入数据出错,可能会致使数据丢失,因此若是在项目中你须要这样作的话,最好能够将失败的数据写入日志文件或者直接写入数据库,这样就能够避免数据的丢失了,也能够从新拿到失败的数据进行从新索引。

1.3 关于文档类型的属性

文档属性定义了文档类型的共用属性,适用于文档的全部字段。固然也能够指定字段属性,只适用于某个特定的字段。

  • dynamic_date_formats属性:该属性定义能够识别的日期格式列表;若是文档中有多个字段都是时间格式,能够通用的进行设置。
  • dynamic属性:默认为true,容许动态地向文档类型中加入新的字段。可选值为:true,false,strict。上面已经介绍过了(详见1.2.)。

1.4 关于文档字段的属性值

1.4.1 字段的数据类型

字段的数据类型由字段的属性type指定,ElasticSearch支持的基础数据类型主要有:

  • 字符串类型:keyword和text。(在5.0以后更改,原来为string)。详细的介绍见1.1。
  • 数值类型:字节(byte)、2字节(short)、4字节(integer)、8字节(long)、float、double;
  • 布尔类型:boolean,值是true或false;
  • 时间/日期类型:date,用于存储日期和时间;
  • 二进制类型:binary;
  • IP地址类型:ip,以字符串形式存储IPv4地址;
  • 特殊数据类型:token_count,用于存储索引的字数信息

1.4.2 字段的公共属性:

  • index:该属性控制字段是否编入索引被搜索,该属性共有三个有效值:analyzed、no和not_analyzed:store:指定是否将字段的原始值写入索引,默认值是no,字段值被分析,可以被搜索,可是,字段值不会存储,这意味着,该字段可以被查询,可是不会存储字段的原始值。
    • analyzed:(默认属性)表示该字段被分析,编入索引,产生的token能被搜索到;
    • not_analyzed:表示该字段不会被分析,使用原始值编入索引,在索引中做为单个词;
    • no:不编入索引,没法搜索该字段;
    • 其中analyzed是分析,分解的意思,默认值是analyzed,表示将该字段编入索引,以供搜索。
  • boost:字段级别的助推,默认值是1,定义了字段在文档中的重要性/权重;
  • include_in_all:该属性指定当前字段是否包括在_all字段中,默认值是ture,全部的字段都会包含_all字段中;若是index=no,那么属性include_in_all无效,这意味着当前字段没法包含在_all字段中。
  • copy_to:该属性指定一个字段名称,ElasticSearch引擎将当前字段的值复制到该属性指定的字段中;
  • doc_values:文档值是存储在硬盘上的索引时(indexing time)数据结构,对于not_analyzed字段,默认值是true,analyzed string字段不支持文档值;
  • fielddata:字段数据是存储在内存中的查询时(querying time)数据结构,只支持analyzed string字段;
  • null_value:该属性指定一个值,当字段的值为NULL时,该字段使用null_value代替NULL值;在ElasticSearch中,NULL 值不能被索引和搜索,当一个字段设置为NULL值,ElasticSearch引擎认为该字段没有任何值,使用该属性为NULL字段设置一个指定的值,使该字段可以被索引和搜索。

1.4.3 字符串类型经常使用的其余属性

  • analyzer:该属性定义用于创建索引和搜索的分析器名称,默认值是全局定义的分析器名称,该属性能够引用在配置结点(settings)中自定义的分析器;
  • search_analyzer:该属性定义的分析器,用于处理发送到特定字段的查询字符串;
  • ignore_above:该属性指定一个整数值,当字符串字段(analyzed string field)的字节数量大于该数值以后,超过长度的部分字符数据将不能被analyzer处理,不能被编入索引;对于 not analyzed string字段,超过长度的部分字符将被忽略,不会被编入索引。默认值是0,禁用该属性;
  • position_increment_gap:该属性指定在相同词的位置上增长的gap,默认值是100;
  • index_options:索引选项控制添加到倒排索引(Inverted Index)的信息,这些信息用于搜索(Search)和高亮显示:
    • docs:只索引文档编号(Doc Number)
    • freqs:索引文档编号和词频率(term frequency)
    • positions:索引文档编号,词频率和词位置(序号)
    • offsets:索引文档编号,词频率,词偏移量(开始和结束位置)和词位置(序号)
    • 默认状况下,被分析的字符串(analyzed string)字段使用positions,其余字段使用docs; 

  分析器(analyzer)把analyzed string 字段的值,转换成标记流(Token stream),例如,字符串"The quick Brown Foxes",可能被分解成的标记(Token)是:quick,brown,fox。这些词(term)是该字段的索引值,这使用对索引文本的查找更有效率。字段的属性 analyzer 用于指定在index-time和search-time时,ElasticSearch引擎分解字段值的分析器名称。

2. 关于请求方法

在使用ElasticSearch的时候,咱们会牵扯到不少的请求方法,好比GET,POST,PUT,DELETE等等,这些方法使用的都是Restful的调用风格,咱们来简单介绍下这些方法

 

  • GET 请求:获取服务器中的对象
    • 至关于SQL的Select命令
    • GET /book 获取全部的book信息
  • POST 请求:在服务器上更新对象
    • 至关于SQL的update命令
    • POST /book/1 更新id为1的book的信息
  • PUT 请求:在服务器上建立对象
    • 至关于SQL的create命令
    • PUT /book/id 建立一个id为xx的书
  • DELETE 请求:删除服务器中的对象HEAD 请求:仅仅用于获取对象的基础信息
    • 至关于sql中的delete命令
    • DELETE /book/1 删除id为1的书

 写在最后

 (部分摘自博客:http://www.cnblogs.com/ljhdo/做者悦光阴

相关文章
相关标签/搜索