写在前面

要做个元数据服务,包括存储和查询。元数据除了一些基本字段外,其他格式是自由的,存储输入为一个JSON形式。比如下面是一个文件对象的元数据:

{
"name":"myfile",
"type":"file",
"user":"ubuntu"
"path":"node00:/path/to/file"
}

而下面这个是表示数据表的元数据:

{
"name":"mytable",
"type":"table",
"user":"ubuntu"
"location":"node00:mysqldb.table_fake",
"schema":["name","age","address"]
}

由于输入格式可变且以JSON形式表示,虽然系统内有类型定义,说明了各个字段的取值类型,但是一些如LIST或者OBJECT之类勉强使用MySQL还是挺累得(需要手动编写代码映射到具体表上的字段)。这从本质上来说JSON对象输入是层次形式的,而关系型数据如MySQL中的数据表式二维平面形式的。

如果单做key-value存储的话使用MongoDB感觉会非常好,完全的schema free,并且也支持一些基本的查询。但是这个元数据服务还要提供一个搜索功能,通常实现这种搜索功能都是比较烦人的事情,尤其是要支持那些模糊查询。一般来说模糊查询想在大规模数据集上取得比较好的查询效率的话,都是需要建立倒排索引的。这方面MongoDB也是支持的,不过后来使用的ElasticSearch它的查询功能就显的比较弱。其实一开始我是拒绝的,感觉ES就是个做搜索的,相对来说不适合做类似业务存储这类实时性要求比较高的存储。不过它提供的搜索过滤和聚集统计功能真的非常爽,再也不用费尽力去写那些查询组合的SQL了。但在数据存储方面确实比MongoDB烦很多。

索引层次

任何查询要提供比暴力搜索好的性能,都需要用到索引,ES当然是不能例外的。而ES中的名称Index和我们所说的索引有些不同,它表示的是一系列字段的索引集合,而不是不是某个字段上的单个索引。因为ES的存储是面向文档的,它的Index意为对文档建立的索引。ES的Index下面可以有不同的Type,对应不同的文档类型。

数据映射

不同的文档类型(Type)可以配套的有一个mapping,负责把输入的JSON中的数据映射为指定的类型。这个过程默认是自动进行的。比如输入以下数据

{"name":"ip-tables", "description":"linux firewall", "version":4}

那么name和description字段自动被判别为字符串类型并会进行分词倒排,而version则是整数类型,可以通过api来查询当前索引的mappings

$ curl  -XPOST '10.214.208.138:9200/mass/demo' -d'{"name":"ip-tables","description":"linux firewall", "version":4}'
$ curl '10.214.208.138:9200/mass/_mappings?pretty'
{
"mass" : {
"mappings" : {
"demo" : {
"properties" : {
"description" : {
"type" : "string"
},
"name" : {
"type" : "string"
},
"version" : {
"type" : "long"
}
}
}
}
}
}

自定义mapping

除了通过提交json数据可以生成mapping外,还可以人为预先的指定。

$ curl  -XDELETE '10.214.208.138:9200/mass'
$ curl -XPOST '10.214.208.138:9200/mass' $ curl -XPUT '10.214.208.138:9200/mass/_mappings/fruit' -d'{"fruit":{"properties":{"name":{"type":"string", "index":"not_analyzed"}}}}'

分词控制

有些字段虽然是文本类型但我们却不想使用分词过程,因为只会进行一些精确查询比如一些枚举字段。可以指定index:not_analyzed

忽略字段

其实这个功能我当时找了半天,因为有这样的需求,对JSON字段中的某些元数据只进行存储即可,不需要进行索引和查询。而ES默认会把它看到的所有字段都建立映射,挺烦人的。可以通过配置索引字段的dynamic参数实现,当其为false时忽略那些在已有mapping中没有相应映射规则的字段,不过这个文档还是会被存储到_source字段中,当其为true时会进行自动的类型映射并更新当前的mapping,还可以指定为strict此时如果提交的和预先设定的mapping不一致则拒绝提交。

ElasticSearch 使用小结的更多相关文章

  1. Elasticsearch使用小结之冷热分离

    Elasticsearch使用小结之冷热分离 索引迁移 索引setting中的index.routing.allocation.exclude和index.routing.allocation.inc ...

  2. ElasticSearch使用小结

    最近有个业务需求,即全文搜索关键字查询列表,因而转向ES的学习,也学习了大半个月了,做个笔记,总结下自己的学习历程. 独自学习一项新技术,总是难免走不少弯路的,在此推荐下ES的基础教程,对,好好学习官 ...

  3. ES使用小结之索引Rollover

    Elasticsearch 使用小结之索引Rollover 索引名 一般而言,客户端将数据每天写入一个索引,比如直接写入YYYY-MM-HH格式的索引,那么我们只需要在写入的客户端里面获取时间,然后得 ...

  4. Elasticsearch alias别名管理小结

    Elasticsearch alias别名管理小结 By:授客 QQ:1033553122 建创测试数据 1 创建别名 2 移除别名 3 创建测试数据 4 批量操作 5 例1. 5 例2. 把多个索引 ...

  5. 面试小结之Elasticsearch篇(转)

    最近面试一些公司,被问到的关于Elasticsearch和搜索引擎相关的问题,以及自己总结的回答. Elasticsearch是如何实现Master选举的? Elasticsearch的选主是ZenD ...

  6. Elasticsearch全文检索实战小结

    一.项目概述 这是一个被我称之为“没有枪.没有炮,硬着头皮自己造”的项目.项目是和其它公司合作的三个核心模块开发. 使用ES的目的是: 1).采集数据.网站数据清洗后存入ES: 2).对外提供精确检索 ...

  7. Elasticsearch学习笔记(七)document小结

    一.生成document id 1.自动生成document id                 自动生成的id,长度为20个字符,URL安全,base64编码,GUID,分布式系统并行生成时不可能 ...

  8. 面试小结之Elasticsearch篇

    https://www.cnblogs.com/luckcs/articles/7052932.html

  9. 搜索引擎 ElasticSearch 之 步步为营1 【环境搭建&初识ElasticSearch】

    1.下载ElasticSearch a.下载Java环境JDK:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloa ...

随机推荐

  1. Swift5 语言参考(七) 属性

    属性提供有关声明或类型的更多信息.Swift中有两种属性,即适用于声明的属性和适用于类型的属性. 您可以通过编写@符号后跟属性的名称以及属性接受的任何参数来指定属性: @attribute name ...

  2. TCPDUMP学习笔记。

    1.启动 普通情况下,直接启动tcpdump将监视第一个网络界面上所有流过的数据包,注意这里使用超级用户.当用户上网得时候,就会将监视得数据打印出来. 我没使用root用户,结果输入tcpdump命令 ...

  3. java分模块项目在idea中使用maven打包失败(ps:maven常用到的命令)

    一.分模块项目打包失败 情况:项目是分模块创建的,一些公共的方法是单独的一个模块common,其他模块依赖于此模块,poom依赖已经添加了,项目可以正常运行,但使用maven打包时出现了问题:找不到依 ...

  4. postgresql-int,bigint,numeric效率测试

    在postgresql9.5的时候做过一个测试就是sum()的效率最终的测试结果是sum(int)>sum(numeric)>sum(bigint)当时比较诧异为啥sum(bigint)效 ...

  5. switch...case... 语句中的类型转换

    switch语句对case表达式的结果类型有如下要求: 要求case表达式的结果能转换为switch表示式结果的类型 并且如果switch或case表达式的是无类型的常量时,会被自动转换为此种常量的默 ...

  6. [Leetcode]44.跳跃游戏Ⅰ&&45.跳跃游戏Ⅱ

    跳跃游戏链接 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否能够到达最后一个位置. 示例 1: 输入: [2,3,1,1,4] 输出 ...

  7. 13-01 java StringBuffer类,StringBuilder类

    StringBuffer类的构造方法 package cn.itcast_01; /* * 线程安全(多线程讲解) * 安全 -- 同步 -- 数据是安全的 * 不安全 -- 不同步 -- 效率高一些 ...

  8. 09-02 java 多态

    多态的前提.多态的特点 /* 多态:同一个对象(事物),在不同时刻体现出来的不同状态. 举例: 猫是猫,猫是动物. 水(液体,固体,气态). 多态的前提: A:要有继承关系. B:要有方法重写. 其实 ...

  9. Spring Boot 基础概述与相关约定配置

    今天打算整理一下 Spring Boot 的基础篇,这系列的文章是我业余时间来写的,起源于之前对微服务比较感兴趣,微服务的范畴比较广包括服务治理.负载均衡.断路器.配置中心.API网关等,还需要结合 ...

  10. setAttribute()、getAttribute()与ele[attr]与自定义属性

    一.自定义属性设置 1.setAttrbute() var q=document.getElementById("q"); q.setAttribute("index&q ...