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