【大数据----ElasticSearch】命令1

CURL命令

curl -XPUT 'http://node1.sunny.cn:9200/index_name/'

PUT/POST都可以CURL创建索引

  • 简单认为是可以在命令行下访问url的一个工具
  • curl是利用URL语法在命令行方式下工作的开源文件传输工具,使用 curl可以简单实现常见的get/post请求。
  • -x 指定http请求的方法
  • HEAD GET POST PUT DELETE –

-d 指定要传输的数据CURL建立索引库


#创建索引

curl -XPOST http://node1.sunny.cn:9200/es-test/emp/1 -d'{"first_name" : "John","last_name" : "Smith","age" : 25,"about" : "I love to go rockclimbing","interests": ["sports","music"]}'

 

PUT 和POST用法

PUT是幂等方法, POST不是。所以PUT用于更新、 POST用于 新增比较合适。

  • PUT, DELETE操作是幂等的。所谓幂等是指不管进行多少次操作,结果都一样。比如我用PUT修改一篇文章,然后在做同样的操作,每次操作后的结果并没有不同, DELETE也是一样。
  • POST操作不是幂等的,比如常见的POST重复加载问题:当我们多次发出同样的POST请求后,其结果是创建出了若干的资源。
  • 还有一点需要注意的就是,创建操作可以使用POST,也可以使用PUT,区别在于POST是作用在一个集合资源之上的( /articles),而PUT操 作是作用在一个具体资源之上的( /articles/123), 比如说很多资源 使用数据库自增主键作为标识信息,而创建的资源的标识信息到底是 什么只能由服务端提供,这个时候就必须使用POST。创建索引注意事项索引库名称必须要全部小写,不能以下划线开头,也不能包含逗号

如果没有明确指定索引数据的ID,那么es会自动生成一个随机的ID,需要使用POST 参数

curl -XPOST http://node1.sunny.cn:9200/es-test/emp/ -d '{"first_name" :"John"}'

如果想要确定我们创建的都是全新的内容

– 1:使用自增ID
– 2:在url后面添加参数

curl -XPUT http://node1.sunny.cn:9200/estest/emp/2?op_type=create -d '{"name":“zs","age":25}'
curl -XPUT http://node1.sunny.cn:9200/es-test/emp/2/_create -d'{"name":“laoxiao","age":25}'

– 如果成功创建了新的文档, Elasticsearch将会返回常见的元数据以及201Created 的HTTP反馈码。而如果存在同名文件, Elasticsearch将会返回一个409 Code的HTTP的状态码GET查询索引

– 根据员工id查询

curl -XGET http://node1.sunny.cn:9200/es-test/emp/1?pretty

– 在任意的查询字符串中添加pretty参数, es可以得到易于识别的json结果。

– curl后添加-i 参数,这样你就能得到反馈头文件

curl -i http://node1.sunny.cn:9200/es-test/emp/1?prettyGET查询索引

– 检索文档中的一部分,如果只需要显示指定字段,

curl -XGET http://node01.sunny.cn:9200/estest/emp/1?_source=name,age

– 如果只需要source的数据

curl –XGET http://node1.sunny.cn:9200/es-test/emp/1/_source

– 查询所有

curl -XGET http://node1.sunny.cn:9200/es-test/emp/_search

– 你可以再返回的 hits 中发现我们录入的文档。搜索会默认返回最前的 10个数值。

– 根据条件进行查询

curl -XGET http://node1.sunny.cn:9200/estest/emp/_search?q=last_name:SmithDSL 查询Domain Specific Language

– 领域特定语言

curl -XGET http://node1.sunny.cn:9200/es-test/emp/_search -d'{"query":{"match":{"last_name":"Smith"}}}' 
MGET查询使用mget API获取多个文档

– 如果你需要的文档在同一个_index或者同一个_type中,你就可以在URL中 指定一个默认的/_index或者/_index/_type

curl -XGET http://node1.sunny.cn:9200/_mget?pretty -d'
{
  "docs":[
    {"_index":“es-test","_type":"emp","_id":2,"_source":"name"},
    {"_index":"website","_type":"blog","_id":2}
  ]
}'
– curl -XGET http://node1.sunny.cn:9200/es-test/emp/_mget?pretty -d'{"docs":[{"_id":1},{"_type":"blog","_id":2}]}‘
  • 如果所有的文档拥有相同的_index 以及 _type,直接在请求中添加ids的数组即可 
    – curl -XGET http://node1.sunny.cn:9200/estest/emp/_mget?pretty -d '{"ids":["1","2"]}'

     

  • 注意:如果请求的某一个文档不存在,不会影响其他文档的获取结果。HTTP返回状态码依然是200,这是因为mget这个请求本身已经成功完成。要确定独立的文档是否被成功找到,需要检查found标识HEAD使用如果只想检查一下文档是否存在,你可以使用HEAD来替代 GET方法,这样就只会返回HTTP头文件
– curl -i -XHEAD http://node1.sunny.cn:9200/es-test/emp/1

Elasticsearch的更新ES可以使用PUT或者POST对文档进行更新,如果指定ID的文 档已经存在,则执行更新操作

  • 注意:执行更新操作的时候

– ES首先将旧的文档标记为删除状态
– 然后添加新的文档
– 旧的文档不会立即消失,但是你也无法访问
– ES会在你继续添加更多数据的时候在后台清理已经标记为删除状态的 文档

  • 局部更新,可以添加新字段或者更新已有字段(必须使用POST)
– curl -XPOST http://node1.sunny.cn:9200/es-test/emp/1/_update -d'{"doc":{"city":"beijing","car":"BMW"}}'


•Elasticsearch的删除

curl -XDELETE http://node0.sarnath.cn:9200/es-test/emp/4/


• 如果文档存在, es会返回200 ok的状态码, found属性值为 true, _version属性的值+1
• found属性值为false,但是_version属性的值依然会+1,这 个就是内部管理的一部分,它保证了我们在多个节点间的不同 操作的顺序都被正确标记了
• 注意:删除一个文档也不会立即生效,它只是被标记成已删除。Elasticsearch将会在你之后添加更多索引的时候才会在后台进 行删除内容的清理通过查询API删除指定索引库下指定类型下的数据

curl -XDELETE 'http://node01.sarnath.cn:9200/estest/emp/_query?q=user:kimchy'
curl -XDELETE 'http://node01.sarnath.cn:9200/es-test/emp/_query' -d'{ "query" : { "term" : { "user" : "kimchy" } } }


•Elasticsearch的删除通过查询API删除指定索引库下多种类型下的数据

curl -XDELETE 'http://localhost:9200/es-test/emp,user/_query?q=user:kimchy‘


• 通过查询API删除多个索引库下多种类型下的数据

curl -XDELETE 'http://node01.sarnath.cn:9200/estest,index/emp,user/_query?q=user :kimchy'


或者删除所有索引库中的匹配的数据

curl -XDELETE 'http://node01.sarnath.cn:9200/_all/_query?q=tag:wow'


•Elasticsearch的批量操作bulk与mget类似, bulk API可以帮助我们同时执行多个请求
• 格式:
– action: index/create/update/delete
– metadata: _index,_type,_id
– request body: _source(删除操作不需要)
{ action: { metadata }}\n
{ request body }\n
{ action: { metadata }}\n
{ request body }\n
• 使用curl -XPOST -d 时注意,不能直接在json字符串中添加\n字符,应该按回车
• create 和index的区别
– 如果数据存在使用create操作失败,会提示文档已经存在使用index则可以成功执行。
• 使用文件的方式

– vi requests
– curl -XPOST/PUT localhost:9200/_bulk --data-binary @request;


• bulk请求可以在URL中声明/_index 或者/_index/_type
• bulk一次最大处理多少数据量
– bulk会把将要处理的数据载入内存中,所以数据量是有限制的
– 最佳的数据量不是一个确定的数值,它取决于你的硬件,你的文档大小以及复杂性,你的索引 以及搜索的负载
– 一般建议是1000-5000个文档,如果你的文档很大,可以适当减少队列,大小建议是5-15MB, 默认不能超过100M,可以在es的配置文件中修改这个值http.max_content_length:100mb
•Elasticsearch的版本控制普通关系型数据库使用的是(悲观并发控制( PCC))
– 当我们在读取一个数据前先锁定这一行,然后确保只有读取到数据的这个线程可以修改这一行数据
• ES使用的是(乐观并发控制( OCC))
– ES不会阻止某一数据的访问,然而,如果基础数据在我们读取和写入的间隔中发生了变化,更新就会失败,这时候就由程序来决定如何处理这个冲突。它可 以重新读取新数据来进行更新,又或者将这一情况直接反馈给用户。
• ES如何实现版本控制(使用es内部版本号)
– 1:首先得到需要修改的文档,获取版本(_version)号

curl -XGET http://localhost:9200/elasticsearch/emp/1

– 2:在执行更新操作的时候把版本号传过去

curl -XPUT http://localhost:9200/elasticsearch/emp/1?version=1 -d'{"name":“zs","age":25}'(覆盖)

curl -XPOST http://localhost:9200/elasticsearch/emp/1/_update?version=1 -d'{"doc":{"city":"beijing","car":"BMW"}}'(部分更新)


– 3:如果传递的版本号和待更新的文档的版本号不一致,则会更新失败
•Elasticsearch的版本控制,ES如何实现版本控制(使用外部版本号)
– 如果你的数据库已经存在了版本号,或者是可以代表版本 的时间戳。这时就可以在es的查
询url后面添加 version_type=external来使用这些号码。
– 注意:版本号码必须要是大于0小于 9223372036854775807( Java中long的最大正值)的整数。
– es在处理外部版本号的时候,它不再检查_version是否与 请求中指定的数值是否相等,而是检查当前的_version是 否比指定的数值小,如果小,则请求成功。
– example:

curl -XPUT ‘http://localhost:9200/es-test/emp/20?version=10&version_t ype=external’ -d‘{“name”: “laoxiao"}'


• 注意:此处url前后的引号不能省略,否则执行的时候会报错
•Elasticsearch的插件
ES的插件有很多,有提供的是节点的实时状态监控,包括jvm的情况, linux的情况,
elasticsearch的情况。有分词的插件。所有的插件都放在bin/plugin下面。


ES高级使用
1. ES集群相关概念
2. ES的Java API
3. ES的优化
4. ES+Hbase实战Elasticsearch中的核心概念
cluster
– 代表一个集群,集群中有多个节点,其中有一个为主节点,这个主节
点是可以通过选举产生的,主从节点是对于集群内部来说的。 es的一 个概念就是
去中心化,字面上理解就是无中心节点,这是对于集群外 部来说的,因为从外部
来看es集群,在逻辑上是个整体,你与任何一 个节点的通信和与整个es集群通信
是等价的。
– 主节点的职责是负责管理集群状态,包括管理分片的状态和副本的状
态,以及节点的发现和删除。
• 只需要在同一个网段之内启动多个es节点,就可以自动组成一个集群。
• 默认情况下es会自动发现同一网段内的节点,自动组成集群。
• 集群状态查看
– http://node01.sarnath.cn:9200/_cluster/health?prettyElasticsearch中的核心概念
shards
– 代表索引分片, es可以把一个完整的索引分成多个分片,这样的好处
是可以把一个大的索引拆分成多个,分布到不同的节点上。构成分布 式搜索。分
片的数量只能在索引创建前指定,并且索引创建后不能更 改。
• 可以在创建索引库的时候指定
– curl -XPUT 'localhost:9200/test1/' - d'{"settings":{"number_of_shards":3}}'
• 默认是一个索引库有5个分片 – index.number_of_shards: 5
replicas
– 代表索引副本, es可以给索引设置副本,副本的作用一是提高系统的 容错性,
当某个节点某个分片损坏或丢失时可以从副本中恢复。二是 提高es的查询效率,
es会自动对搜索请求进行负载均衡。
• 可以在创建索引库的时候指定 – curl -XPUT 'localhost:9200/test2/' -
d'{"settings":{"number_of_replicas":2}}'
• 默认是一个分片有1个副本 – index.number_of_replicas: 1Elasticsearch中的核心概念
recovery
– 代表数据恢复或叫数据重新分布, es在有节点加入或退出时会根据机 器的负载
对索引分片进行重新分配,挂掉的节点重新启动时也会进行 数据恢复。
gateway
– 代表es索引的持久化存储方式, es默认是先把索引存放到内存中,当 内存满了时
再持久化到硬盘。当这个es集群关闭再重新启动时就会从 gateway中读取索引数据。
es支持多种类型的gateway,有本地文件 系统(默认),分布式文件系统, Hadoop
的HDFS和amazon的s3云 存储服务。
– 如果需要将数据落地到hadoop的hdfs需要先安装插件 elasticsearch/elasticsearchhadoop,然后再elasticsearch.yml配置
– gateway:
type: hdfs
gateway: hdfs: uri: hdfs://localhost:9000Elasticsearch中的核心概念
discovery.zen
– 代表es的自动发现节点机制, es是一个基于p2p的系统,它先通过广 播
寻找存在的节点,再通过多播协议来进行节点之间的通信,同时也 支持点对点的
交互。
• 如果是不同网段的节点如何组成es集群
– 禁用自动发现机制 – discovery.zen.ping.multicast.enabled: false
– 设置新节点被启动时能够发现的主节点列表
– discovery.zen.ping.unicast.hosts: [“192.168.1.160", " 192.168.1.161"]
Transport
– 代表es内部节点或集群与客户端的交互方式,默认内部是使用tcp协议 进行交互,
同时它支持http协议( json格式)、 thrift、 servlet、 memcached、 zeroMQ等的传输
协议(通过插件方式集成) 。Elasticsearch中的settings和
mappings
settings修改索引库默认配置
– 例如:分片数量,副本数量 – 查看:
curl -XGET http://localhost:9200/es-test/_settings?pretty
– curl -XPUT 'localhost:9200/es-test/' -
d'{"settings":{"number_of_shards":3,"number_of_replicas":2}}'
• Mapping,就是对索引库中索引的字段名称及其数据类型进行定义,类似于关系数
据库中表建立时要定义字段名及其数据类型那样, (和solr中的schme类似)不过es
的mapping比数据库灵活很多,它可以动态添加字段。一般不需要要指定 mapping
都可以,因为es会自动根据数据格式定义它的类型,如果你需要对某些 字段添加
特殊属性(如:定义使用其它分词器、是否分词、是否存储等),就必须 手动添
加mapping
• 查询索引库的mapping信息 – curl -XGET http://localhost:9200/estest/emp/_mapping?pretty
• mappings修改字段相关属性 – 例如:字段类型,使用哪种分词工具Elasticsearch中文分词器集成
一. 下载安装
从地址https://github.com/medcl/elasticsearch-analysis-ik下载elasticsearch
中文分词器
二.安装插件
这里默认的是master的 但是master的项目需要用gradle编译,这里选择1.
对应的版本。下载后的压缩包解压后进去发现是pom工程
分别执行如下命令:
vn clean
mvn compile
mvn package
当然这里是用maven对此工程进行编译,前提要安装maven.
前面编译了插件以后会在target/releases目录下出现一个zip包
在安装好的elasticsearch中在plugins目录下新建ik目录,将此zip包拷贝到
ik目录下, 将权限修改为elasticsearch启动用户的权限,通过unzip命令解
压缩, 例如在plugins/ik目录下执行unzip elasticsearch-analysis-ik-x.x.x.zip
解压后查看 得到解压后的结果
三.安装完成
每台机器都这样操作,重新启动elasticsearch集群Elasticsearch的java API
添加maven依赖
• 连接到es集
– 1:通过TransportClient这个接口,我们可以不启动节点就可以和es集群进行通信,
它需要指定es集群中其中一台或多台机的ip地址和端口
• TransportClient client = new TransportClient().addTransportAddress(new
InetSocketTransportAddress("host1", 9300)).addTransportAddress(new
InetSocketTransportAddress("host2", 9300));
• 如果需要使用其他名称的集群(默认是elasticsearch),需要如下设置
• Settings settings = ImmutableSettings.settingsBuilder().put("cluster.name",
"myClusterName").build();
• TransportClientclient = new TransportClient(settings).addTransportAddress(new
InetSocketTransportAddress("host1", 9300));
– 2:通过TransportClient这个接口,自动嗅探整个集群的状态, es会自动把集群中
其它机器的ip地址 加到客户端中
• Settings settings = ImmutableSettings.settingsBuilder().put("client.transport.sniff",
true).build();
• TransportClient client = new TransportClient(settings).addTransportAddress(new
InetSocketTransportAddress("host1", 9300));Elasticsearch的java API
Elasticsearch的java API
– 索引index(四种json,map,bean,es helpers)
• IndexResponse response = client.prepareIndex(“es-test ", "emp",
"1").setSource().execute().actionGet();
– 查询
get • GetResponse response = client.prepareGet(“es-test ", "emp",
"1").execute().actionGet();
– 更新update
– 更新或者插入upsert
– 删除delete
• DeleteResponse response = client.prepareDelete(“es-test ", "emp",
"1").execute().actionGet();
– 总数count
• long count = client.prepareCount(“es-test").execute().get().getCount();Elasticsearch的java API
批量操作bulk
• 查询search
– SearchTypeElasticsearch的查询
es的搜索类型有4种
– query and fetch(速度最快)(返回N倍数据量)
– query then fetch(默认的搜索方式)
– DFS query and fetch(可以更精确控制搜索打分和排名。 )
– DFS query then fetch
总结一下,从性能考虑QUERY_AND_FETCH是最快的, DFS_QUERY_THEN_FETCH是
最慢的。从搜索的准确度来说, DFS要比非DFS的 准确度更高。
查询:query – .setQuery(QueryBuilders.matchQuery("name", "test"))
• 分页:from/size – .setFrom(0).setSize(1)
• 排序:sort – .addSort("age", SortOrder.DESC)
• 过滤:filter – .setPostFilter(FilterBuilders.rangeFilter("age").from(1).to(19))
• 高亮:highlight
• 统计:facet(已废弃)使用aggregations 替代
– 根据字段进行分组统计
– 根据字段分组,统计其他字段的值
– size设置为0,会获取所有数据,否则,只会返回10条• Elasticsearch的分页
• 与SQL使用LIMIT来控制单“页”数量类似, Elasticsearch使用的是from 以
及size两个参数:
– size:每次返回多少个结果,默认值为10
– from:从哪条结果开始,默认值为0
• 假设每页显示5条结果,那么1至3页的请求就是:
– GET /_search?size=5
– GET /_search?size=5&from=5
– GET /_search?size=5&from=10
• 注意:不要一次请求过多或者页码过大的结果,这么会对服务器造成很大 的压
力。因为它们会在返回前排序。一个请求会经过多个分片。每个分片 都会生成自
己的排序结果。然后再进行集中整理,以确保最终结果的正确 性。
timed_out告诉了我们查询是否超时
• curl -XGET http://localhost:9200/_search?timeout=10ms – es会在10ms之内返回查
询内容
• 注意: timeout并不会终止查询,它只是会在你指定的时间内返回当时已 经查询
到的数据,然后关闭连接。在后台,其他的查询可能会依旧继续, 尽管查询结果
已经被返回了。Elasticsearch的优化
调大系统的"最大打开文件数",建议32K甚至是64K
– ulimit -a (查看)
– ulimit -n 32000(设置)
• 修改配置文件调整ES的JVM内存大小
– 1:修改bin/elasticsearch.in.sh中ES_MIN_MEM和ES_MAX_MEM的大小,建议设置
一样大,避免 频繁的分配内存,根据服务器内存大小,一般分配60%左右(默认256M)
– 2:如果使用searchwrapper插件启动es的话则修改bin/service/elasticsearch.conf(默
认1024M)
• 设置mlockall来锁定进程的物理内存地址
– 避免交换( swapped)来提高性能
– 修改文件conf/elasticsearch.yml
– boostrap.mlockall: true
• 分片多的话,可以提升建立索引的能力, 5-20个比较合适。
• 如果分片数过少或过多,都会导致检索比较慢。分片数过多会导致检索时打开比较多的文
件,另外也会导 致多台服务器之间通讯。而分片数过少会导至单个分片索引过大,所以检
索速度慢。建议单个分片最多存 储20G左右的索引数据,所以,分片数量=数据总量/20G
• 副本多的话,可以提升搜索的能力,但是如果设置很多副本的话也会对服务器造成额外的
压力,因为需要 同步数据。所以建议设置2-3个即可。
• 要定时对索引进行优化,不然segment越多,查询的性能就越差 – 索引量不是很大的话情况
下可以将segment设置为1 – curl -XPOST 'http://localhost:9200/estest/_optimize?max_num_segments=1' – java代码: client.admin().indices().prepareOptimize(“estest").setMaxNumSegments(1).get();Elasticsearch的优化
• 删除文档:在Lucene中删除文档,数据不会马上在硬盘上除去,而是在 lucene索引中产生
一个.del的文件,而在检索过程中这部分数据也会参与 检索, lucene在检索过程会判断是否
删除了,如果删除了在过滤掉。这样 也会降低检索效率。所以可以执行清除删除文档
– curl -XPOST 'http://localhost:9200/elasticsearch/_optimize?only_expunge_del
etes=true‘
– client.admin().indices().prepareOptimize(" elasticsearch
").setOnlyExpungeDeletes(true).get();
• 如果在项目开始的时候需要批量入库大量数据的话,建议将副本数设置为 0
– 因为es在索引数据的时候,如果有副本存在,数据也会马上同步到副 本中,这样会对es增
加压力。待索引完成后将副本按需要改回来。这 样可以提高索引效率
去掉mapping中_all域, Index中默认会有_all的域, (相当于 solr配置文件中的拷贝字段text),
这个会给查询带来方便,但 是会增加索引时间和索引尺寸
– "_all":{"enabled":"false"}
• log输出的水平默认为trace,即查询超过500ms即为慢查询, 就要打印日志,造成cpu和
mem, io负载很高。把log输出水 平改为info,可以减轻服务器的压力。
– 修改ES_HOME/conf/logging.yaml文件
– 或者修改ES_HOME/conf/elasticsearch.yamlElasticsearch的其他
•使用反射获取Elasticsearch客户端
• 可以使用前面讲的方式通过new获取client
• 使用反射方式:网上反映这种方式效率明显高于new客户端, 并可避免线上环境内存溢出
和超时等问题
•在使用java代码操作es集群的时候要保证本地使用的es的版本和集群上es 的版本保持一致。
• 保证集群中每个节点的JDK版本和es配置一致
elasticsearch在建立索引时,根据id或id,类型进行hash, 得到hash值与该索引的文档数量取
余,取余的值即为存入的 分片。
– 具体源码为:根据OperationRouting类的shardId方法进行分片
Elasticsearch脑裂问题(自行研究)ES+Hbase
需求:
存储:通过采集文章数据,将文章数据存储到ES中,在存储过程中通过ES的中文分词器进行
分词。
查询:通过ES的Java API接口,对ES集群进行查询,并通过API的分页模式返回结果,用于展
示出来。
详细:点击查询结果的每一条详细记录,根据ID,从Hbase中查询展

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值