文档章节

elasticsearch 学习记录

skanda
 skanda
发布于 2017/07/25 15:40
字数 1363
阅读 22
收藏 0

es基于lucene实现。https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html

es文档元数据
一个文档不三个必须的元数据元素如下:
_index
文档在哪存放。一个 索引 应该是因共同的特性被分组到一起的文档集合。
_type
文档表示的对象类别。索引子分区。
_id
文档唯一标识。可以用户自定义或者自动生成.自动生成的 ID 是 URL-safe、 基于 Base64 编码且长度为20个字符的 GUID 字符串。 这些 GUID 字符串由可修改的 FlakeID 模式生成,这种模式允许多个节点并行生成唯一 ID ,且互相之间的冲突概率几乎为零。

非必须的元素:

_version,记录文档版本号。在 Elasticsearch 中每个文档都有一个版本号。当每次对文档进行修改时(包括删除), _version 的值会递增。

 

es查询结果标识

took:查询话费时间;

shards:查询过程参与的分片数。

timeout:是否超时,timeout时间可以设置:

GET /_search?timeout=10ms

hits:

total:它 包含 total 字段来表示匹配到的文档总数,并且一个 hits 数组包含所查询结果的前十个文档。

每个结果还有一个 _score ,它衡量了文档与查询的匹配程度。默认情况下,首先返回最相关的文档结果,就是说,返回的文档是按照 _score 降序排列的。在这个例子中,我们没有指定任何查询,故所有的文档具有相同的相关性,因此对所有的结果而言 1 是中性的 _score 。max_score 值是与查询所匹配文档的 _score 的最大值。

 

t@ubuntu:~$ curl -XGET 'localhost:9200/_search?pretty'
{
  "took" : 759,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 3,
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "website",
        "_type" : "blog",
        "_id" : "123",
        "_score" : 1.0,
        "_source" : {
          "title" : "My first blog entry",
          "text" : "I am starting to get the hang of this...",
          "date" : "2014/01/02"
        }
      },
      {
        "_index" : "website",
        "_type" : "blog",
        "_id" : "AV6ZDic0Gtb1Pf5XS4Nu",
        "_score" : 1.0,
        "_source" : {
          "title" : "My second blog entry",
          "text" : "Still trying this out...",
          "date" : "2014/01/01"
        }
      },
      {
        "_index" : "website",
        "_type" : "blog",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "title" : "My first blog entry",
          "text" : "Starting to get the hang of this...",
          "views" : 2,
          "tags" : [
            "testing"
          ]
        }
      }
    ]
  }
}

es增删改查

1,保存文档

PUT /website/blog/123
{
  "title": "My first blog entry",
  "text":  "Just trying this out...",
  "date":  "2014/01/01"
}

2,查询文档

  根据id查询

GET /website/blog/123?pretty

查询部分字段,仅查询title和text字段

GET /website/blog/123?_source=title,text

查询结果不需要元数据

GET /website/blog/123/_source

查询文档是否存在

curl -i -XHEAD http://localhost:9200/website/blog/123

存在:200

不存在:404

搜索返回指定字段

http://ip:9200/index/type/_search?_source=createTime

查询多个文档:

GET /_mget
{
   "docs" : [
      {
         "_index" : "website",
         "_type" :  "blog",
         "_id" :    2
      },
      {
         "_index" : "website",
         "_type" :  "pageviews",
         "_id" :    1,
         "_source": "views"
      }
   ]
}

多索引,多类型查询:

/_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 类型

分页:

GET /_search?size=5&from=10

http://localhost:9200/ct_ws/type/_search?sort=createTime:desc&pretty&size=20000&from=0&_source=createTime,url

3,修改文档

根据id,再传一次文档就好,version值会自动递增

PUT /website/blog/123
{
  "title": "My first blog entry",
  "text":  "I am starting to get the hang of this...",
  "date":  "2014/01/02"
}
t@ubuntu:~$ curl -XPUT 'localhost:9200/website/blog/123?pretty' -H 'Content-Type: application/json' -d'
> {
>   "title": "My first blog entry",
>   "text":  "I am starting to get the hang of this...",
>   "date":  "2014/01/02"
> }
> '
{
  "_index" : "website",
  "_type" : "blog",
  "_id" : "123",
  "_version" : 2,
  "result" : "updated",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "created" : false
}

在es内部,旧文档会被删除,新文档重新索引 ;

根据id新增字段

POST /website/blog/1/_update
{
   "doc" : {
      "tags" : [ "testing" ],
      "views": 0
   }
}

根据id修改字段,让views值增1

POST /website/blog/1/_update
{
   "script" : "ctx._source.views+=1"
}

eg:

t@ubuntu:~$ curl -XPOST 'localhost:9200/website/blog/1/_update?pretty' -H 'Content-Type: application/json' -d'
{
   "script" : "ctx._source.views+=1"
}
'
{
  "_index" : "website",
  "_type" : "blog",
  "_id" : "1",
  "_version" : 5,
  "result" : "updated",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  }
}
t@ubuntu:~$ curl -XGET 'localhost:9200/website/blog/1?pretty'                                                 
{
  "_index" : "website",
  "_type" : "blog",
  "_id" : "1",
  "_version" : 5,
  "found" : true,
  "_source" : {
    "title" : "My first blog entry",
    "text" : "Starting to get the hang of this...",
    "views" : 2,
    "tags" : [
      "testing"
    ]
  }
}
t@ubuntu:~$ 

 

4,删除文档

删除文档不会立即将文档从磁盘中删除,只是将文档标记为已删除状态

根据id删除文档

DELETE /website/blog/123

批量操作

POST /_bulk
{ "delete": { "_index": "website", "_type": "blog", "_id": "123" }} 
{ "create": { "_index": "website", "_type": "blog", "_id": "123" }}
{ "title":    "My first blog post" }
{ "index":  { "_index": "website", "_type": "blog" }}
{ "title":    "My second blog post" }
{ "update": { "_index": "website", "_type": "blog", "_id": "123", "_retry_on_conflict" : 3} }
{ "doc" : {"title" : "My updated blog post"} } 

清空索引数据,类似于mysql的drop talble操作

curl -XPOST 'http://ip:9600/megacorp/employee/_delete_by_query' -H 'Content-Type: application/json' -d'
{
     "query": {
        "match_all": {}
    }
}
'

并发控制

es通过version对并发读写进行控制:

对已经创建的文档,只有versin=1时才修改

PUT /website/blog/1?version=1 
{
  "title": "My first blog entry",
  "text":  "Starting to get the hang of this..."
}

如果version值不一致,会引发报错:

t@ubuntu:~$ 
t@ubuntu:~$ curl -XPUT 'localhost:9200/website/blog/1?version=1&pretty' -H 'Content-Type: application/json' -d'
> {
>   "title": "My first blog entry",
>   "text":  "Starting to get the hang of this..."
> }
> '
{
  "error" : {
    "root_cause" : [
      {
        "type" : "version_conflict_engine_exception",
        "reason" : "[blog][1]: version conflict, current version [2] is different than the one provided [1]",
        "index_uuid" : "aGPDbTmcTjKyhQ4fEJ6NEw",
        "shard" : "3",
        "index" : "website"
      }
    ],
    "type" : "version_conflict_engine_exception",
    "reason" : "[blog][1]: version conflict, current version [2] is different than the one provided [1]",
    "index_uuid" : "aGPDbTmcTjKyhQ4fEJ6NEw",
    "shard" : "3",
    "index" : "website"
  },
  "status" : 409
}
t@ubuntu:~$ 

使用外部版本号:

PUT /website/blog/2?version=5&version_type=external
{
  "title": "My first external blog entry",
  "text":  "Starting to get the hang of this..."
}

 

© 著作权归作者所有

共有 人打赏支持
skanda
粉丝 9
博文 88
码字总数 50007
作品 0
厦门
当ES赶超Redis,这份ES进修攻略不容错过!

从4月DB-Engines最新发布的全球数据库排名中,我们赫然发现ElasticSearch逆袭超越了Redis,从原先的第9名上升至第8名,而Redis则落后一名,排在了其后。 事实上,这场逆袭并不算太让人意外。...

DBAplus社群
04/15
0
0
ElasticSearch学习笔记-相关度得分记录

最近想要修改调整一下ElasticSearch里面Doc的Score,于是在ES官网查阅了一下,相关的介绍和说明还是非常详细的,能做的修改调整也还是比较多的,需要根据具体的情形去选择相应的方式做合适的...

xiaomin0322
07/02
0
0
ELK 完整部署和使用 - 每天5分钟玩转 Docker 容器技术(90)

上一节已经部署了容器化的 ELK,本节讨论如何将日志导入 ELK 并进行图形化展示。 几乎所有的软件和应用都有自己的日志文件,容器也不例外。前面我们已经知道 Docker 会将容器日志记录到 ,那...

CloudMAN
2017/11/06
0
1
渣渣菜鸡为什么要看 ElasticSearch 源码?

前提 人工智能、大数据快速发展的今天,对于 TB 甚至 PB 级大数据的快速检索已然成为刚需,大型企业早已淹没在系统生成的浩瀚数据流当中。大数据技术业已集中在如何存储和处理这些海量的数据...

Java小铺
08/10
0
0
ES(elasticsearch)搜索引擎

ES(elasticsearch)搜索引擎 0、授人以渔,少走半年弯路! 死磕 Elasticsearch 方法论:普通程序员高效精进的 10 大狠招! 一、Elasitcsearch基础篇 1.1 Elasitcsearch基础认知 1、Elasticse...

Ocean_K
09/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

学hadoop需要什么基础

最近一段时间一直在接触关于hadoop方面的内容,从刚接触时的一片空白,到现在也能够说清楚一些问题。这中间到底经历过什么只怕也就是只有经过的人才会体会到吧。前几天看到有个人问“学hadoo...

左手的倒影
21分钟前
1
0
LOADING Redis is loading the dataset in memory

Redis出现错误 LOADING Redis is loading the dataset in memory 原因是: redis中dump.rdb文件到达3G时,所有redis的操作都会抛出此异常。 解决方法: redis.conf中 maxmemory 调大。 另外一...

swingcoder
21分钟前
0
0
闪屏页设置

相信每个app都需要一个闪屏页 就是一个开始页面 对于新手来说 可能就直接一个activity 弄个背景图片 ,细心地同学也许会发现 每次启动 应用程序的时候 一开始显示的不是那个设置的背景图片 ...

王先森oO
26分钟前
1
0
解析Excel

import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.util.ArrayList;import java.util.List;import or......

开源中国封号找我
31分钟前
0
0
pandas不能在pycharm中使用plot()方法显示图像的解决方法

最近用了pycharm,感觉还不错,就是pandas中Series、DataFrame的plot()方法不显示图片就给我结束了,但是我在ipython里就能画图 以前的代码是这样的 import matplotlib.pyplot as pltfrom p...

kipeng300
34分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部