设为首页 加入收藏

TOP

〈二〉ElasticSearch的认识:索引、类型、文档(二)
2019-09-19 18:10:13 】 浏览:119
Tags:ElasticSearch 认识 索引 类型 文档
uot; } } ] }

查看索引别名:

  • 方法一:通过查看索引来查看索引别名:GET /product
  • 方式二:通过命令GET /product/_alias
  • 【索引别名有了就会生效,不信你在GET /product的时候直接用上别名】

删除索引别名:

语法:

POST /_aliases
{
    "actions":[
        {
            "remove":{
                "index":"索引名",
                "alias":"索引别名"
            }
        }
    ]
}

例子:

POST /_aliases
{
  "actions":[
    {
      "remove":{
        "index":"product",
        "alias":"pdt"
      }
    }
    ]
}

【你应该看到了,actions里面是一个数组,所以你是可以同时进行多个操作的。】




补充

  • 有很多关于index的配置。由于也是一个比较大的知识点(需要一些前置知识,单独在这里讲的话会很空白),将会单独列出来。
  • index有个mapping配置,mapping定义整体的index的document的结构,和影响分词策略。由于会影响搜索,所以把这个归为搜索的分支知识点,将留到搜索篇再谈。

小节总结:

本小节讲了如何创建索引,如何查看索引、如何删除索引、如何修改索引(修改副本分片数量)、如何关闭/开启索引、如何定义索引别名。
目的在于介绍如何创建存储document的逻辑结构--索引,虽然我们有时候是不需要手动显示创建索引的,但手动创建是个必须了解的知识,因为mapping和分词器有时候需要手动来指定。


类型type

类型type也是用于存储document的逻辑结构,相对于index来说,type是index的下级,所以通常在面向有实际意义的数据时,index作为大类的划分,type作为小类的划分。比如如果把book书作为一个大类来建立index的话,那么书的类型(小说类、文学类、IT技术类等)就可以作为type。


你可能以为下面要讲如何CRUD类型type了吧。但其实这里并不需要讲这些,因为type其实并不真的用来划分逻辑结构,它只是意义上的!ElasticSearch使用了Lucene的底层架构,而Lucene是没有type。


上面说了,index就像sql中的库,type就像sql中的表,document就像sql中的记录。
但事实上,ElasticSearch“真正用于分隔数据的结构“只有index,而没有type,type实际上作为了一个元数据(类似SQL中的id,作为额外的标识数据)来实现逻辑划分。【如果你不懂的话,可以从SQL方面想,就好像一个职员表,一条记录中的某一个字段说明了他属于哪个部门】。当然了,这是一些偏原理的内容了。这些都将留到原理篇来阐述。这里仅仅是浅尝即止。
不过由于没有type没有真实地用于分隔数据,所以要注意结构类型偏差太大的数据还是不要放在一个index好。


之前说了,index用来划分大类,type用来划分小类。而可能有些人会把这个大类定的过大,比如电影和书籍这两个小类(type)的数据大多是不一样的,但他们都可以属于娱乐这一个大类(index),由于type并没有真实地用于分隔数据地用于存储数据,所以数据存储的时候针对的还是index。

ElaticSearch并不是完全无结构的,不要与某些NoSQL数据库混为一谈,虽然它的结构非常灵活(面向json,可以随意增加字段)。在index中还有一个mapping,mapping管理了整个index的各个字段的属性,也就是定义了整个index中document的结构。我们在index下不同type中定义的document的字段都会在mapping中。所以说,如果你定义的多个type的结构偏差太大,那么会导致mapping需要存储的字段的数据过多,同时也影响index的物理存储结构,因为index会按照mapping来存储数据。【换到SQL中的话,也就是比如你有一个商品表,商品表下面有各种商品(书籍、食物),而它们的数据是很不一样的,比如书籍有出版日期,食物有保质期,如果把它们都放到一个表中的话,那么就会导致这个表的字段过多。】


如何测试document文档的数据结构是面向index?【这个测试你可以不做,现在仅仅记住上面的知识点,测试后面再做,因为这个涉及到一些后面的知识】
1.定义一个document的一个字段为date类型;然后在另一个type中添加为text类型的同名字段。
当我们直接插入document的时候,如果不指定document的数据结构,那么ElastciSearch会基于dynamic mapping来自动帮我们声明每一个字段的数据类型,比如"content":"hello world!"会被声明成字符串类型,"post_date":"2017-07-07"会被认为是date类型。如果我们首先在一个type中声明了content为字符串类型,再在另外一个type中声明成日期类型,这会报错,因为对于index来说,这个content已经被声明成字符串类型了。

2.查看mapping:
在查看mapping的时候,我们是通过查看索引来查看的,其实也反向证明了mapping是面向index的。


补充:

  • 上面说了index的mapping会存储完整的多个type的字段信息,如果type的字段差别太大,那么就会导致mapping需要存储的字段过多。ElasticSearch维护组织后面发现这多个type的情况确实有点烦人。于是他们准备让一个index只放一个type了,在6.x版本中,一个索引下只有一个type,如果声明多个type,会被标记为过期,但是仍可以使用。7.0之后的版本将完全移除ElasticSearch移除多个type

小节总结:

  • 本节重新解释了type的意义,type实际上是作为document中的一个固定字段存在的,文档的数据结构是面向index的,所以不能把字段差异性较大的数据存储在一个index中。

文档document

文档的格式是json式的。
对于文档,有几个主要的标识信息:_index(插入到哪个索引中),_type(插入到哪个类型中),_id(文档的id是多少),在插入一个文档的时候,这几个信息也是必须的。

  • 在考虑web开发的大多都知道json的基本格式,所以我这里只会编写一个简单的json数据作为例子,json数据里面的数据类型问题留到后面再进行补充。

插入文档

语法:

PUT /index/type/id
json格式的数据

例子:

PUT /douban/book/4
{
    "book_id":4,
    "book_name":"Other Voices, Other Rooms",
    "book
首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇redis入门初学知识 下一篇Oracle 11g Dataguard参数详解

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目