`

1.ElasticSearch简单了解

阅读更多

一个 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、ELK、搜索引擎、Lucene).rar

    本教程旨在带领大家进入搜索引擎领域,从无到有,深入浅出的讲解了什么是搜索引擎,搜索引擎的作用以及ElasticSearch在实际工作中的作用等,课程从如下几个角度,完成让大家了解的过程: Elasticsearch概念 Elastic...

    Elasticsearch学习总结

    Elasticsearch也是使用Java编写并使用Lucene来建立索引并实现搜索功能,但是它的目的是通过简单连贯的RESTful API让全文搜索变得简单并隐藏Lucene的复杂性。本文涉及Elasticsearch的一些基本概念以及操作。还重点...

    ES搜索引擎.pptx

    Elasticsearch也是使用Java编写并使用Lucene来建立索引并实现搜索功能,但是它的目的是通过简单连贯的RESTful API让全文搜索变得简单并隐藏Lucene的复杂性。 不过,Elasticsearch不仅仅是Lucene和全文搜索引擎,它...

    Hadoop实战

    Hadoop——一种分布式编程框架第1章 Hadoop简介 21.1 为什么写《Hadoop 实战》 31.2 什么是Hadoop 31.3 了解分布式系统和Hadoop 41.4 比较SQL数据库和Hadoop 51.5 理解MapReduce 61.5.1 动手扩展一个简单程序 ...

    基于javatcpsocket通信的拆包和装包源码-ik-elasticsearch:创建ik-elasticsearch的全过程

    ik-elasticsearch 需要了解Docker, 基础linux命令 概述 全文搜索引擎,可以快速地储存、搜索和分析海量数据. Lucene是一个高性能和全功能搜索引擎功能的库 es相当于 Lucene 的一层封装,它提供了一套简单一致的 ...

    word源码java-ElasticSearch-Simple-Share:组内关于ElasticSearch的简单使用说明内容分享

    ElasticSearch简单使用说明 目录 简介 基础入门 安装并运行Elasticsearch 与Elasticsearch交互 面向文档 基本概念 索引创建与删除 文档简单的CURD操作 深入了解 自定义配置 集群内的原理 映射和分析 排序与相关性 ...

    advanced-elasticsearch-training:针对那些已经了解基础知识的人员进行Elasticsearch培训

    进阶Elasticsearch训练 警告:本培训资料并非真正为自我指导而设计。 它假定讲师将口头解释很多材料。 本材料还假定您已经涵盖了基础知识,包括简单查询,索引映射,相关性评分和自定义分析器。 参见例如 话题 ...

    AirHockeyTouch1.rar

    opengl曲棍球游戏,了解着色器,纹理 1. Shader Shader其实就是一段执行在GPU上的程序,此程序使用OpenGL ES SL语言来编写。它是一个描述顶点或像素特性的简单程序。在opengles中常用的shader有两种:vertex ...

    Laravel + Elasticsearch 实现中文搜索的方法

    Elasticsearch Elasticsearch 是一个基于 Apache ...Elasticsearch 也是使用 Java 编写并使用 Lucene 来建立索引并实现搜索功能,但是它的目的是通过简单连贯的 RESTful API 让全文搜索变得简单并隐藏 Lucene 的复杂性

    Hadoop实战中文版.PDF

    Hadoop简介 21.1 为什么写《Hadoop 实战》 31.2 什么是Hadoop 31.3 了解分布式系统和Hadoop 41.4 比较SQL数据库和Hadoop 51.5 理解MapReduce 61.5.1 动手扩展一个简单程序 71.5.2 相同程序在MapReduce...

    用python简单实现mysql数据同步到ElasticSearch的教程

    之前博客有用logstash-input-jdbc同步mysql数据到ElasticSearch,但是由于同步时间最少是一分钟一次,无法满足线上业务,所以只能自己实现一个,但是时间比较紧,所以简单实现一个思路:网上有很多思路用什么mysql的...

    ES 数据查询流程-Search.md

    不过 object 模型和经典的,比如 Java,C++ 和 Python(我目前就了解这么多)的模型相比还是有很大不同的。 在苦苦探索 Go 的 object 是如何工作的过程中,放弃传统的 object 观念,而只从函数方面考虑问题,这让我...

    Hadoop+Spark+Hive+HBase+Oozie+Kafka+Flume+Flink+ES+Redash等详细安装部署

    1、内容概要:Hadoop+Spark+Hive+HBase+Oozie+Kafka+Flume+Flink+Elasticsearch+Redash等大数据集群及组件搭建指南(详细搭建步骤+实践过程问题总结)。 2、适合人群:大数据运维、大数据相关技术及组件初学者。 3、...

    mbr-web:Mecanicabranosera.es的新设计,带有由定制CMS生成的de API

    这是一个用引导的项目。入门首先,运行开发服务器: npm run dev# oryarn dev 使用浏览器打开以查看结果...在Vercel上部署部署Next.js应用程序的最简单方法是使用Next.js创建者提供的。 查看我们的以了解更多详细信息。

    基于ElasticSearch+Spark 构建高相关性搜索服务&千人千面推荐系统.zip

    通过学习Spring Boot,我了解了现代化的Java Web开发方式,并通过实践构建了一些简单的Web应用程序。我还意识到在学习过程中遇到的困难和挑战是正常的,通过不断的努力和学习,我能够克服这些困难并取得进步。 在...

    2小时学会ElasticSearch

    本课程全程使用目前比较流行的开发工具idea进行开发,采用现在互联网流行的微服务架构SpringBoot+SpringCloud+JPA, 同时也使用了互联网的高并发中间件redis,ElasticSearch,RabbitMQ,MongoDB数据库,springSecurity...

    learn_elasticsearch_from_example:通过示例了解有关Elaticsearch,NLP的信息

    从示例中学习Elasticsearch =================================== 我们都喜欢Elasticsearch。 不是吗Elasticsearch( )疯狂地增长着,但是不幸的是,该文档缺乏具体的示例,使人们快速制定查询变得更加困难。 基于...

    postgres-elastic-embedded-example:Postgresql 和 ElasticSearch 嵌入式示例

    Postgresql 和 ElasticSearch 嵌入式示例此示例演示了将 PostgreSQL 和 ElasticSearch 嵌入到您的 Java 应用程序中的方法。 它旨在展示如何以简单的方式使用 、 和 。 要了解它是如何工作的,请看一下: // start ...

    ConveyorBelt:将Azure诊断数据铲除到ElasticSearch

    使用其文档REST API,将少量数据复制到ElasticSearch ES很简单。 对于适量的数据,它可以是相同的,但是会花费更长的时间。 但是对于大量操作,您希望并行化此操作并使用多个进程来执行此操作,这需要进行调度。 另...

    android音视频.zip

    学习 Android 平台 OpenGL ES API,了解 OpenGL 开发的基本流程,使用 OpenGL 绘制一个三角形 6.学习 Android 平台 OpenGL ES API,学习纹理绘制,能够使用 OpenGL 显示一张图片 7.学习 MediaCodec API,完成音频 ...

Global site tag (gtag.js) - Google Analytics