欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

elasticsearch教程安装及测试

程序员文章站 2022-04-06 22:16:42
...

elasticsearch

简介

ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

ElasticSearch核心概念

    接近实时(NRT

    Elasticsearch是一个接近实时的搜索平台。这意味着,从索引一个文档直到这个文档能够被搜索到有一个轻微的延迟(通常是1秒)。

    集群(cluster

       一个集群就是由一个或多个节点组织在一起,它们共同持有你整个的数据,并一起提供索引和搜索功能。一个集群由一个唯一的名字标识,这个名字默认就是elasticsearch”。这个名字是重要的,因为一个节点只能通过指定某个集群的名字,来加入这个集群。在产品环境中显式地设定这个名字是一个好习惯,但是使用默认值来进行测试/开发也是不错的。

    节点(node

        一个节点是你集群中的一个服务器,作为集群的一部分,它存储你的数据,参与集群的索引和搜索功能。和集群类似,一个节点也是由一个名字来标识的,默认情况下,这个名字是一个随机的漫威漫画角色的名字,这个名字会在启动的时候赋予节点。这个名字对于管理工作来说挺重要的,因为在这个管理过程中,你会去确定网络中的哪些服务器对应于Elasticsearch集群中的哪些节点。

      一个节点可以通过配置集群名称的方式来加入一个指定的集群。默认情况下,每个节点都会被安排加入到一个叫做“elasticsearch”的集群中,这意味着,如果你在你的网络中启动了若干个节点,并假定它们能够相互发现彼此,它们将会自动地形成并加入到一个叫做“elasticsearch”的集群中。

        在一个集群里,只要你想,可以拥有任意多个节点。而且,如果当前你的网络中没有运行任何Elasticsearch节点,这时启动一个节点,会默认创建并加入一个叫做“elasticsearch”的集群。

       

    索引(index

                一个索引就是一个拥有几分相似特征的文档的集合。比如说,你可以有一个客户数据的索引,另一个产品目录的索引,还有一个订单数据的索引。一个索引由一个名字来标识(必须全部是小写字母的),并且当我们要对对应于这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字。

        在一个集群中,如果你想,可以定义任意多的索引。

   类型(type

        在一个索引中,你可以定义一种或多种类型。一个类型是你的索引的一个逻辑上的分类/分区,其语义完全由你来定。通常,会为具有一组共同字段的文档定义一个类型。比如说,我们假设你运营一个博客平台并且将你所有的数据存储到一个索引中。在这个索引中,你可以为用户数据定义一个类型,为博客数据定义另一个类型,当然,也可以为评论数据定义另一个类型。

      

    文档(document

               一个文档是一个可被索引的基础信息单元。比如,你可以拥有某一个客户的文档,某一个产品的一个文档,当然,也可以拥有某个订单的一个文档。文档以 JSONJavascript Object Notation)格式来表示,而JSON是一个到处存在的互联网数据交互格式。

         在一个index/type里面,只要你想,你可以存储任意多的文档。注意,尽管一个文档,物理上存在于一个索引之中,文档必须被索引/赋予一个索引的type

       

    分片和复制(shards & replicas

       

        一个索引可以存储超出单个结点硬件限制的大量数据。比如,一个具有10亿文档的索引占据1TB的磁盘空间,而任一节点都没有这样大的磁盘空间;或者单个节点处理搜索请求,响应太慢。

       

        为了解决这个问题,Elasticsearch提供了将索引划分成多份的能力,这些份就叫做分片。当你创建一个索引的时候,你可以指定你想要的分片的数量。每个分片本身也是一个功能完善并且独立的“索引”,这个“索引”可以被放置到集群中的任何节点上。

       

        分片之所以重要,主要有两方面的原因:

         - 允许你水平分割/扩展你的内容容量

        - 允许你在分片(潜在地,位于多个节点上)之上进行分布式的、并行的操作,进而提高性能/吞吐量

          至于一个分片怎样分布,它的文档怎样聚合回搜索请求,是完全由Elasticsearch管理的,对于作为用户的你来说,这些都是透明的。

                在一个网络/云的环境里,失败随时都可能发生,在某个分片/节点不知怎么的就处于离线状态,或者由于任何原因消失了,这种情况下,有一个故障转移机制是非常有用并且是强烈推荐的。为此目的,Elasticsearch允许你创建分片的一份或多份拷贝,这些拷贝叫做复制分片,或者直接叫复制。

                复制之所以重要,有两个主要原因:

            - 在分片/节点失败的情况下,提供了高可用性。因为这个原因,注意到复制分片从不与原/主要(original/primary)分片置于同一节点上是非常重要的。

            - 扩展你的搜索量/吞吐量,因为搜索可以在所有的复制上并行运行

           

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

       

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

安装启动

安装前准备

1)安装JDK

1、官网下载java8

 

2、设置环境变量 ,路径:计算机属性高级系统设置高级环境变量

classpath  .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar

path  后面增加; %JAVA_HOME%\bin;

JAVA_HOME C:\Program Files\Java\jdk1.8.0_172

 

2)测试准备

 

1、安装soupui

SOUPUI下载

https://www.soapui.org/downloads/thank-you-for-downloading-soapui.html

 

3)安装es

下载 https://www.elastic.co/downloads/elasticsearch

安装解压安装包

启动 ElasticSearch

启动测试,浏览器上输入,有以下内容则表示启动成功 http://localhost:9200/

name

"XZTwipC"

cluster_name

"elasticsearch"

cluster_uuid

"ZqiCnLhaTByswLxfivw2Ig"

version

 

number

"6.2.4"

build_hash

"ccec39f"

build_date

"2018-04-12T20:37:28.497551Z"

build_snapshot

false

lucene_version

"7.2.1"

minimum_wire_compatibility_version

"5.6.0"

minimum_index_compatibility_version

"5.0.0"

tagline

"You Know, for Search"

 

 

4)使用soupui测试

1、建立新的rest工程

2、建立新的rest 请求

method选择put

media type 选择 application/json

Elasticsearch入门教程

 

文档管理(CRUD)

创建索引

ElasticSearch索引中,对应于CRUD中的“创建”和“更新” - 如果对具有给定类型的文档进行索引,并且要插入原先不存在的ID 如果具有相同类型和ID的文档已存在,则会被覆盖。

 

要索引第一个JSON对象,我们对REST API创建一个PUT请求到一个由索引名称,类型名称和ID组成的URL 也就是:http://localhost:9200/<index>/<type>/[<id>]

 

索引和类型是必需的,而id部分是可选的。如果不指定IDElasticSearch会为我们生成一个ID 但是,如果不指定id,应该使用HTTPPOST而不是PUT请求。

 

索引名称是任意的。如果服务器上没有此名称的索引,则将使用默认配置来创建一个索引。

 

至于类型名称,它也是任意的。 它有几个用途,包括:

 

    每种类型都有自己的ID空间。

    不同类型具有不同的映射(“模式”,定义属性/字段应如何编制索引)

    搜索多种类型是可以的,并且也很常见,但很容易搜索一种或多种指定类型。

 

现在我们来索引一些内容! 可以把任何东西放到索引中,只要它可以表示为单个JSON对象。

新增索引

method选择put

url 输入PUT "http://localhost:9200/movies/movie/1

media type 选择 application/json

消息体输入json

{
    "title": "The Godfather",
    "director": "Francis Ford Coppola",
    "year": 1972
}

 

 
PUT http://localhost:9200/movies/movie/1
返回的结构体如下:

{

   "_index": "movies",

   "_type": "movie",

   "_id": "1",

   "_version": 1,

   "result": "created",

   "_shards":    {

      "total": 2,

      "successful": 1,

      "failed": 0

   },

   "_seq_no": 0,

   "_primary_term": 1

}

更新索引

现在,在索引中有了一部电影信息,接下来来了解如何更新它,添加一个类型列表。要做到这一点,只需使用相同的ID索引它。使用与之前完全相同的索引请求。

{
    "title":"The Godfather",
    "director":"Francis Ford Coppola",
    "year":1972,
    "genres":["Crime","Drama"]
}

 

返回的结构体如下:
{
   "_index":"movies",
   "_type":"movie",
   "_id":"1",
   "_version":2,
   "result":"updated",
   "_shards":{
      "total":2,
      "successful":1,
      "failed":0
   },
   "created":false
}

 

ID获取文档/索引

method选择get

GET "http://localhost:9200/movies/movie/1

删除文档

同样method选择delete
DELETE "http://localhost:9200/movies/movie/1"

 

搜索

预置以下几条数据

PUT "http://localhost:9200/movies/movie/1"

{

    "title": "The Godfather",

    "director": "Francis Ford Coppola",

    "year": 1972,

    "genres": ["Crime", "Drama"]

}

 

PUT "http://localhost:9200/movies/movie/2"

{

    "title": "Lawrence of Arabia",

    "director": "David Lean",

    "year": 1962,

    "genres": ["Adventure", "Biography", "Drama"]

}

 

PUT "http://localhost:9200/movies/movie/3"

{

    "title": "To Kill a Mockingbird",

    "director": "Robert Mulligan",

    "year": 1962,

    "genres": ["Crime", "Drama", "Mystery"]

}

 

PUT "http://localhost:9200/movies/movie/4"

{

    "title": "Apocalypse Now",

    "director": "Francis Ford Coppola",

    "year": 1979,

    "genres": ["Drama", "War"]

}

 

PUT "http://localhost:9200/movies/movie/5"

{

    "title": "Kill Bill: Vol. 1",

    "director": "Quentin Tarantino",

    "year": 2003,

    "genres": ["Action", "Crime", "Thriller"]

}

 

PUT "http://localhost:9200/movies/movie/6"

{

    "title": "The Assassination of Jesse James by the Coward Robert Ford",

    "director": "Andrew Dominik",

    "year": 2007,

    "genres": ["Biography", "Crime", "Drama"]

}

 

ElasticSearch具有和端点(_bulk)用于用单个请求索引多个文档

按照以下模式向URL发出请求:<index>/<type>/_search。其中,indextype都是可选的。

换句话说,为了搜索电影,可以对以下任一URL进行POST请求:

基本*文本搜索

查询DSL具有一长列不同类型的查询可以使用。 对于普通*文本搜索,最有可能想使用一个名称为查询字符串查询

查询字符串查询是一个高级查询,有很多不同的选项,ElasticSearch将解析和转换为更简单的查询树。如果忽略了所有的可选参数,并且只需要给它一个字符串用于搜索,它可以很容易使用。

POST "http://localhost:9200/_search
{
    "query":{
        "query_string":{
            "query":"kill"
        }
    }
}

指定搜索的字段

如果不使用“fields”字段,ElasticSearch查询将默认自动生成的名为_all的特殊字段,来基于所有文档中的各个字段匹配搜索。

POST "http://localhost:9200/_search"
{
    "query":{
        "query_string":{
            "query":"ford",
            "fields":["title"]
        }
    }
}

ElasticSearch查询DSL有各种各样的过滤器可供选择。对于这个简单的情况,某个字段应该匹配一个特定的值,一个条件过滤器就能很好地完成工作。

POST "http://localhost:9200/_search"
{
    "query":{
        "filtered":{
            "query":{
                "query_string":{
                    "query":"drama"
                }
            },
            "filter":{
                "term":{"year":1962}
            }
        }
    }
}