一个 Elasticsearch 集群可以 包含多个 索引 ,相应的每个索引可以包含多个 类型 。 这些不同的类型存储着多个 文档 ,每个文档又有 多个 属性 。
一个 索引 类似于传统关系数据库中的一个 数据库 ,是一个存储关系型文档的地方,类型有些类似于表
路径包含了三部分的信息: 索引(_index
) + 类型(_type) +
ID(_id)
/_search
在所有的索引中搜索所有的类型
/gb/_search
在 gb 索引中搜索所有的类型
/gb,us/_search
在 gb 和 us 索引中搜索所有的文档
/g*,u*/_search
在任何以 g 或者 u 开头的索引中搜索所有的类型
/gb/user/_search
在 gb 索引中搜索 user 类型
/gb,us/user,tweet/_search
在 gb 和 us 索引中搜索 user 和 tweet 类型
/_all/user,tweet/_search
在所有的索引中搜索 user 和 tweet 类型
分页:
size 显示应该返回的结果数量,默认是 10
from 显示应该跳过的初始结果数量,默认是 0
如果每页展示 5 条结果,可以用下面方式请求得到 1 到 3 页的结果:
GET /_search?size=5
GET /_search?size=5&from=5
GET /_search?size=5&from=10
CURL
// CURL VERB
curl -X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>'
curl -Xget 'http://localhost:9200//megacorp/employee/_search' -d '{"query" : {"bool": {"must": {"match" : { "last_name" : "smith" }},"filter": {"range" : {"age" : { "gt" : 30 } }}}}}'
安装head
sudo elasticsearch/bin/plugin install mobz/elasticsearch-head
卸载head
elasticsearch/bin/plugin remove head
GET + 索引(_index
)/类型(_type)/
ID(_id) [?pretty] [?_source=key1,key2] [/_source] [?timeout=10ms] [?size=5&from=5]:执行查询;
pretty
将会调用 Elasticsearch 的 pretty-print 功能,该功能 使得 JSON 响应体更加可读;
_source
字段现在包含的只是我们请求的那些字段;只想得到 _source
字段,不需要任何元数据,使用 /_source;
timeout 设定超时时间;
size 显示应该返回的结果数量,默认是 10
from 显示应该跳过的初始结果数量,默认是 0
PUT + 索引(_index
)/类型(_type)/
ID(_id) [?op_type=create] [/_create] [?version=1&version_type=external] + JSON请求体(JSON 文档):执行插入或修改。
返回值: _version是对该索引数据执行了几次修改,created:false代表是修改。
op_type和_create功能相同: 只执行创建请求,即路径不存在的时候才执行索引请求,如果创建新文档的请求成功执行,Elasticsearch 会返回元数据和一个 201 Created
的 HTTP 响应码,如果已存在,返回409 Conflict
响应码;
version: 乐观锁,当版本符合时才进行修改。version_type=external时Elasticsearch 不是检查当前 _version
和请求中指定的版本号是否相同, 而是检查当前 _version
是否 小于 指定的版本号。version应该小于long。
POST + 索引(_index
)/类型(_type)
+ JSON请求体(JSON 文档):POST创建文档不输入ID,而是自动生成ID,保障是新增插入。
POST + 索引(_index
)/类型(_type)/
ID(_id) /_update
+ JSON请求体(JSON 文档):当使用_update时对象被合并到一起,覆盖现有的字段,增加新的字段。
POST + 索引(_index
)/类型(_type)
/_validate/query?explain : 验证查询
DELETE + 路径 :执行删除,成功返回一个 200 ok
的 HTTP 响应码,
映射和分析
映射, 就像数据库中的 schema ,是文档和域直接的关系,
查看映射
GET 索引(_index)/_mapping/类型(_type) 获取文档结构
Elasticsearch 支持 如下简单域类型:
字符串: string
整数 : byte, short, integer, long
浮点数: float, double
布尔型: boolean
日期: date
索引一个包含新域的文档--之前未曾出现-- Elasticsearch 会使用 动态映射 ,通过JSON中基本数据类型,尝试猜测域类型,使用如下规则
自定义域映射编辑
允许执行下面的操作:
1.全文字符串域和精确值字符串域的区别
2.使用特定语言分析器
3.优化域以适应部分匹配
4.指定自定义数据格式
域Type
域最重要的属性是 type 。对于不是 string 的域,你一般只需要设置 type,string 域映射的两个最重要 属性是 index 和 analyzer。
JSON type |
域 type |
字符串: foo bar
|
string |
布尔型: true / false
|
boolean |
整数: 123
|
byte |
short |
integer |
long |
浮点数: 123.45
|
float |
double |
字符串,有效日期: 2014-09-15
|
date |
index
index 属性控制怎样索引字符串。它可以是下面三个值:
analyzed 首先分析字符串,然后索引它。换句话说,以全文索引这个域。string 域 index 属性默认是 analyzed
not_analyzed 索引这个域,所以它能够被搜索,但索引的是精确值。不会对它进行分析。
no 不索引这个域。这个域不会被搜索到。
其他简单类型(例如 long , double , date 等)也接受 index 参数,但有意义的值只有 no 和 not_analyzed , 因为它们永远不会被分析
analyzed
对于 analyzed 字符串域,用 analyzer 属性指定在搜索和索引时使用的分析器。默认, Elasticsearch 使用 standard 分析器, 但你可以指定一个内置的分析器替代它,例如 whitespace 、 simple 和 english :
其他mapping设置
_source
元数据:
1.搜索结果包括了整个可用的文档——不需要额外的从另一个的数据仓库来取文档。
2.如果没有 _source 字段,部分 update 请求不会生效。
3.当你的映射改变时,你需要重新索引你的数据,有了_source字段你可以直接从Elasticsearch这样做,而不必从另一个(通常是速度更慢的)数据仓库取回你的所有文档。
4.当你不需要看到整个文档时,单个字段可以从 _source 字段提取和通过 get 或者 search 请求返回。
调试查询语句更加简单,因为你可以直接看到每个文档包括什么,而不是从一列id猜测它们的内容
可以禁用元数据
"_source": {
"enabled": false
}
_all
_all 字段:一个把其它字段值 当作一个大字符串来索引的特殊字段。 query_string 查询子句(搜索 ?q=john )在没有指定字段时默认使用 _all 字段
禁用
"my_type": {
"_all": { "enabled": false }
}
或者通过 include_in_all 设置来逐个控制字段是否要包含在 _all 字段中,默认值是 true`。比如下例中title包含在_all内
PUT /my_index/my_type/_mapping
{
"my_type": {
"include_in_all": false,
"properties": {
"title": {
"type": "string",
"include_in_all": true
},
...
}
}
}
_all 字段仅仅是一个 经过分词的 string 字段。它使用默认分词器来分析它的值,不管这个值原本所在字段指定的分词器。就像所有 string 字段,你可以配置 _all 字段使用的分词器
PUT /my_index/my_type/_mapping
{
"my_type": {
"_all": { "analyzer": "whitespace" }
}
}
dynamic
当 Elasticsearch 遇到文档中以前 未遇到的字段,它用 dynamic mapping 来确定字段的数据类型并自动把新的字段添加到类型映射
true 动态添加新的字段--缺省
false 忽略新的字段
strict 如果遇到新字段抛出异常
dynamic
设置可以适用在根对象上或者object
类型的任意字段上。你应该默认地将dynamic
设置为strict
,但是为某个特定的内部对象启用它
PUT /my_index
{
"mappings": {
"my_type": {
"dynamic": "strict",
"properties": {
"title": { "type": "string"},
"stash": {
"type": "object",
"dynamic": true
}
}
}
}
}
更新映射
删除索引
DELETE /gb
创建索引
PUT /gb
{
"mappings": {
"tweet" : {
"properties" : {
"tweet" : {
"type" : "string",
"analyzer": "english"
},
"date" : {
"type" : "date"
},
"name" : {
"type" : "string"
},
"user_id" : {
"type" : "long"
}
}
}
}
}
添加索引域
tweet 映射增加一个新的名为 tag 的 not_analyzed 的文本域
PUT /gb/_mapping/tweet
{
"properties" : {
"tag" : {
"type" : "string",
"index": "not_analyzed"
}
}
}
查询(elasticsearch-head 需要用POST执行复杂查询)
GET /索引名称/类型名称/
_search 搜索所有,返回结果包括了所有文档,放在数组 hits
中
GET /索引名称/类型名称/
_search[?q=key:value][?q=+key1:value1+key2:value2] 查询字符串 (_query-string_) 搜索,即key中包含value的文档,https://www.elastic.co/guide/cn/elasticsearch/guide/current/search-lite.html待深入,基本只有一个参数能成功
结果
hits ,它 包含 total 字段来表示匹配到的文档总数,并且一个 hits 数组包含所查询结果的前十个文档。
在 hits 数组中每个结果包含文档的 _index 、 _type 、 _id ,加上 _source 字段。这意味着我们可以直接从返回的搜索结果中使用整个文档。这不像其他的搜索引擎,仅仅返回文档的ID,需要你单独去获取文档。
每个结果还有一个 _score ,它衡量了文档与查询的匹配程度。默认情况下,首先返回最相关的文档结果,就是说,返回的文档是按照 _score 降序排列的。在这个例子中,我们没有指定任何查询,故所有的文档具有相同的相关性,因此对所有的结果而言 1 是中性的 _score 。
max_score 值是与查询所匹配文档的 _score 的最大值
took 值告诉我们执行整个搜索请求耗费了多少毫秒。
_shards 部分 告诉我们在查询中参与分片的总数,以及这些分片成功了多少个失败了多少个。
使用查询表达式搜索
GET + 路径 + JSON请求体(JSON 文档)
{
"query" : {
"match" : {
"key" : "value"
}
}
"_source": [ "title", "created" ]
}
match
匹配查询 match_phrase 模糊匹配
高亮 highlight {"fields" : {"about" : {}}}
更复杂的搜索
GET /megacorp/employee/_search 或者 POST /megacorp/employee/_search
{
"query" : {
"bool": {
"must": {
"match" : {
"key1" : "value1"
}
},
"filter": {
"range" : {
"key2" : { "gt" : intValue2 }
}
}
}
}
}
intValue2是int类型,没有前后双引号
过滤器 filter支持结构化查询,比如范围查询 range
分析
聚合(aggregations),允许我们基于数据生成一些精细的分析结果。聚合与 SQL 中的 GROUP BY
类似但更强大。
集群健康
GET /_cluster/health
检查文档是否存在
curl -I -XHEAD http://localhost:9200/website/blog/123
如果文档存在, Elasticsearch 将返回一个 200 ok
的状态码:
HTTP/1.1 200 OK
Content-Type: text/plain; charset=UTF-8
Content-Length: 0
若文档不存在, Elasticsearch 将返回一个 404 Not Found
的状态码:
curl -I -XHEAD http://localhost:9200/website/blog/124
HTTP/1.1 404 Not Found
Content-Type: text/plain; charset=UTF-8
Content-Length: 0
使用脚本部分更新文档编辑
脚本可以在 update API中用来改变 _source 的字段内容, 它在更新脚本中称为 ctx._source 。 例如,我们可以使用脚本来增加博客文章中 views 的数量:
POST /website/blog/1/_update
{
"script" : "ctx._source.views+=1"
}
取回多个文档,将多个请求合并成一个,避免单独处理每个请求花费的网络延时和开销。
mget API 要求有一个 docs 数组作为参数,每个 元素包含需要检索文档的元数据, 包括 _index 、 _type 和 _id 。如果你想检索一个或者多个特定的字段,那么你可以通过 _source 参数来指定这些字段的名字:
GET /_mget
{
"docs" : [
{
"_index" : "website",
"_type" : "blog",
"_id" : 2
},
{
"_index" : "website",
"_type" : "pageviews",
"_id" : 1,
"_source": "views"
}
]
}
如果想检索的数据都在相同的 _index 中(甚至相同的 _type 中),则可以在 URL 中指定默认的 /_index 或者默认的 /_index/_type
GET /website/blog/_mget
{
"docs" : [
{ "_id" : 2 },
{ "_type" : "pageviews", "_id" : 1 }
]
}
如果所有文档的 _index 和 _type 都是相同的,你可以只传一个 ids 数组,而不是整个 docs 数组:
GET /website/blog/_mget
{
"ids" : [ "2", "1" ]
}
该响应体也包含一个 docs 数组 , 对于每一个在请求中指定的文档,这个数组中都包含有一个对应的响应,且顺序与请求中的顺序相同。
其他批量操作 bulk
API
{ action: { metadata }}\n
{ request body }\n
{ action: { metadata }}\n
{ request body }\n
...
它通过换行符(\n)连接到一起。注意两个要点:
每行一定要以换行符(\n)结尾, 包括最后一行 。这些换行符被用作一个标记,可以有效分隔行。
这些行不能包含未转义的换行符,因为他们将会对解析造成干扰。这意味着这个 JSON 不 能使用 pretty 参数打印。
相关推荐
本教程旨在带领大家进入搜索引擎领域,从无到有,深入浅出的讲解了什么是搜索引擎,搜索引擎的作用以及ElasticSearch在实际工作中的作用等,课程从如下几个角度,完成让大家了解的过程: Elasticsearch概念 Elastic...
Elasticsearch也是使用Java编写并使用Lucene来建立索引并实现搜索功能,但是它的目的是通过简单连贯的RESTful API让全文搜索变得简单并隐藏Lucene的复杂性。本文涉及Elasticsearch的一些基本概念以及操作。还重点...
Elasticsearch也是使用Java编写并使用Lucene来建立索引并实现搜索功能,但是它的目的是通过简单连贯的RESTful API让全文搜索变得简单并隐藏Lucene的复杂性。 不过,Elasticsearch不仅仅是Lucene和全文搜索引擎,它...
Hadoop——一种分布式编程框架第1章 Hadoop简介 21.1 为什么写《Hadoop 实战》 31.2 什么是Hadoop 31.3 了解分布式系统和Hadoop 41.4 比较SQL数据库和Hadoop 51.5 理解MapReduce 61.5.1 动手扩展一个简单程序 ...
ik-elasticsearch 需要了解Docker, 基础linux命令 概述 全文搜索引擎,可以快速地储存、搜索和分析海量数据. Lucene是一个高性能和全功能搜索引擎功能的库 es相当于 Lucene 的一层封装,它提供了一套简单一致的 ...
ElasticSearch简单使用说明 目录 简介 基础入门 安装并运行Elasticsearch 与Elasticsearch交互 面向文档 基本概念 索引创建与删除 文档简单的CURD操作 深入了解 自定义配置 集群内的原理 映射和分析 排序与相关性 ...
进阶Elasticsearch训练 警告:本培训资料并非真正为自我指导而设计。 它假定讲师将口头解释很多材料。 本材料还假定您已经涵盖了基础知识,包括简单查询,索引映射,相关性评分和自定义分析器。 参见例如 话题 ...
opengl曲棍球游戏,了解着色器,纹理 1. Shader Shader其实就是一段执行在GPU上的程序,此程序使用OpenGL ES SL语言来编写。它是一个描述顶点或像素特性的简单程序。在opengles中常用的shader有两种:vertex ...
Elasticsearch Elasticsearch 是一个基于 Apache ...Elasticsearch 也是使用 Java 编写并使用 Lucene 来建立索引并实现搜索功能,但是它的目的是通过简单连贯的 RESTful API 让全文搜索变得简单并隐藏 Lucene 的复杂性
Hadoop简介 21.1 为什么写《Hadoop 实战》 31.2 什么是Hadoop 31.3 了解分布式系统和Hadoop 41.4 比较SQL数据库和Hadoop 51.5 理解MapReduce 61.5.1 动手扩展一个简单程序 71.5.2 相同程序在MapReduce...
之前博客有用logstash-input-jdbc同步mysql数据到ElasticSearch,但是由于同步时间最少是一分钟一次,无法满足线上业务,所以只能自己实现一个,但是时间比较紧,所以简单实现一个思路:网上有很多思路用什么mysql的...
不过 object 模型和经典的,比如 Java,C++ 和 Python(我目前就了解这么多)的模型相比还是有很大不同的。 在苦苦探索 Go 的 object 是如何工作的过程中,放弃传统的 object 观念,而只从函数方面考虑问题,这让我...
1、内容概要:Hadoop+Spark+Hive+HBase+Oozie+Kafka+Flume+Flink+Elasticsearch+Redash等大数据集群及组件搭建指南(详细搭建步骤+实践过程问题总结)。 2、适合人群:大数据运维、大数据相关技术及组件初学者。 3、...
这是一个用引导的项目。入门首先,运行开发服务器: npm run dev# oryarn dev 使用浏览器打开以查看结果...在Vercel上部署部署Next.js应用程序的最简单方法是使用Next.js创建者提供的。 查看我们的以了解更多详细信息。
通过学习Spring Boot,我了解了现代化的Java Web开发方式,并通过实践构建了一些简单的Web应用程序。我还意识到在学习过程中遇到的困难和挑战是正常的,通过不断的努力和学习,我能够克服这些困难并取得进步。 在...
本课程全程使用目前比较流行的开发工具idea进行开发,采用现在互联网流行的微服务架构SpringBoot+SpringCloud+JPA, 同时也使用了互联网的高并发中间件redis,ElasticSearch,RabbitMQ,MongoDB数据库,springSecurity...
从示例中学习Elasticsearch =================================== 我们都喜欢Elasticsearch。 不是吗Elasticsearch( )疯狂地增长着,但是不幸的是,该文档缺乏具体的示例,使人们快速制定查询变得更加困难。 基于...
Postgresql 和 ElasticSearch 嵌入式示例此示例演示了将 PostgreSQL 和 ElasticSearch 嵌入到您的 Java 应用程序中的方法。 它旨在展示如何以简单的方式使用 、 和 。 要了解它是如何工作的,请看一下: // start ...
使用其文档REST API,将少量数据复制到ElasticSearch ES很简单。 对于适量的数据,它可以是相同的,但是会花费更长的时间。 但是对于大量操作,您希望并行化此操作并使用多个进程来执行此操作,这需要进行调度。 另...
学习 Android 平台 OpenGL ES API,了解 OpenGL 开发的基本流程,使用 OpenGL 绘制一个三角形 6.学习 Android 平台 OpenGL ES API,学习纹理绘制,能够使用 OpenGL 显示一张图片 7.学习 MediaCodec API,完成音频 ...