一、index说明

相信有不少读者用elasticsearch的时候第一个难题就是如何创建好一个index。下面给出具体的样例和原则,帮助大家创建一个相对适合自己业务场景的index,有助于开展后续的开发工作。

先上创建index的模板:

curl -XPUT 'http://127.0.0.1:9200/my_index_name_v1?pretty' -d '{
"aliases": {
"my_index_name": {}
},
"settings": {
"index": {
"refresh_interval": "10s",
"number_of_shards" : "",
"number_of_replicas" : "",
"search.slowlog.threshold.query.warn": "5s",
"search.slowlog.threshold.query.info": "1s",
"search.slowlog.threshold.fetch.warn": "1s",
"search.slowlog.threshold.fetch.info": "800ms",
"indexing.slowlog.threshold.index.warn": "12s",
"indexing.slowlog.threshold.index.info": "5s"
}
},
"mappings": {
"my_type_name": {
"properties": {
"xxx_id": {
"type": "keyword"
},
"timestamp" : {
"type": "long"
},
"@timestamp" : {
"type": "date"
},
"xxx_status": {
"type": "integer"
},
"xxx_content": {
"type": "text"
}
}
}
}
}'

现在讲该模板进行分类讲解:

URI部分

http方法:首先要注意是put方法,es的http接口严格遵从restful风格,创建属于put。大家在用某些工具注意选择正确的方法,比如cerebro插件的默认方法是post,方法使用不当,除了命令执行失败以外还有可能会污染mapping结构。
index名字:若业务类型只需要建立一个固定的index进行业务访问,强烈推荐让你的index名字加后缀_v1,方便后续因为主分片数调整或者调整某字段类型等原因需要reindex。若不加后缀,且没有指定好index的别名,最终的结果是reindex需要业务线停止写入,且需要改代码将访问index名字改为index的别名,这时可能会取名为xxx_v1,导致额外的工作。总之,建议index名字为your_indexname_v1,而别名为index_name。
pretty标记:建议加入,但不强制。

设置部分

refresh_interval:该设置主要是每隔多久刷新数据,可以让刚刚写入的数据被查到。若写入数据量较大或者业务对于变更后及时查到的要求不高,则可以设置时间大一些。推荐一些粗糙的准则,若一天的写入能超过100g的数据量,则建议至少设置为10s,500g设置为60s,1T以上设置为120s。具体的以当时集群硬件配置和所有index读取写入的情况而定。
number_of_shards和number_of_replicas:主分片数和副本分片数,推荐直接设置为12,副本分片数设置为1。具体可以参考文章:https://blog.csdn.net/tanruixing/article/details/87883896
慢日志设置:建议读取写入根据业务访问情况进行设置,唯一需要注意的是不要设置过小,则可能会将磁盘打满,甚至影响数据存储。强烈推荐必须设置,方便后续观察业务使用情况。

mapping部分

  • type名字:一般来讲,推荐一个index对应一个type,若有多个type,则所有的type的字段大部分应该是相同的。若全部不同,推荐将type设置为index的名字,分成多个index,防止由于文档字段稀疏导致浪费存储。
  • 字段名称包含id,推荐用keyword类型,若业务能确认一定是字符串类型,则可以用long型
  • 时间戳类型,推荐为long型,方便业务访问,或者date类型,方便kibana和grafana访问。
  • status或者type字段,推荐用integer类型,便于枚举
  • content字段,推荐确认对应的分词器,设置为text类型,不推荐用keyword。特别是字段很长的情况。

二、命名规范:

1、inde索引命名规范:受文件系统的限制。仅可能为小写字母,不能下划线开头。同时需遵守下列规则:

  1. 不能包括 , /, *, ?, ", <, >, |, 空格, 逗号, #
  2. 7.0版本之前可以使用冒号:,但不建议使用并在7.0版本之后不再支持
  3. 不能以这些字符 -, _, + 开头
  4. 不能包括 . 或 …
  5. 长度不能超过 255 个字符

以上这些命名限制是因为当Elasticsearch使用索引名称作为磁盘上的目录名称,这些名称必须符合不同操作系统的约定。
我猜想未来可能会放开这些限制,因为我们使用uuid关联索引放在磁盘上,而不使用索引名称。

2、类型:类型名称可以包括除了null的任何字符,不能以下划线开头。7.0版本之后不再支持类型,默认为_doc。

3、字段:对字段命名规范及不能完全使用空格。点号可以使用,但用于对象类型,举例:

"foo.bar.baz": "abc"

相当于:

"foo": {
"bar": {
"baz": "abc"
}
}

“对象路径”必须是有效的。所以foo . . bar,这就产生了连锁反应,因为它不能解析到有效路径。类似的:

"foo.": {
"bar": {
"baz": "abc"
}
}

同样这个命名也是不容许的,因为以点号结尾会造成混淆。所以. .不能使用。

4、路由:路由命名也是除了空的任何字符。问题是多个路由值传入查询字符串,使用逗号分隔,如:
?routing=foo,bar

如果路由值包含逗号,会造成路由值解析错误。

三、Elasticsearch支持文档中字段的多种不同数据类型

核心数据类型

字符串:textkeyword

(text类型的数据被用来索引长文本,例如电子邮件主体部分或者一款产品的介绍,这些文本会被分析,在建立索引文档之前会被分词器进行分词,转化为词组。经过分词机制之后es允许检索到该文本切分而成的词语,但是text类型的数据不能用来过滤、排序和聚合等操作。
    keyword类型的数据可以满足电子邮箱地址、主机名、状态码、邮政编码和标签等数据的要求,不进行分词,常常被用来过滤、排序和聚合。
    综上,可以发现text类型在存储数据的时候会默认进行分词,并生成索引。而keyword存储数据的时候,不会分词建立索引,显然,这样划分数据更加节省内存。)

数字:longintegershortbytedoublefloathalf_floatscaled_float

日期:date

日期纳秒:date_nanos

布尔:boolean

二进制:binary

范围:integer_rangefloat_rangelong_rangedouble_rangedate_range

复杂数据类型

对象object:用于单个JSON对象

嵌套nested:用于JSON对象数组

地理数据类型

Geo-point:geo_point表示lat/lon坐标点

Geo-shape:geo_shape用于复杂形状(如多边形)

专门的数据类型

IP:ip用于IPv4和IPv6地址

完成数据类型:completion提供自动完成建议

令牌数:token_count用于计算字符串中的令牌数量

mapper-murmur3:murmur3在索引时计算值的哈希值并将它们存储在索引中

mapper-annotated-text:annotated-text索引包含特殊标记的文本(通常用于标识命名实体)

过滤器:接受来自query-dsl的查询

连接:为同一索引中的文档定义父/子关系

别名:定义现有字段的别名

排名功能:记录数字特性以提高查询时的命中率。

密集向量:记录浮点值的密集向量。

稀疏向量:记录浮点值的稀疏向量。

按类型搜索:类似文本的字段,为查询进行优化,以实现按类型完成

数组

在Elasticsearch中,数组不需要专用字段数据类型,默认情况下,任何字段都可以包含零个或多个值,但是数组中的所有值必须具有相同的数据类型。

多字段

为不同的目的以不同的方式索引相同的字段通常是有用的,例如,字符串字段可以映射为用于全文搜索的text字段,以及用于排序或聚合的keyword字段,或者,你可以使用标准分析器、英语分析器和法语分析器索引文本字段。

这就是多字段的目的,大多数数据类型通过fields参数支持多字段。

四、elasticsearch中的复合主键,类似MYSQL唯一索引功能

在elasticsearch 无法设置多主键,只有唯一ID。
但是我们可以设置ID的规则,来实现多主键。
比如本来想设置两个主键,分别是NAME 和 AGE ,id=name_age
是因为在同一个index下,id是唯一的。

转自:https://blog.csdn.net/tanruixing/article/details/88426009

参考:https://blog.csdn.net/neweastsun/article/details/95868716

参考:https://blog.csdn.net/kakaluoteyy/article/details/80324553

参考:https://blog.csdn.net/ahahwang/article/details/90635324

ES之八:elasticsearch2.x下的JAVA API示例的更多相关文章

  1. MyEclipse下查看Java API帮助文档

    每次重装JDK或者升级JDK时,都会忘了如何使MyEclipse关联帮助文档.然后,再花十几分钟重新google搜索,麻烦! 首先下载Javadoc api帮助文档,google搜一下就行了. MyE ...

  2. HA模式下的java api访问要点

    在非HA架构的HDFS中,客户端要通过java接口调用HDFS时一般是在JobRunner的类中按照下面的方式: 因为nodename只有一个节点所以会在代码中显式的指明要连接哪一个节点:但是在HA模 ...

  3. Linux 下 Hadoop java api 问题

    1. org.apache.hadoop.security.AccessControlException: Permission denied: user=opsuser, access=WRITE, ...

  4. 【Hadoop】HA 场景下访问 HDFS JAVA API Client

    客户端需要指定ns名称,节点配置,ConfiguredFailoverProxyProvider等信息. 代码示例: package cn.itacst.hadoop.hdfs; import jav ...

  5. Java API操作HA方式下的Hadoop

    通过java api连接Hadoop集群时,如果集群支持HA方式,那么可以通过如下方式设置来自动切换到活动的master节点上.其中,ClusterName 是可以任意指定的,跟集群配置无关,dfs. ...

  6. Elasticsearch 2.3.3 JAVA api说明文档

    原文地址:https://www.blog-china.cn/template\documentHtml\1484101683485.html 翻译作者:@青山常在人不老 加入翻译:cdcnsuper ...

  7. Elasticsearch的CRUD:REST与Java API

    CRUD(Create, Retrieve, Update, Delete)是数据库系统的四种基本操作,分别表示创建.查询.更改.删除,俗称"增删改查".Elasticsearch ...

  8. ElasticSearch Java api 详解_V1.0

    /×××××××××××××××××××××××××××××××××××××××××/ Author:xxx0624 HomePage:http://www.cnblogs.com/xxx0624/ ...

  9. [搜索]ElasticSearch Java Api(一) -添加数据创建索引

    转载:http://blog.csdn.net/napoay/article/details/51707023 ElasticSearch JAVA API官网文档:https://www.elast ...

随机推荐

  1. 【数据库】MFC ODBC(四)

    7.滚动记录 CRecordset提供了几个成员函数用来在记录集中滚动.当用这些函数滚动到一个新记录时,框架会自动地把新记录的内容拷贝到域数据成员中. void MoveNext( ); //前进一个 ...

  2. ubuntu下的烧录工具

    Flash Image Tool1.0 为了ubuntu下能够方便地烧录版本,我开发了Flash Image Tool.现在服务器(192.167.100.225)上有一份它的拷贝share/Tool ...

  3. Android逆向之旅---Native层的Hook神器Cydia Substrate使用详解

    一.前言 在之前已经介绍过了Android中一款hook神器Xposed,那个框架使用非常简单,方法也就那几个,其实最主要的是我们如何找到一个想要hook的应用的那个突破点.需要逆向分析app即可.不 ...

  4. jmeter随笔(31)--RandomString和Random函数使用

    在使用jmeter中,用到了一些自带的函数,后面我逐步把自己用到的分享出来,当然这些是比较简单的,也可自己看看英文文档,小怪这里只是结合自己分享. 视频介绍: https://v.qq.com/x/p ...

  5. C++内存管理的原则

    内存管理原则,就是“谁创建,谁释放”或者说“谁申请,谁释放”. 简单地说,在代码上体现为,调用new或malloc等内存分配的人,同时需在内存使用完成后调用delete或free释放. 这个原则看似大 ...

  6. Linux运维学习笔记-TCP三次握手和四次挥手

    TCP三次握手:     TCP四次挥手:

  7. Jenkins自动化部署代码

    通过jenkins自动化部署项目代码可以大幅度节省打包上传部署的时间,提高开发测试的工作效率 ========== 完美的分割线 =========== 1.Jenkins是什么 1)Jenkins是 ...

  8. Ubuntu 16.04 LTS安装 cuda8.0

    参考文献: http://blog.csdn.net/autocyz/article/details/52299889 http://blog.csdn.net/lixintong1992/artic ...

  9. NVIDIA GeForce GTX 960 设备是不可移动的,无法弹出

    系统环境 系统:win7_x64; matlab版本:matlab2017b试用版: GPU:NVIDIA GeForce GTX 960: 问题描述: 第一次使用深度学习实现代码,运行的是matla ...

  10. 在U盘上安装Windows 7的详细步骤

    买到苹果新款MacBook Air后大家最想干的事是什么?体验一下Mac OS X?事实告诉我们有几乎一半的人第一件想要做的事是装一个微软的Windows系统,但问题是新版的MBA已经没有光驱了,这可 ...