Elasticsearch高级教程(一)

 

Elasticsearch相关术语介绍

概述

相关术语

索引 (index)

类型 (type)

文档 (document)

集群 (机群)cluster

典型代表:高性能计算机群hpc 富士康也有在做

通过map构建文档

XContentBuilder构建文档

基于索引库检索

根据_id检索

检索所有

根据条件检索

根据词条检索(注意默认分词器是分割单个汉字的,输入词组不识别)

模糊查询

使用RESTful操作Elasticsearch

Elasticsearch接口语法

创建索引

postman操作

删除索引

postman操作

创建文档

postman操作

修改文档

postman操作

查询文档

根据id查询

postman操作

根据querystring查询

postman操作

根据term查询

postman操作

删除文档

postman操作

 

Elasticsearch相关术语介绍

概述

Elasticsearch是面向文档(document oriented)的,它可以存储整个对象或文档(document)而不仅仅是存储(store),并且可以索引(index)每个文档的内容使之可以被搜索。在Elasticsearch中,可以对文档(而非成行成列的数据)进行索引、搜索、排序与过滤。Elasticsearch比较传统关系型数据库如下:

Relational DB    -> Databases    -> Tables    -> Rows       -> Columns

Elasticsearch       -> Indices       -> Types  -> Documents    -> Fields

相关术语

索引 (index)

索引是ElasticSearch存放数据的地方,可以理解为关系型数据库中的一个数据库。事实上,我们的数据被存储和索引在分片(shards)中,索引只是一个把一个或多个分片分组在一起的逻辑空间。这只是一些内部细节——我们的程序完全不用关心分片。对于我们的程序而言,文档存储在索引(index)中。剩下的细节由Elasticsearch关心既可。(索引的名字必须是全部小写,不能以下划线开头,不能包含逗号)

类型 (type)

类型用于区分同一个索引下不同的数据类型,相当于关系型数据库中的表。在Elasticsearch中,我们使用相同类型(type)的文档表示相同的“事物”,因为他们的数据结构也是相同的。每个类型(type)都有自己的映射(mapping)或者结构定义,就像传统数据库表中的列一样。所有类型下的文档被存储在同一个索引下,但是类型的映射(mapping)会告诉Elasticsearch不同的文档如何被索引。例如,我们假设你运营一个博客平台并且将你所有的数据存储到一个索引中。在这个索引中,你可以为用户数据定义一个类型,为博客数据定义另一个类型,当然,也可以为评论数据定义另一个类型。

文档 (document)

文档是ElasticSearch中存储的实体,类比关系型数据库,每个文档相当于数据库表中的一行数据。 在Elasticsearch中,文档(document)这个术语有着特殊含义。它特指最顶层结构或者根对象(root object)序列化成的JSON数据(以唯一ID标识并存储于Elasticsearch中)。文档由字段组成,相当于关系数据库中列的属性,不同的是ES的不同文档可以具有不同的字段集合。

集群 (机群)cluster

典型代表:高性能计算机群hpc 富士康也有在做

一个集群就是由一个或多个节点组织在一起,它们共同持有整个的数据,并一起提供索引和搜索功能。一个集群由一个唯一的名字标识,这个名字默认就是“elasticsearch”。这个名字是重要的,因为一个节点只能通过指定某个集群的名字,来加入这个集群。

 分片&副本  shard&replicas

分片:一个索引可以存储超出单个节点硬件限制的大量数据。比如,一个具有10亿文档的索引占据1TB的磁盘空间,而任一节点都没有这样大的磁盘空间;或者单个节点处理搜索请求,响应太慢。分解为很多的足够小片段,以便能够在其上进行传输

副本  :复制之所以重要,有两个主要原因: 在分片/节点失败的情况下,提供了高可用性。因为这个原因,注意到复制分片从不与原/主要(original/primary)分片置于同一节点上是非常重要的。扩展你的搜索量/吞吐量,因为搜索可以在所有的复制上并行运行。总之,每个索引可以被分成多个分片。

一个索引也可以被复制0次(意思是没有复制)或多次。一旦复制了,每个索引就有了主分片(作为复制源的原来的分片)和复制分片(主分片的拷贝)之别。分片和复制的数量可以在索引创建的时候指定。在索引创建之后,你可以在任何时候动态地改变复制的数量,但是你事后不能改变分片的数量。

默认情况下,Elasticsearch中的每个索引被分片5个主分片和1个复制,这意味着,如果你的集群中至少有两个节点,你的索引将会有5个主分片和另外5个复制分片(1个完全拷贝),这样的话每个索引总共就有10个分片。

通过map构建文档

//通过Map构建文档

@Test

public void createIndex() throws UnknownHostException {

    Client client =

            new PreBuiltTransportClient(Settings.EMPTY).

                    addTransportAddress(new InetSocketTransportAddress

                            (InetAddress.getByName("127.0.0.1"), 9300));

    Map map = new HashMap<>();

    map.put("biaoshi","swqsv1");

    map.put("title","如何学好es");

    map.put("content", "多看书,多写代码");

   

    client.prepareIndex("blog", "article", "swqsv2").setSource(map).get();

    client.close();

}

 

XContentBuilder构建文档

@Test

public void createIndexByXContentBuildder() throws IOException {

    Client client = new PreBuiltTransportClient(Settings.EMPTY)

            .addTransportAddress(new InetSocketTransportAddress

                    (InetAddress.getByName("127.0.0.1"), 9300));

    

    XContentBuilder sourceBuilder = XContentFactory.jsonBuilder();

    sourceBuilder.startObject();    // 构建对象开始

    sourceBuilder.field("biaoshi2", "swqsv2");

    sourceBuilder.field("title", "你会thread么");

    sourceBuilder.field("content", "进入多线程的学习阶段");

    sourceBuilder.endObject();      // 构建对象结束

    // setSource(map):创建文档

    client.prepareIndex("java", "java基础", "swqsv3").setSource(sourceBuilder).get();

    // 4、关闭资源

    client.close();

}

基于索引库检索

根据_id检索

@Test

public void queryIndexBy_Id() throws Exception {

    // 1、创建es客户端对象并且连接es服务

    TransportClient client = new PreBuiltTransportClient(Settings.EMPTY);

    client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));

    // 2、api方法调用

    GetResponse response = client.prepareGet("java", "java基础", "swqsv3").get();

    // 3、处理结果集

    String json = response.getSourceAsString();

    System.out.println(json);

    // 关闭资源

    client.close();

}

检索所有

@Test

public void queryIndexByAll() throws Exception {

    // 1、创建es客户端对象并且连接es服务

    TransportClient client = new PreBuiltTransportClient(Settings.EMPTY);

    client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));

    // 2、api方法调用

    SearchResponse response = client.prepareSearch("blog").setTypes("article").

            setQuery(QueryBuilders.matchAllQuery()).get();// 设置查询条件:matchAllQuery,查询所有

    // 3、结果集处理

    SearchHits hits = response.getHits();

    long totalHits = hits.totalHits;

    System.out.println("总条数:" + totalHits);

    Iterator iterator = hits.iterator();

    while (iterator.hasNext()){ // 遍历结果集

        SearchHit searchHit = iterator.next();

        String title = searchHit.getSource().get("title").toString();

        System.out.println("title值:" + title);

        String json = searchHit.getSourceAsString();

        System.out.println("文档值:" + json);

    }

}

根据条件检索

@Test

public void queryIndexByString() throws Exception {

    // 1、创建es客户端对象并且连接es服务

    TransportClient client = new PreBuiltTransportClient(Settings.EMPTY);

    client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));

    // 2、api方法调用

    SearchResponse response = client.prepareSearch("blog").setTypes("article").

            setQuery(QueryBuilders.queryStringQuery("代码").field("content")) // 设置查询条件:queryStringQuery,指定查询条件

            .get();

    // 3、结果集处理

    SearchHits hits = response.getHits();

    long totalHits = hits.totalHits;

    System.out.println("总条数:" + totalHits);

    Iterator iterator = hits.iterator();

    while (iterator.hasNext()){ // 遍历结果集

        SearchHit searchHit = iterator.next();

        String title = searchHit.getSource().get("title").toString();

        System.out.println("title值:" + title);

        String json = searchHit.getSourceAsString();

        System.out.println("文档值:" + json);

    }

}

根据词条检索(注意默认分词器是分割单个汉字的,输入词组不识别)

@Test

public void queryIndexByTerm() throws Exception {

    // 1、创建es客户端对象并且连接es服务

    TransportClient client = new PreBuiltTransportClient(Settings.EMPTY);

    client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));

    // 2、api方法调用

    SearchResponse response = client.prepareSearch("blog").setTypes("article").

            setQuery(QueryBuilders.termQuery("content", "看")) // 设置查询条件:termQuery,指定词条

            .get();

    // 3、结果集处理

    SearchHits hits = response.getHits();

    long totalHits = hits.totalHits;

    System.out.println("总条数:" + totalHits);

    Iterator iterator = hits.iterator();

    while (iterator.hasNext()){ // 遍历结果集

        SearchHit searchHit = iterator.next();

        String title = searchHit.getSource().get("title").toString();

        System.out.println("title值:" + title);

        String json = searchHit.getSourceAsString();

        System.out.println("文档值:" + json);

    }

}

模糊查询

*:匹配0个或者多个

?:匹配一个

SearchResponse response = client.prepareSearch("blog").setTypes("article").

        setQuery(QueryBuilders.wildcardQuery("content", "?看")) // 设置查询条件:termQuery,指定词条

        .get();

使用RESTful操作Elasticsearch

RESTful介绍

RESTful是一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。RESTful是目前最流行的 API 设计规范,用于 Web 数据接口的设计。

GET    用来获取资源,

POST  用来新建资源(也可以用于更新资源),

PUT    用来更新资源,

DELETE  用来删除资源。

Elasticsearch接口语法

#语法 Linux

curl -X '://:/?' -d ''

 

#栗子

curl -XPUT http://localhost:9200/blog/article/1 -d '{"title": "New version of

Elasticsearch released!", content": "Version 1.0 released today!", "tags": ["announce",

"elasticsearch", "release"] }'

参数

解释

VERB

适当的 HTTP 方法 或 谓词 : GET、 POST、 PUT、 HEAD 或者 DELETE。

PROTOCOL

http 或者 https(如果你在 Elasticsearch 前面有一个 https 代理)

HOST

Elasticsearch 集群中任意节点的主机名,或者用 localhost 代表本地机器上的节点。

PORT

运行 Elasticsearch HTTP 服务的端口号,默认是 9200 。

PATH

API 的终端路径(例如 count 将返回集群中文档数量)。Path 可能包含多个组件,例如:cluster/stats 和 _nodes/stats/jvm 。 | | QUERY_STRING | 任意可选的查询字符串参数 (例如 ?pretty 将格式化地输出 JSON 返回值,使其更容易阅读) | | BODY | 一个 JSON 格式的请求体 (如果请求需要的话) |

 创建索引

 请求url:

PUT

http://localhost:9200/blog2

 请求体:

{

    "mappings": {

"article": {

"properties": {

"id": {

"type": "long",

"store": false,

"index":"not_analyzed"

},

"title": {

"type": "text",

"store": false,

"index":"analyzed",

"analyzer":"ik_smart"

},

"content": {

"type": "text",

"store": false,

"index":"analyzed",

"analyzer":"ik_smart"

}

}

}

}

}

postman操作

 删除索引

 请求url

DELETE      

http://localhost:9200/blog2

postman操作

 创建文档

 请求url(需要重新创建映射blog2)

POST  

http://localhost:9200/blog2/article/1

 请求体

{

    "id":1,

    "title":"ElasticSearch是一个基于Lucene的搜索服务器",

    "content":"它提供了一个分布式多用户能力的全文搜索引擎,基于RESTfulweb接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够时搜索。"

}

postman操作

修改文档

 请求url(如果article=1的存在,执行更新操作;否则执行插入操作)

POST

http://localhost:9200/blog2/article/1

 请求体

{

    "id":1,

    "title":"ElasticSearch是一个基于Lucene的搜索服务器-死亡骑士v",

    "content":"它提供了一个分布式多用户能力的全文搜索引擎,基于RESTfulweb接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够时搜索。"

}

postman操作

查询文档

 根据id查询

 请求url

GET    

 http://localhost:9200/blog2/article/1

postman操作

根据querystring查询

 请求url

POST      

http://localhost:9200/blog2/article/_search

 请求体

{

"query": {

"query_string": {

"default_field": "title",

"query": "搜索服务器"

}

}

}

postman操作

 根据term查询

 请求url

POST    

http://localhost:9200/blog2/article/_search

 请求体

{

"query": {

"term": {

"title": "搜索"

}

}

}

postman操作

删除文档

 请求url

DELETE  

http://localhost:9200/blog2/article/1

postman操作

你可能感兴趣的:(后端开发)