这是我在学习es的时候一边看官网,一边记录的心得,希望对你有用。
Es学习笔记
目录
1.1RSET 2
(1)Post :creat 2
(2)Get:read 2
(3)Put:update 2
(4)Delete:delete 2
(5)注意:不可以修改number_of_shards 2
1.2ES常用命令语句 2
1.3Mapping映射分析 3
二、Es 通过http修改配置 4
2.1注意事项: 4
2.2修改命令: 4
2.3集群健康: 5
2.4列出所有索引指数: 6
2.5创建索引: 6
2.6索引和查询文档 6
2.7删除索引 7
2.8修改索引内容 8
2.9更新索引数据 8
2.10 批量删除匹配到的某ID 8
2.11elasticserach 批量处理 9
2.12post注意事项 9
2.13搜索API 9
5, 10
2.14查询语言介绍 11
2.15 term 和match 12
2.16查询语言深入 13
2.17 Executing Filters (filter过滤) 16
2.18分组聚合(略过) 17
三、 设置elasticsearch 17
3.1安装 17
3.11下载并安装.tar.gz软件包 17
3.2配置elasticsearch 19
① elasticsearch.yml 用于配置Elasticsearch 19
② jvm.options 用于配置Elasticsearch JVM设置 19
③ log4j2.properties 用于配置Elasticsearch日志记录 19
3.3动态提示设置属性提示设置 19
3.4 jvn.options设置 20
8:-Xmx2g 20
8 - : - Xmx2g 20
3.4.1堆设置 21
3.5 配置系统设置 22
3.51临时配置: 22
3.52永久配置: 22
3.6禁用交换区 23
3.7虚拟内存设置 24
3.8线程数量 24
3.9停止ES 命令以及常见致命错误分析 24
3.10ES术语词解释 25
3.11 Kibana控制台简介 27
1.1RSET
(1)Post :creat
(2)Get:read
(3)Put:update
(4)Delete:delete
(5)注意:不可以修改number_of_shards
REST API编辑:
现在我们已经启动并运行了节点(和集群),下一步就是了解如何与它进行通信。幸运的是,Elasticsearch提供了一个非常全面和强大的REST API,您可以使用它与群集进行交互。使用API可以完成的几件事情如下:
- 检查您的群集,节点和索引运行状况,状态和统计信息
- 管理您的群集,节点和索引数据和元数据
- 根据索引执行CRUD(创建,读取,更新和删除)和搜索操作
- 执行高级搜索操作,例如分页,排序,过滤,脚本,聚合等等
1.2ES常用命令语句
- 创建索引: curl -XPUT -H "Content-Type: application/json" slave1:9200/test -d
'{"settings" : {"index":{"number_of_shards":3,"number_of_replicas":2}}}'
- es搜索: http://slave1:9200/_search?pretty=true 返回给你看的事json格式
- 修改副本数:curl -XPUT -H "Content-Type: application/json" slave1:9200/test/_settings
-d '{"number_of_replicas":1}'
- es搜索: http://slave2:9200/_search?human=true 人性化显示,耗资源不推荐
- 查询索引映射结构:http://slave1:9200/yeye/_mapping/?pretty
- es响应过滤参数:file_path 支持通配符 多个值可以用逗号分隔
- 查询某个索引的前五十条数据:curl -XPUT -H "Content-Type: application/json" curl -XPOST slave1:9200/yeye/_search?pretty -d '{"size":50}'
- 查看节点:http://slave1:9200/_cat/nodes?v
- 查看所有的索引:http://slave1:9200/_cat/indices?v
- 输到es:bin/logstash -e 'input { file{ path=>"/usr/test/a.log" } } output { elasticsearch {hosts=>"slave1:9200" index=>"music" } }'curl -XDELETE slave1:9200/pg
- 删除索引:curl -XDELETE slave1:9200/pg 或者使用_all或者是通配符*来删除所有的索引
- 关闭索引:curl -XPOST slave1:9200/yeye/_close
(隐藏索引数据,查询该索引的时候只显示元数据)
- 打开索引:curl -XPOST slave1:9200/yeye/_open
- { "name": "qqqqq", "year": 6666, "lyrics": "fuckfuck" } 返回给你看的是人性化的界面,但是这会消耗更的资源,默认是false
- -Des.insecure.allow.root=true
- 获取集群健康状态:http://master:9200/_cat/health?v
1.3Mapping映射分析
{
"yeye" : { //索引字段
"mappings" : {
"doc" : {//_type字段
"properties" : {----------------------------------------------------
"@timestamp" : {//时间字段
"type" : "date"
},
"@version" : {//版本字段
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"host" : {//ip字段
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"message" : {//数据字段
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"path" : {//数据源路径字段
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}-------------------------------------------------------------------
}
}
}
}
二、Es 通过http修改配置
2.1注意事项:
elasticsearch修改集群范围设置提供两种方式,一种是persistent,持久的修改;另外一种是transient,就是暂时的修改。
我在开发环境测试的时候,通过persistent修改其中某个测试,例如:“cluster.routing.allocation.disk.watermark.low”,发现在重启es集群的时候,这个设置竟然还在,于是我就想,persistent相关的修改肯定是存到某个文件里去了,否则,不可能es重启还会存在这个配置;然后我通过谷歌,好搜查询各种资料发现,果然是存储到某个文件里去了,存储的所在文件如下:/"path.data"/"cluster.name"/nodes/0/_state/global-n.st,打开这个文件就能看到了。
通过transient修改的,es重启就不起作用了。通过persistent修改的,要想es重启之后不让起作用,就得删除global-n.st这个文件就可以了。
2.2修改命令:
PUT / _cluster / settings
{
“persistent”:{
“indices.recovery.max_bytes_per_sec”:“50mb”
}
}
要么:
PUT / _cluster / settings?flat_settings = true
{
“transient”:{
“indices.recovery.max_bytes_per_sec”:“20mb”
}
}
2.3集群健康:
让我们从基本的健康检查开始,我们可以用它来看看我们的集群是如何做的。我们将使用curl来执行此操作,但您可以使用允许您进行HTTP / REST调用的任何工具。假设我们仍然在开启Elasticsearch的同一节点上,并打开另一个命令外壳窗口。
要检查群集健康状况,我们将使用_catAPI。您可以在Kibana的控制台中运行以下命令,方法是 单击“VIEW IN CONSOLE”或curl点击下面的“COPY AS CURL”链接并粘贴到终端中。
GET / _cat / health?v
答案是:
时期时间戳群集状态node.total node.data分片pri relo init未分配pending_tasks max_task_wait_time active_shards_percent
1475247709 17:01:49 elasticsearch绿色1 1 0 0 0 0 0 0 - 100.0%
我们可以看到名为“elasticsearch”的集群处于绿色状态。
无论何时我们要求群集健康,我们要么获得绿色,黄色或红色。
绿色 - 一切都很好(群集功能齐全)
黄色 - 所有数据都可用,但一些副本尚未分配(群集完全可用)
红色 - 某些数据因任何原因不可用(群集部分功能)
注:群集为红色时,它将继续提供来自可用碎片的搜索请求,但您可能需要尽快修复它,因为存在未分配的碎片。
同样从上面的回应中,我们可以看到总共有1个节点,并且我们有0个碎片,因为我们还没有数据。请注意,由于我们使用的是默认群集名称(elasticsearch),并且由于Elasticsearch默认使用单播网络发现来查找同一台计算机上的其他节点,因此您可能会意外启动计算机上的多个节点并使它们全部加入一个集群。在这种情况下,您可能会在上述响应中看到多个节点。
我们也可以得到我们集群中的节点列表,如下所示:
GET / _cat / nodes?v
答案是:
ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role主名称
127.0.0.1 10 5 5 4.46 mdi * PB2SGZY
在这里,我们可以看到我们的一个名为“PB2SGZY”的节点,它是当前在我们集群中的单个节点。
2.4列出所有索引指数:
现在让我们来看看我们的指数:
GET / _cat / indices?v
答案是:
健康状态索引uuid pri rep docs.count docs.deleted store.size pri.store.size
这仅仅意味着我们在集群中还没有索引。
2.5创建索引:
现在让我们创建一个名为“customer”的索引,然后再次列出所有索引:
PUT /customer?pretty
GET / _cat / indices?v
第一个命令使用PUT动词创建名为“customer”的索引。我们简单地追加pretty到调用的最后,告诉它可以很好地打印JSON响应(如果有的话)。
答案是:
健康状态索引uuid pri rep docs.count docs.deleted store.size pri.store.size
黄色开放客户95SQ4TSUT7mWBT7VNHH67A 5 1 0 0 260b 260b
第二条命令的结果告诉我们,我们现在有一个名为customer的索引,它有5个主分片和1个副本(默认值),它包含0个文档。
您可能还会注意到客户索引标有黄色健康状况。回想一下我们之前的讨论,黄色意味着一些副本没有(尚未)分配。这个索引发生这种情况的原因是因为Elasticsearch默认为这个索引创建了一个副本。由于此刻我们只有一个节点正在运行,因此只有在其他节点加入群集的时间点之后才能分配一个副本(以获得高可用性)。一旦该副本被分配到第二个节点上,该索引的健康状态将变为绿色。
2.6索引和查询文档
curl -XPUT -H "Content-type:application/json" slave1:9200/customer/_doc/1?pretty -d '{"name":"Join Done"}'
现在让我们把一些东西放入我们的客户索引。我们会将一个简单的客户文档编入客户索引,ID为1,如下所示:
PUT / customer / _doc / 1?漂亮
{
“名字”:“John Doe”
}
答案是:
{
"_index" : "customer",
"_type" : "_doc",
"_id" : "1",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 2,
"failed" : 0
},
"_seq_no" : 0,
"_primary_term" : 1
}
从上面,我们可以看到客户索引中成功创建了新的客户文档。该文档的内部ID为1,我们在索引时指定。
重要的是要注意,Elasticsearch并不要求您在将文档编入索引之前先显式创建索引。在前面的例子中,Elasticsearch会自动创建客户索引,如果事先不存在的话。
现在让我们检索我们刚编入索引的文档:
GET / customer / _doc / 1?漂亮
答案是:
{
"_index" : "customer",
"_type" : "_doc",
"_id" : "1",
"_version" : 1,
"found" : true,
"_source" : {
"name" : "Join Done"
}
}
没有什么不寻常这里其他的不是一个领域,found,表示我们找到了与请求ID 1和另一个字段,一个文件_source,它返回我们从前面的步骤索引的完整JSON文件。
2.7删除索引
删除索引编辑
现在让我们删除刚刚创建的索引,然后再次列出所有索引:
DELETE /customer?pretty
GET /_cat/indices?v
答案是:
健康状态索引uuid pri rep docs.count docs.deleted store.size pri.store.size
这意味着索引已成功删除,现在我们回到我们在集群中没有任何内容的地方。
在我们继续之前,让我们再仔细看看迄今为止学到的一些API命令:
PUT /customer
PUT /customer/_doc/1
{
"name": "John Doe"
}
GET /customer/_doc/1
DELETE /customer
如果我们仔细研究上述命令,我们实际上可以看到我们如何在Elasticsearch中访问数据的模式。该模式可以概括如下:
<REST Verb> /<Index>/<Type>/<ID>
这种REST访问模式在所有API命令中都非常普遍,如果你可以简单地记住它,你将在掌握Elasticsearch方面有一个良好的开端。
2.8修改索引内容
再次指定同样的索引/_type/ID将会修改原来的索引的内容
curl -XPUT -H "Content-type:application/json" slave2:9200/customer/_doc/1 -d '{"name":"彭干"}'
执行该命令之后再次执行查询命令curl -XGET slave1:9200/customer/_doc/1?pretty将会发现name属性变成了”彭干”
如果put指定的ID是之前索引中不存在的ID那么将会在索引中创建一个新的数据
注意:ID是可以不指定的这样的话系统会随机生成一个随机的ID,注意的事情来了,如果不指定ID的话这个时候,就不能用PUT因为不指定ID的时候,就意味着绝对不可能修改原有内容,就只能是创建新的数据了,索引这个时候用curl -XPUT 会报错。
2.9更新索引数据
注意:post指定id会完全重写该id中的数据
除了能够索引和替换文档之外,我们还可以更新文档。但请注意,Elasticsearch实际上并没有在原地进行就地更新。无论何时我们进行更新,Elasticsearch都会删除旧文档,然后用一次性应用更新索引新文档。
此示例显示如何通过将名称字段更改为“Jane Doe”来更新我们以前的文档(ID为1):
POST / customer /_doc / 1 /_update?pretty
{
“doc”:{“name”:“Jane Doe”}
}
此示例显示如何通过将名称字段更改为“Jane Doe”并同时向其添加年龄字段来更新我们以前的文档(ID为1):
POST / customer / _doc / 1 / _update?漂亮
{
“doc”:{“name”:“Jane Doe”,“年龄”:20}
}
更新也可以通过使用简单的脚本来执行。本示例使用脚本将年龄增加5:
POST / customer / _doc / 1 / _update?漂亮
{
“script”:“ctx._source.age + = 5”
}
在上面的例子中,ctx._source引用了即将更新的当前源文档。
2.10 批量删除匹配到的某ID
slave1:9200/customer/_doc/_delete_by_query
{
"query": {
"match": {
"name":"po"
}
}
}
2.11elasticserach 批量处理
除了能够索引,更新和删除单个文档之外,Elasticsearch还提供了使用_bulkAPI批量执行上述任何操作的功能。此功能非常重要,因为它提供了一种非常高效的机制,尽可能快地完成多项操作,尽可能少的网络往返。
作为一个简单的例子,以下调用在一次批量操作中索引两个文档(ID 1 - John Doe和ID 2 - Jane Doe):
slave1:9200/customer/_doc/_bulk?pretty
{"index":{"_id":"1"}}
{"name": "John Doe" }
{"index":{"_id":"2"}}
{"name": "Jane Doe" }
本示例更新第一个文档(ID为1),然后在一次批量操作中删除第二个文档(ID为2):
POST /customer/_doc/_bulk?pretty
{"update":{"_id":"1"}}
{"doc": { "name": "John Doe becomes Jane Doe" } }
{"delete":{"_id":"2"}}
请注意,对于删除操作,后面没有对应的源文档,因为删除操作只需要删除文档的标识。
批量API不会因其中一个操作失败而失败。如果一个动作因任何原因失败,它将继续处理其后的其余动作。当批量API返回时,它将为每个操作提供一个状态(按照它发送的相同顺序),以便您可以检查特定操作是否失败。
2.12post注意事项
POST
Slave1:9200/_doc/1/_update {“doc”:{..}}执行这个命令的话并非全部修改,id=1的其他的属性还存在
Post Slave1:9200/_doc/1/ {.....}这个命令的话会全部修改,其他的某些属性会删除
2.13搜索API
(这是我自己的测试:slave1:9200/customer/_search?q=*&sort=_id:asc&pretty)
现在让我们开始一些简单的搜索。有运行检索两种基本方式:一种是通过发送搜索参数REST请求URI和其他通过发送他们REST请求主体。请求主体方法允许您更具表现力,并以更具可读性的JSON格式定义您的搜索。我们将尝试请求URI方法的一个示例,但在本教程的其余部分中,我们将专门使用请求主体方法。
用于搜索的REST API可以从_search端点访问。本示例返回银行索引中的所有文档:
GET / bank / _search?q = *&sort = account_number:asc&pretty
首先解析搜索调用。我们_search在银行索引中搜索(端点),并且该q=*参数指示Elasticsearch匹配索引中的所有文档。该sort=account_number:asc参数表示account_number字段按升序使用每个文档的字段对结果进行排序。该pretty参数同样告诉Elasticsearch返回漂亮的JSON结果。
答案(部分显示):
{
“take”:63,
“timed_out”:false,
“_shards”:{
“total”:5 ,“success”:
5,
“跳过”:0,
“failed”:0
},
“hits”:{
“total “:1000,
”MAX_SCORE“:空,
”命中“:[{
”_index“: ”银行“,
”_type“: ”_doc“,
”_id“: ”0“,
” 排序“:[0],
” _score “:null,
”_source“:{”account_number“:0,”balance“:16623,”firstname“:”Bradshaw“,”姓氏“:”Mckenzie“,”年龄“:29,”性别“:”F“,”地址“:”244哥伦布广场“,”雇主“:”Euron“,”电子邮件“:”bradshawmckenzie@euron.com“ ,“城市”:“霍布肯”,“州”:“CO”}
},{
“_index”:“bank”,
“_type”:“_doc”,“_id”
:“1”,
“sort”:[1],
“_score”:null,
“ _source ”:{“account_number”:1,平衡“:39225,”名字“:”琥珀“,”姓氏“:”公爵“,”年龄“:32,”性别“:”M“,”地址“:”880福尔摩斯巷“,”雇主“ Pyrami“,”email“:”amberduke@pyrami.com“,”city“:”Brogan“,”state“:”IL“}
},...
]
}
}
至于回应,我们看到以下部分:
took - Elasticsearch执行搜索的时间(以毫秒为单位)
timed_out - 告诉我们搜索是否超时
_shards - 告诉我们搜索了多少碎片,以及搜索碎片成功/失败的次数
hits - 搜索结果
hits.total - 符合我们搜索条件的文件总数
hits.hits - 实际的搜索结果数组(默认为前10个文档)
hits.sort - 为结果排序键(按分数排序时缺失)
hits._score并且max_score- 现在忽略这些字段
以上是使用替代请求主体方法的上述相同的精确搜索:
GET / bank / _search
{
“query”:{“match_all”:{}},
“sort”:[
{“account_number”:“asc”}
]
}
在控制台中复制为CURL 视图
这里的区别在于,不是传递q=*URI,而是将JSON风格的查询请求主体发布到_searchAPI。我们将在下一节讨论这个JSON查询。
重要的是要明白,一旦你得到你的搜索结果,Elasticsearch完全完成了请求,并没有维护任何种类的服务器端资源或打开游标到你的结果。这与许多其他平台(例如SQL)形成了鲜明对比,其中您可能最初会首先获得查询结果的部分子集,然后如果要获取(或翻阅)其余部分,则必须连续返回服务器的结果使用某种有状态的服务器端游标。
2.14查询语言介绍
介绍查询语言
(eg:slave1:9200/customer/_search
{
"query": {
"match": {
"_id":1
}
}
}
)
Elasticsearch提供了一种可用于执行查询的JSON式特定于领域的语言。这被称为查询DSL。查询语言非常全面,乍一看可能会让人感到恐慌,但实际学习它的最好方法是从几个基本示例开始。
回到我们的最后一个例子,我们执行了这个查询:
GET / bank / _search
{
“query”:{“match_all”:{}}
}
解析上述内容,该query部分告诉我们我们的查询定义是什么,match_all部分仅仅是我们想要运行的查询类型。该match_all查询仅仅是在指定索引的所有文件进行搜索。
除了query参数外,我们还可以传递其他参数来影响搜索结果。在上面我们传入的部分的例子中 sort,我们接着传入size:
GET / bank / _search
{
“query”:{“match_all”:{}},
“size”:1
}
请注意,如果size未指定,则默认为10。
下面的示例执行a match_all并返回10到19号文档:
GET / bank / _search
{
“query”:{“match_all”:{}},
“from”:10,
“size”:10
}
在from(从0开始)参数规定了从启动该文件的索引和size参数指定了多少文件,返回从参数开始的。此功能在实现分页搜索结果时非常有用。请注意,如果from未指定,则默认为0。
下面的示例match_all按帐户余额(balance)按降序排列结果并对结果进行排序,并返回前10个(默认大小)文档。
GET / bank / _search
{
“query”:{“match_all”:{}},
“sort”:{“balance”:{“order”:“desc”}}
}
2.15 term 和match
match和term的区别是,match查询的时候,elasticsearch会根据你给定的字段提供合适的分析器,而term查询不会有分析器分析的过程
match查询相当于模糊匹配,只包含其中一部分关键词就行
2.16查询语言深入
现在我们已经看到了一些基本的搜索参数,让我们进一步深入查询DSL。我们先来看看返回的文档字段。默认情况下,完整的JSON文档将作为所有搜索的一部分返回。这被称为源(_source搜索匹配中的字段)。如果我们不希望整个源文档返回,我们有能力只需要返回源内的几个字段。
这个例子展示了如何从搜索中返回两个字段account_number和balance(在_source)之内:
GET /bank/_serach
{
“query”:{“match_all”:{}},
“_source”:[“name”,”age”]
}(注意:上面的例子制定name 和age两个字段返回,但是并非结果只有这两个字段,系统自带的字段不会被_source限制,_index,_type,took,timeout,_shards,successful,skipped,failed,....不会被限制,要看细图,请看下面我的测试结果)
{
"took": 6,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 6,
"max_score": 1,
"hits": [
{
"_index": "customer",
"_type": "_doc",
"_id": "_update",
"_score": 1,
"_source": {}
},
{
"_index": "customer",
"_type": "_doc",
"_id": "45qn22EB3jvXQZYTU7ME",
"_score": 1,
"_source": {
"name": "123"
}
},
请注意,上述示例只是简化了_source字段。它仍然只会返回一个名为场_source,但在其内,只有田account_number和balance也包括在内。
如果您来自SQL背景,则上述内容在概念上与SQL SELECT FROM字段列表有些相似。
现在让我们继续查询部分。以前,我们已经看过match_all查询如何用来匹配所有文档。现在让我们来介绍一个称为match查询的新查询,它可以被看作是基本的搜索查询(即针对特定字段或字段集合进行的搜索)。
此示例返回编号为20的帐户:
GET /bank/search
{
“query”:{“match”:{“account_number”:20}}
}
此示例返回地址中包含术语“mill”的所有帐户:
GET /银行/ _搜索
{
“query”:{“match”:{“address”:“mill”}}
}
本示例返回地址中包含术语“mill”或“lane”的所有帐户:
GET /银行/ _搜索
{
“query”:{“match”:{“address”:“mill lane”}}
}
这个例子是match(match_phrase)的一个变种,它返回地址中包含短语“mill lane”的所有账号:
GET /银行/ _搜索
{
“query”:{“match_phrase”:{“address”:“mill lane”}}
}
现在我们来介绍一下这个bool查询。该bool查询允许我们撰写较小的查询到使用布尔逻辑更大的查询。
本示例组成两个match查询并返回地址中包含“mill”并且包含“lane”的所有帐户:
GET /bank/_search
{
"query": {
"bool": {
"must": [
{ "match": { "address": "mill" } },
{ "match": { "address": "lane" } }
]
}
}
}
在上面的例子中,该bool must子句指定了所有必须为真才能将文档视为匹配的查询。
相反,此示例组成两个match查询并返回地址中包含“mill”或者“lane”的所有帐户:
GET /银行/ _搜索
{
“query”:{
“bool”:{
“should”: [
{“match”:{“address”:“mill”}},
{“match”:{“address”:“lane”}}
]
}
}
}
在上面的例子中,该bool should子句指定了一个查询列表,其中任何一个查询都必须是真实的,以使文档被认为是匹配的。
此示例组成两个match查询并返回地址中既不包含“mill”也包含“lane”的所有帐户:
GET /银行/ _搜索
{
“query”:{
“bool”:{
“must_not”: [
{“match”:{“address”:“mill”}},
{“match”:{“address”:“lane”}}
]
}
}
}
在上面的例子中,该bool must_not子句指定了一个查询列表,其中任何一个查询都不应该被视为匹配的文档。
我们可以在一个查询中同时结合must,should和must_not子句bool。此外,我们可以bool在任何这些bool子句中编写查询来模拟任何复杂的多级布尔逻辑。
此示例返回任何40岁但未居住在aho的人的所有帐户:
GET /银行/ _搜索
{
“query”:{
“bool”:{
“must”:[
{“match”:{“age”:“40”}}
]
“must_not”: [
{“match”:{“state”:“ID”}}
]
}
}
}
2.17 Executing Filters (filter过滤)
在上一节中,我们跳过了一个称为文档分数(_score搜索结果中的字段)的细节。分数是一个数值,它是文档与我们指定的搜索查询匹配度的相对度量。分数越高,文档越相关,分数越低,文档的相关性越低。
但查询并不总是需要生成分数,特别是当它们仅用于“过滤”文档集时。Elasticsearch检测这些情况并自动优化查询执行,以便不计算无用分数。
我们在前一节中介绍的bool查询还支持filter使用查询来限制将被其他子句匹配的文档的子句,而不会更改计算分数的方式。作为一个例子,我们来介绍一下range查询,它允许我们通过一系列值来过滤文档。这通常用于数字或日期过滤。
此示例使用bool查询返回余额介于20000和30000之间的所有帐户。换句话说,我们希望查找余额大于或等于20000且小于等于30000的帐户。
GET /bank/_search
{
"query": {
"bool": {
"must": { "match_all": {} },
"filter": {
"range": {
"balance": {//balance是文档的字段
"gte": 20000,
"lte": 30000
}
}
}
}
}
}
解析上述内容,bool查询包含match_all查询(查询部分)和range查询(过滤器部分)。我们可以将任何其他查询替换为查询和过滤器部分。在上述情况下,范围查询非常有意义,因为落入该范围的文档全部匹配“平等”,即没有文档比另一个文档更相关。
除了match_all,match,bool,和range查询,有很多可用的其他查询类型的,我们不会进入他们在这里。由于我们已经对其工作原理有了基本的了解,因此将这些知识应用于学习和试用其他查询类型应该不会太困难。
2.18分组聚合(略过)
设置elasticsearch
3.1安装
Elasticsearch使用Java构建,并且至少需要 Java 8 才能运行。只支持Oracle的Java和OpenJDK。所有Elasticsearch节点和客户端都应该使用相同的JVM版本。
我们建议在Java 8发行版系列中安装Java版本1.8.0_131或更高版本。我们建议使用 受支持的 LTS版本的Java。如果使用已知的Java版本,Elasticsearch将拒绝启动。
Elasticsearch将使用的Java版本可以通过设置JAVA_HOME环境变量进行配置。
3.11下载并安装.tar.gz软件包
.tar.gzElasticsearch v6.2.2 的存档可以下载并安装,如下所示:
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.2.2.tar.gz
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.2.2.tar.gz.sha512
shasum -a 512 -c elasticsearch-6.2.2.tar.gz.sha512
tar -xzf elasticsearch-6.2.2.tar.gz
cd elasticsearch -6.2.2 /
比较下载的.tar.gz存档的SHA 和应该输出的发布的校验和 elasticsearch-{version}.tar.gz: OK。 | |
这个目录被称为$ES_HOME。 |
从命令行运行Elasticsearch
Elasticsearch可以从命令行启动,如下所示:
./bin/elasticsearch
默认情况下,Elasticsearch在前台运行,将其日志打印到标准输出(stdout),并可通过按停止Ctrl-C。
与Elasticsearch打包在一起的所有脚本都需要一个支持数组的Bash版本,并假定Bash可用/bin/bash。因此,Bash应直接或通过符号链接在此路径上可用。
检查Elasticsearch是否正在运行
您可以测试你的Elasticsearch节点通过发送一个HTTP请求的端口上运行9200上localhost:
curl -XGET hostname:9200
控制台会给你一个这样的回应:
{
“name”:“Cp8oag6”,
“cluster_name ”:“elasticsearch”,“cluster_uuid”:“
AT69_T_DTp-1qgIJlatQqA”,
“version”:{
“number”:“6.2.2”,
“build_hash”:“f27399d”,
“build_date”:“2016-03-30T09:51:41.449Z”,
“build_snapshot”:false,
“lucene_version”:“7.2.1”,
“minimum_wire_compatibility_version”:“1.2.3”,
“minimum_index_compatibility_version”:“1.2。 3“
},
"tagline" : "You Know, for Search"
}
stdout使用 命令行上的-q或--quiet选项可以禁用日志打印。
作为守护进程编辑运行
要将Elasticsearch作为守护程序运行,请-d在命令行上指定,并使用以下-p选项将进程ID记录到文件中:
./bin/elasticsearch -d -p pid (eg: elasticsearch -d -p ${ES_HOME}/pid)
日志消息可以在$ES_HOME/logs/目录中找到。
要关闭Elasticsearch,请杀死pid文件中记录的进程ID :
kill ‘cat pid’
RPM和Debian 软件包中提供的启动脚本负责为您启动和停止Elasticsearch过程。
在命令行编辑上配置Elasticsearch
Elasticsearch $ES_HOME/config/elasticsearch.yml 默认从文件加载它的配置。配置Elasticsearch中解释了此配置文件的格式 。
在配置文件中可以指定的任何设置也可以在命令行中指定,使用-E语法如下:
./bin/elasticsearch -d -Ecluster.name = my_cluster -Enode.name = node_1
通常,cluster.name应将任何群集范围的设置(如)添加到elasticsearch.yml配置文件中,而任何节点特定的设置(如node.name可在命令行中指定的设置)。
3.2配置elasticsearch
Elasticsearch提供了很好的默认设置,并且只需要很少的配置。使用群集更新设置 API 可以在运行的群集上更改大多数设置 。
配置文件应包含特定于节点的设置(例如node.name和路径),或节点为了能够加入群集而需要的设置,例如cluster.name和network.host。
配置文件位置
Elasticsearch有三个配置文件:
- elasticsearch.yml 用于配置Elasticsearch
- jvm.options 用于配置Elasticsearch JVM设置
- log4j2.properties 用于配置Elasticsearch日志记录
这些文件位于config目录中,其默认位置取决于安装来自归档分发(tar.gz或 zip)还是软件包分发(Debian或RPM软件包)。
对于档案分发,config目录位置默认为 $ES_HOME/config。config目录的位置可以通过ES_PATH_CONF环境变量进行更改 ,如下所示:
ES_PATH_CONF=/path/to/my/config ./bin/elasticsearch
或者,您可以通过命令行或通过shell配置文件来export访问ES_PATH_CONF环境变量。
对于软件包发行版,config目录位置默认为 /etc/elasticsearch。config目录的位置也可以通过ES_PATH_CONF环境变量进行更改,但请注意,在shell中设置这个地址是不够的。相反,这个变量来源于/etc/default/elasticsearch(对于Debian软件包)和 /etc/sysconfig/elasticsearch(对于RPM软件包)。您需要相应地编辑ES_PATH_CONF=/etc/elasticsearch其中一个文件中的 条目以更改config目录位置。
配置格式是vim config/elasticsearch.yml。以下是更改数据和日志目录路径的示例:
设置也可以如下展开:
path.data:/ var / lib /
elasticsearch path.logs:/ var / log / elasticsearch
环境变量替换
使用${...}配置文件中的符号引用的环境变量将替换为环境变量的值,例如:
node.name:$ {HOSTNAME}
network.host:$ {ES_NETWORK_HOST}
3.3动态提示设置属性提示设置
在elasticsearch.xml,可以使用该值${prompt.text}或${prompt.secret}在前台启动Elasticsearch。${prompt.secret}已禁用回声,以便输入的值不会显示在您的终端中; ${prompt.text}将允许您在输入时查看该值。例如:
node.name: ${prompt.text} 启动Elasticsearch时,系统会提示您输入实际值,如下所示:
输入[node.name]的值:
再比如:path.logs: ${prompt.text} 启动Elasticsearch时,系统会提示您输入实际值,如下截图所示:
如果 在设置中使用${prompt.text}或${prompt.secret}在设置中使用Elasticsearch,则该弹性搜索将无法启动,并且该过程作为服务运行或在后台运行。
3.4 jvn.options设置
设置JVM选项
您应该很少需要更改Java虚拟机(JVM)选项。如果这样做,最可能的变化是设置堆大小( heap size.)。本文档的其余部分详细介绍了如何设置JVM选项。
设置JVM选项(包括系统属性和JVM标志)的首选方法是通过jvm.options配置文件。此文件的默认位置是config/jvm.options(从tar或zip发行版/etc/elasticsearch/jvm.options进行安装时)和(从Debian或RPM软件包进行安装时)。
此文件包含特殊语法后的JVM参数的行分隔列表:
仅包含空白的行被忽略
以开头的行#被视为注释并被忽略
#这是一条评论
以a开头的行-被视为独立于JVM版本的JVM选项
-Xmx2g
以数字开头且:后跟a的行-被视为JVM选项,该选项仅适用于JVM的版本与数字相匹配的情况
8:-Xmx2g
以数字开头且-后跟a的行:被视为JVM选项,该选项仅适用于JVM的版本大于或等于数字
8 - : - Xmx2g
以数字开头的行后-跟随数字后面跟随的:是JVM选项,该选项仅适用于JVM的版本落在两个数字的范围内
8-9:-Xmx2g
所有其他线路都被拒绝
您可以将自定义JVM标志添加到此文件,并将此配置检入到您的版本控制系统中。
设置Java虚拟机选项的另一种机制是通过 ES_JAVA_OPTS环境变量。例如:
export ES_JAVA_OPTS =“$ ES_JAVA_OPTS -Djava.io.tmpdir = / path / to / temp / dir”
./bin/elasticsearch
使用RPM或Debian软件包时,ES_JAVA_OPTS可以在系统配置文件中指定 。
JVM具有用于观察JAVA_TOOL_OPTIONS 环境变量的内置机制。我们在包装脚本中故意忽略这个环境变量。主要原因是在某些操作系统上(例如Ubuntu),通过这个环境变量默认安装了代理,我们不想干涉Elasticsearch。
另外,其他一些Java程序支持JAVA_OPTS环境变量。这不是 JVM中构建的机制,而是生态系统中的约定。但是,我们不支持这个环境变量,而是支持通过上面的jvm.options文件或环境变量来设置JVM选项ES_JAVA_OPTS。
3.4.1堆设置
设置堆大小
默认情况下,Elasticsearch通知JVM使用最小和最大尺寸为1 GB的堆。在转移到生产环境时,配置堆大小以确保Elasticsearch有足够的可用堆是非常重要的。
Elasticsearch将通过(最小堆大小)和(最大堆大小)设置来分配jvm.options中指定的整个堆 。XmsXmx
这些设置的值取决于服务器上可用的RAM数量。好的经验法则是:
将最小堆大小(Xms)和最大堆大小(Xmx)设置为彼此相等。
Elasticsearch可用的堆越多,可用于缓存的内存就越多。但请注意,太多的堆可能会使您长时间垃圾收集暂停。
设置Xmx为不超过物理RAM的50%,以确保有足够的物理内存留给内核文件系统缓存。
不要设置Xmx为JVM用于压缩对象指针(压缩oops)的临界值以上; 确切的截止值有所不同,但接近32 GB。您可以通过在日志中查找一行来验证您是否处于限制之下,如下所示:
heap size [1.9gb], compressed ordinary object pointers [true]
更好的是,尽量保持低于基于零的压缩oops的阈值; 准确的截止值会有所不同,但大多数系统上的26 GB是安全的,但在某些系统上可能高达30 GB。您可以通过使用JVM选项启动Elasticsearch -XX:+UnlockDiagnosticVMOptions -XX:+PrintCompressedOopsMode并查找以下行来验证您是否处于限制之下:
heap address: 0x000000011be00000, size: 27648 MB, zero based Compressed Oops
显示基于零的压缩oops被启用而不是
heap address: 0x0000000118400000, size: 28672 MB, Compressed Oops with base: 0x00000001183ff000
以下展示两种方法设置堆大小,一种通过jvm.options,另一种是通过环境变量来设置
是如何通过jvm.options文件设置堆大小的示例:
-Xms2g
-Xmx2g
将最小堆大小设置为2g。 | |
将最大堆大小设置为2g。 |
也可以通过环境变量设置堆大小。这可以通过注释掉来完成Xms,并Xmx设置在 jvm.options文件中,并通过设置这些值ES_JAVA_OPTS:
ES_JAVA_OPTS =“ - Xms2g -Xmx2g”./bin/elasticsearch
ES_JAVA_OPTS =“ - Xms4000m -Xmx4000m”./bin/elasticsearch
ES_JAVA_OPTS="-Xms2g -Xmx2g" ./bin/elasticsearch
ES_JAVA_OPTS="-Xms4000m -Xmx4000m" ./bin/elasticsearch
将最小和最大堆大小设置为2 GB。 | |
将最小和最大堆大小设置为4000 MB。 |
为Windows服务配置堆与上述不同。最初为Windows服务填充的值可以如上配置,但在安装服务后会有所不同。有关更多详细信息,请参阅Windows服务文档。
3.5 配置系统设置
配置系统设置的位置取决于您用于安装Elasticsearch的软件包以及您正在使用的操作系统。
使用.zip或.tar.gz软件包时,可以配置系统设置:
- 临时设置:ulimit -n +“一个数字”
- 永久设置:/etc/security/limits.conf。
3.51临时配置:
在Linux系统上,ulimit可以用来临时更改资源限制。root在切换到将运行Elasticsearch的用户之前,通常需要设置限制。例如,要将打开文件句柄(ulimit -n)的数量设置为65,536,可以执行以下操作:
sudo su
ulimit -n 65536
su elasticsearch
sudo su 切换为root用户 | |
ulimit -n 65536更改打开文件的最大数量。 | |
再次su elasticsearch 重新启动Elasticsearch。 |
3.52永久配置:
在Linux系统上,可以通过编辑/etc/security/limits.conf文件为特定用户设置持久限制。要将用户的最大打开文件数设置elasticsearch为65,536,请将以下行添加到limits.conf文件中:
elasticsearch - nofile 65536
此更改仅在elasticsearch用户下次打开新会话时生效。
3.6禁用交换区
大多数操作系统尝试尽可能多地为文件系统缓存使用内存,并急切地更换未使用的应用程序内存。这可能会导致部分JVM堆或甚至其可执行页面被换出到磁盘。
交换对性能非常不利,对于节点稳定性,应该不惜一切代价来避免。它可能导致垃圾收集持续几分钟而不是几毫秒,并且可能导致节点响应缓慢甚至与群集断开连接。在弹性分布式系统中,让操作系统杀死节点会更有效。
有三种方法禁用交换。首选选项是完全禁用交换。如果这不是一个选项,是否希望最小化swappiness与内存锁定取决于您的环境。
禁用所有交换文件
通常Elasticsearch是在一个盒子上运行的唯一服务,其内存使用情况由JVM选项控制。应该不需要启用交换。
在Linux系统上,您可以通过运行暂时禁用交换:
sudo swapoff - a
要永久禁用它,您需要编辑该/etc/fstab文件并注释掉包含该单词的所有行swap。
在Windows上,可以通过完全禁用分页文件来实现相同的功能System Properties → Advanced → Performance → Advanced → Virtual memory。
配置swappiness
Linux系统上可用的另一个选项是确保sysctl值 vm.swappiness设置为1。这减少了内核的交换趋势,在正常情况下不应该导致交换,同时仍然允许整个系统在紧急情况下进行交换。
启用bootstrap.memory_lock
另一种选择是在Linux / Unix系统上使用mlockall或 在Windows 上 使用 VirtualLock,以尝试将进程地址空间锁定到RAM中,防止任何Elasticsearch内存被换出。这可以通过将此行添加到config/elasticsearch.yml文件来完成:
bootstrap.memory_lock:true
mlockall 如果它尝试分配比可用内存更多的内存,可能会导致JVM或shell会话退出!
启动Elasticsearch后,您可以通过检查mlockall此请求输出中的值来查看此设置是否已成功应用:
curl -XGET hostname:9200/_nodes?filter_path=**.mlockall
如果你看到mlockall的false,那么就意味着该mlockall 请求失败。您还将在日志中看到包含单词的更多信息Unable to lock JVM Memory。
在Linux / Unix系统上,最可能的原因是运行Elasticsearch的用户没有锁定内存的权限。这可以授予如下:
临时:在root用户下执行ulimit -l unlimited
永久:在/etc/security/limits.conf设置memlock为unlimited
mlockall会失败的另一个可能原因是临时目录(/tmp)使用该noexec选项进行挂载。这可以通过使用ES_JAVA_OPTS环境变量指定一个新的临时目录来解决:
export ES_JAVA_OPTS = “$ ES_JAVA_OPTS -Djava.io.tmpdir = / path / to / temp / dir” 或者在jvm.options配置文件中设置此JVM标志。
3.7虚拟内存设置
Elasticsearch mmapfs默认使用一个目录来存储它的索引。mmap计数的默认操作系统限制可能太低,这可能会导致内存不足异常。
在Linux上,您可以通过运行以下命令来增加限制 root:
sysctl -w vm.max_map_count = 262144
要永久设置此值,请更新中的vm.max_map_count设置 /etc/sysctl.conf。要在重新启动后进行验证,请运行sysctl vm.max_map_count。 最小262144.
RPM和Debian软件包将自动配置此设置。不需要进一步的配置。
下面是我的配置截图:
«虚拟内存 DNS缓存设置»
3.8线程数量
Elasticsearch针对不同类型的操作使用多个线程池。能够在需要时创建新线程很重要。确保Elasticsearch用户可以创建的线程数至少为4096。
这可以通过ulimit -u 4096在启动Elasticsearch之前设置为root 来完成,或者通过设置nproc为4096in来完成 /etc/security/limits.conf。
当作为服务运行时,程序包分发systemd将自动配置Elasticsearch进程的线程数。不需要额外的配置。
3.9停止ES 命令以及常见致命错误分析
停止Elasticsearch编辑
Elasticsearch的有序关闭确保Elasticsearch有机会清理和关闭优秀资源。例如,有序关闭的节点将从集群中删除自身,同步超时日志到磁盘,并执行其他相关的清理活动。您可以通过正确停止Elasticsearch来确保有序关闭。
如果您将Elasticsearch作为服务运行,则可以通过安装提供的服务管理功能来停止Elasticsearch。
如果您直接运行Elasticsearch,则可以通过在控制台中运行Elasticsearch或通过发送SIGTERM到POSIX系统上的Elasticsearch进程来发送control-C来停止Elasticsearch 。您可以通过各种工具(例如ps或jps)获取PID以发送信号:
$ jps | grep ElasticsearchElasticsearch
从Elasticsearch启动日志中:
[2016-07-07 12:26:18,908] [INFO] [node] [I8hydUG] version [5.0.0-alpha4],pid [15399],build [3f5b994 / 2016-06-27T16:23:46.861Z] ,OS [Mac OS X / 10.11.5 / x86_64],JVM [Oracle公司/ Java HotSpot TM 64位服务器VM / 1.8.0_92 / 25.92-b14]
或者通过指定一个位置在启动时写入一个PID文件(-p <path>):
$ ./bin/elasticsearch -p / tmp / elasticsearch-pid -d
$ cat / tmp / elasticsearch-pid && echo15516
$ kill -SIGTERM 15516
停止致命错误编辑
在Elasticsearch虚拟机的生命周期中,可能会出现某些致使虚拟机处于可疑状态的致命错误。此类致命错误包括内存不足错误,虚拟机中的内部错误以及严重的I / O错误。
当Elasticsearch检测到虚拟机遇到这样的致命错误时,Elasticsearch将尝试记录错误,然后暂停虚拟机。当Elasticsearch发起这样的关闭时,它不会按照上面所述的顺序关闭。Elasticsearch过程也将返回一个特殊的状态码,指明错误的性质。
JVM内部错误 | 128 |
内存不足错误 | 127 |
堆栈溢出错误 | 126 |
未知的虚拟机错误 | 125 |
严重的I / O错误 | 124 |
未知的致命错误 | 1 |
JVM internal error | 128 |
Out of memory error | 127 |
Stack overflow error | 126 |
Unknown virtual machine error | 125 |
Serious I/O error | 124 |
Unknown fatal error | 1 |
3.10ES术语词解释
分析(analysis)
分析是将全文转换为 术语的过程。根据该分析仪使用时,这些短语: FOO BAR,Foo-Bar,foo,bar将可能导致所有的条款foo和bar。这些术语是实际存储在索引中的内容。全文查询(不是术语查询)for FoO:bAR也将被分析到术语中foo,bar并且将因此与索引中存储的术语匹配。正是这个分析过程(在索引时间和搜索时间),允许Elasticsearch执行全文查询。另请参阅文本和术语。
集群(cluster)
一个集群由一个或多个共享相同集群名称的节点组成。每个群集都有一个由群集自动选择的主节点,如果当前主节点出现故障,则可以替换该主节点。
文件(document)
文档是存储在Elasticsearch中的JSON文档。它就像一个关系数据库中的表格中的一行。每个文档都存储在一个索引中,并且有一个类型和一个 id。文档是JSON对象(在其他语言中也称为散列/散列表/关联数组),其中包含零个或多个 字段或键/值对。索引的原始JSON文档将存储在 _source字段中,该字段在获取或搜索文档时默认返回。
ID
文档 的ID 标识文档。该 index/id文件中必须是唯一的。如果没有提供ID,则会自动生成。(也参见路由)
领域(field)
一个文件包含字段或键-值对的列表。该值可以是简单(标量)值(例如字符串,整数,日期),也可以是像数组或对象这样的嵌套结构。字段与关系数据库中的表中的列相似。所述映射用于每个字段具有一个字段类型(不要与文件相混淆类型),其指示可以被存储在该字段中的数据的类型,例如integer,string, object。映射还允许您定义(除其他外)如何分析字段的值。
索引(index)
索引就像关系数据库中的表。它有一个 映射,其中包含一个类型,其中包含索引中的字段。索引是逻辑名称空间,映射到一个或多个 主分片,并且可以有零个或多个 副本分片。
映射(mapping)
映射就像关系数据库中的模式定义。每个 索引都有一个映射,它定义了一个类型,以及一系列索引范围的设置。映射既可以明确定义,也可以在文档编制索引时自动生成。
节点(node)
节点是Elasticsearch的一个运行实例,属于一个 集群。为了测试目的,可以在单个服务器上启动多个节点,但通常每个服务器应该有一个节点。启动时,节点将使用单播来发现具有相同群集名称的现有群集,并尝试加入该群集。
主碎片(primary shard)
每个文档都存储在一个主分片中。索引文档时,首先在主分片上索引,然后在主分片的所有副本上索引。默认情况下,索引有5个主分片。您可以指定更少或更多的主分片来缩放索引可处理的文档数量 。索引创建完成后,您无法更改索引中主要分片的数量。另请参阅路由
复制品碎片(副本replica shard)
每个主分片可以有零个或多个副本。副本是主碎片的副本,有两个目的:
增加故障转移:如果主节点失败,可以将副本分片升级为主分片
提高性能:get和搜索请求可以由主或副本分片处理。默认情况下,每个主分片都有一个副本,但副本的数量可以在现有索引上动态更改。副本分片永远不会在与其主分片相同的节点上启动。
路由(routing)
索引文档时,它存储在单个 主分片上。该分片通过对routing值进行散列来选择。默认情况下,该routing值是从文档的ID派生的,或者如果文档具有指定的父文档,则从父文档的ID派生(以确保子文档和父文档存储在同一个分片上)。此值可以通过指定被覆盖routing在索引时间值,或者一个路由选择字段中的映射。
碎片(shard)
碎片是一个单独的Lucene实例。它是Elasticsearch自动管理的低级“工作”单元。索引是指向一个逻辑名称空间初级和 副本碎片。除了定义索引应具有的主分片和副本分片的数量之外,您不需要直接引用分片。相反,你的代码只能处理索引。Elasticsearch 在 集群中的所有节点之间分配碎片,并且可以在节点故障或添加新节点的情况下自动将碎片从一个节点移动到另一个节点。
源字段(source field)
默认情况下,您索引的JSON文档将存储在该 _source字段中,并将由所有获取和搜索请求返回。这允许您直接从搜索结果中访问原始对象,而不需要第二步从ID中检索对象。
术语(term)
术语是Elasticsearch中索引的确切值。该条款 foo,Foo,FOO是不等价的。可以使用术语查询来搜索术语(即精确值)。另见文字和分析。
文本(text)
文本(或全文)是普通的非结构化文本,例如本段。默认情况下,文本将被分析为 术语,这是实际存储在索引中的内容。文本字段需要在索引时间进行分析以便可以作为全文进行搜索,并且必须在搜索时分析全文查询中的关键字以产生(并搜索)在索引时生成的相同条款。另见术语和分析。
类型(type)
用于表示文档类型的类型,例如an email,a user或a tweet。类型已被弃用,正在被删除。请参阅删除映射类型。
3.11 Kibana控制台简介
快速介绍UI
控制台UI分为两个窗格:编辑器窗格(左侧)和响应窗格(右侧)。使用编辑器键入请求并将其提交给Elasticsearch。结果将显示在右侧的响应窗格中。
在输入请求时,控制台会提出建议,然后您可以通过点击Enter / Tab来接受建议。这些建议是根据请求结构以及索引和类型制定的。
一些快速提示,同时我引起了你的注意
使用绿色三角按钮将请求提交给ES。
使用扳手菜单进行其他有用的事情。
您可以以cURL格式粘贴请求,并将它们转换为控制台语法。
您可以通过拖动它们之间的分隔符来调整编辑器和输出窗格的大小。
学习帮助按钮下的键盘快捷键。好东西在那里!
curl -XGET "http://10.0.0.211:9200/anyao/_search" -H 'Content-Type: application/json' -d'
{
"query":{
"match":{
"aCity":"beijing"
}
}
,"size":1000
}'