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

(一)ElasticSearch-入门

程序员文章站 2022-04-28 09:41:28
目录:一.前言二.安装三.索引四.搜索五.聚合六.分布式的特性 一.前言Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎。无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。但是,Lucene只是一个库。想要使用它,你 ......

目录:





 

一.前言
elasticsearch是一个基于apache lucene(tm)的开源搜索引擎。无论在开源还是专有领域,lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。
但是,lucene只是一个库。想要使用它,你必须使用java来作为开发语言并将其直接集成到你的应用中,更糟糕的是,lucene非常复杂,你需要深入了解检索的相关知识来理解它是如何工作的。
elasticsearch也使用java开发并使用lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的restful api来隐藏lucene的复杂性,从而让全文搜索变得简单。
elasticsearch不仅仅是lucene和全文搜索,我们还能这样去描述它:
(1)分布式的实时文件存储,每个字段都被索引并可被搜索。
(2)分布式的实时分析搜索分布式的实时分析搜索引擎。
(3)可以扩展到上百台服务器,处理pb级结构化或非结构化数据。
而且,所有的这些功能被集成到一个服务里面,你的应用可以通过简单的restful api、各种语言的客户端甚至命令行与之交互。

 

二.安装
在安装elasticsearch引擎之前,必须安装es需要的软件环境,安装java jdk和配置java_home环境变量:
1.首先从oracle官网下载和安装java se开发包:

(一)ElasticSearch-入门

由于elasticsearch对jre的版本是很敏感的,错误的版本,会导致elasticsearch无法运行,我运行的项目elasticsearch版本是elasticsearch-2.4.4,所以对应java se版本是java se 8[java platform(jdk)8u121]。但是我们并没有看到对应java se版本,那么就得从java archive下载合适的版本,具体对应版本号如下所示:(一)ElasticSearch-入门

(一)ElasticSearch-入门

 下载并安装java se开发包之后,打开java控制面板,把自动更新选项勾选掉,防止其自动更新,导致后面es运行报错。具体操作如下所示:(一)ElasticSearch-入门

java se开发包安装完成之后,需要在服务器上创建java_home环境变量
点击“计算机”的属性->高级系统设置(advanced system setting)->高级->环境变量(environment variables),新建一个用户环境变量 java_home,设置变量值是:c:\program files\java\jdk1.8.0_121
注释:在windows系统中,“%环境变量名%”用法的含义是获取指定环境变量的值,创建java_home环境变量的作用,是由于安装elasticsearch需要引用java se开发包。

2.安装elasticsearch:
elasticsearch官网下载中心下载elasticsearch 2.4.4版本安装包,具体版本号在历史记录里面:(一)ElasticSearch-入门

(一)ElasticSearch-入门

 

将zip文件解压到c盘,进入 c:\elasticsearch-2.4.4\bin 目录,双击执行 elasticsearch.bat,该脚本文件执行elasticsearch安装程序,稍等片刻,打开浏览器,输入 http://localhost:9200,显示以下画面,说明es安装成功。

(一)ElasticSearch-入门

 

安装head插件:
为了便于管理es,本文使用head插件,这是最初级的管理工具,在浏览器中显示es集群,索引等信息,十分好用。
(1)在命令行中安装插件:
按住windows+r,输入cmd,打开命令行工具,进入到elasticsearch的bin目录,使用es命令安装插件。命令如下所示:
cd c:\elasticsearch-2.4.4\bin
plugin install mobz/elasticsearch-head
安装界面提示如下所示:

(一)ElasticSearch-入门

(2)通过网页管理elasticsearch:
在本地浏览器中输入http://localhost:9200/_plugin/head/,如果看到以下截图,说明head插件安装成功:(一)ElasticSearch-入门

(3)将elasticsearch 安装成windows服务(service)
方法一:
打开dos命令行界面,切换到elasticsearch的bin目录,执行service.bat install。
启动elasticsearch服务service.bat start。
在run界面,输入 services.msc,查看elasticsearch服务。
方法二:
百度搜索service_installer.exe类似这种安装winservice软件安装elasticsearch服务。

(一)ElasticSearch-入门

注:
在这里特声明一下,这个安装步骤,我是转载修改博主悦光阴(elasticsearch入门 第一篇:windows下安装elasticsearch)这篇文章而来的。如果同时想要了解集群配置问题的同学,可以转移悦光阴处学习(elasticsearch入门 第二篇:集群配置)相关配置知识。因为本人只是了解基础集群配置。后续学习深入了解之后再深聊这块知识点。

好了,到这里,整个生产环境就部署完成了。后面让我们来进行一个简单教程,它涵盖了一些基本的概念介绍,比如索引(indexing)、搜索(search)以及聚合(aggregations)。通过这个教程,我们可以让你对elasticsearch能做的事以及其易用程度有一个大致的感觉。

 

三.索引
1.首先我们根据一个简单的对比图来了解索引跟传统关系型数据库:
relationaldb->databases->tables->rows->columns
elasticsearch->indices->types->documents->fields

2.elasticsearch集群可以包含多个索引(indices)(数据库),每一个索引可以包含多个类型(types)(表),每一个类型包含多个文档(documents)(行),然后每个文档包含多个字段(fields)(列)。
elasticsearch里面的索引跟传统关系型数据库里面定义的索引是两种不同概念:
elasticsearch索引,就像是传统关系数据库中的数据库,它是相关文档存储的地方。索引一个文档表示把一个文档存储到索引(名词)里,以便它可以被检索或者查询。这很像sql中的insert关键字,差别是,如果文档已经存在,新的文档将覆盖旧的文档。
elasticsearch倒排索引,传统数据库为特定列增加一个索引,例如b-tree索引来加速检索。elasticsearch和lucene使用一种叫做倒排索引(inverted index)的数据结构来达到相同目的。

3.elasticsearch发出请求组成部分跟传统http请求是一样的:
(1)常用http动词有下面五个:get:获取服务器中的对象;post:增删改服务器中的对象;put:创建服务器中的对象;delete:删除服务器中的对象;head:仅仅用于获取对象的基础信息;
(2)query_string:像传递url参数一样去传递查询语句,例如
/deng/employee/_search?q=last_name:smith;
(3)默认端口:9200;
(4)body:一个json格式的请求主体;

4.好了,说那么多,现在我们根据一个生产环境的事例来更加清楚了解elasticsearch索引的如何应用:假设我们在一家名称为deng的公司工作,某天人力资源部门要求我们技术部门统计下公司新入职员工信息,方便了解员工信息。

录入新员工信息之前,我们先创建deng公司(索引),具体命令执行如下:
http:put deng

web界面:

 (一)ElasticSearch-入门

然后我们在数据浏览选项当中会看到创建对应索引:

 (一)ElasticSearch-入门

现在我们录入三个新员工信息,执行命令是:
http:put /deng/employee/1
body:

(一)ElasticSearch-入门
{
    "first_name": "john",
    "last_name": "smith",
    "age": 25,
    "about": "i love to go rock climbing",
    "interests": [
        "sports",
        "music"
    ]
}
view code

http:put /deng/employee/2
body:

(一)ElasticSearch-入门
{
    "first_name": "jane",
    "last_name": "smith",
    "age": 32,
    "about": "i like to collect rock albums",
    "interests": [
        "music"
    ]
}
view code

http:put /deng/employee/3
body:

(一)ElasticSearch-入门
{
    "first_name": "douglas",
    "last_name": "fir",
    "age": 35,
    "about": "i like to build cabinets",
    "interests": [
        "forestry"
    ]
}
view code

 web界面:

(一)ElasticSearch-入门

再回到数据浏览选项当中,我们是不是看到了刚刚录入新员工信息?

(一)ElasticSearch-入门

 

四.搜索
好了录入所有新员工信息之后,我们来检索deng公司(索引-数据库)所有新员工(类型-表)数据,一般检索方式有两种,一种是通过url传参方式获取员工数据(query_string),另外一种是在body里面传入json(dsl语句)查询:
(1)如果我们要检索某个新入职员工信息,可以根据标识定位找到该员工信息,例如id,或者人名:
query_string:
http:get /deng/employee/1
web界面:

(一)ElasticSearch-入门

 http:get /deng/employee/_search?q=last_name:fir (根据某个类型字段来定位该员工信息)
web界面:

(一)ElasticSearch-入门

dsl语句:
http:post /deng/employee/_search
body:

(一)ElasticSearch-入门
{
    "query": {
        "match": {
            "last_name": "fir"
        }
    }
}
view code

web界面:

(一)ElasticSearch-入门

 

(2)如果我们要检索名称为smith,且年龄大于30以上的新入职员工信息(过滤器filter):
dsl语句:
http:post /deng/employee/_search
body:

(一)ElasticSearch-入门
{
    "query": {
        "filtered": {
            "filter": {
                "range": {
                    "age": {
                        "gt": 30
                    }
                }
            },
            "query": {
                "match": {
                    "last_name": "smith"
                }
            }
        }
    }
}
view code

web界面:

(一)ElasticSearch-入门

(一)ElasticSearch-入门

 

(3)如果我们想要查看某个新入职员工信息,但是我们忘记了他叫什么名字了,隐约只记得他好像说过喜欢rock climbing,那么我们可以使用全文检索,把about字段里面跟rock或者 climbing相关的员工信息都检索出来再进行筛选(全文检索match):
dsl语句:
http:post /deng/employee/_search
body:

(一)ElasticSearch-入门
{
  "query": {
    "match": {
      "about": "rock climbing"
    }
  }
}
view code

web界面:

(一)ElasticSearch-入门

你们可以看到在使用了match关键字检索之后,会出现两个检索的结果,会按照结果相关性评分来排序,越接近搜索关键词的结果越靠前,评分也就就越高。

 

(4)同样道理,如果我们清楚记得某个入职员工说过他喜欢rock climbing,我们只想检索出跟about字段rock climbing关键词一致的新入职员工记录(短语检索match_phrase):
dsl语句:
http:post /deng/employee/_search
body:

(一)ElasticSearch-入门
{
  "query": {
    "match_phrase": {
      "about": "rock climbing"
    }
  }
}
view code

web界面:

(一)ElasticSearch-入门

 

(5)当我们想要在检索员工记录中高亮关键词(高亮highlight):
dsl语句:
http:post /deng/employee/_search
body:

(一)ElasticSearch-入门
{
  "query": {
    "match_phrase": {
      "about": "rock climbing"
    }
  },
  "highlight": {
    "fields": {
      "about": {}
    }
  }
}
view code

web界面:

(一)ElasticSearch-入门

在上面截图我们可以看到about字段检索出内容关键词rock climbing分别都加了<em></em>html标签,这是高亮标识。

 

五.聚合
(1)elasticsearch有一个功能叫做聚合(aggregations),它允许你在数据上生成复杂的分析统计。它跟我们在sql中group by很相似,但是比它更加强大。比如我们想要在新入职员工当中统计每个员工的爱好(聚合aggregations):
http:post /deng/employee/_search
body:

(一)ElasticSearch-入门
{
  "aggs": {
    "all_interests": {
      "terms": {
        "field": "interests"
      }
    }
  }
}
view code

web界面:

(一)ElasticSearch-入门

(一)ElasticSearch-入门

如上图可以看到,检索出来结果是喜欢music:2人,atrs:1人,forestry:1人,sports:1人。

(2)如果我们想知道所有叫smith员工的爱好分别是什么呢?请看下面例子:
http:post /deng/employee/_search
body:

(一)ElasticSearch-入门
{
    "query": {
        "match": {
            "last_name": "smith"
        }
    },
    "aggs": {
        "all_interests": {
            "terms": {
                "field": "interests"
            }
        }
    }
}
view code

web界面:

(一)ElasticSearch-入门

(一)ElasticSearch-入门

从上面检索结果,我们可以看出来所有叫smith的员工喜欢music:2人,sports:1人。

(3)聚合也允许分级汇总,例如我们要统计每个兴趣下员工平均年龄:
http:post /deng/employee/_search
body:

(一)ElasticSearch-入门
{
    "aggs": {
        "all_interests": {
            "terms": {
                "field": "interests"
            },
            "aggs": {
                "avg_age": {
                    "avg": {
                        "field": "age"
                    }
                }
            }
        }
    }
}
view code

web界面:

(一)ElasticSearch-入门

(一)ElasticSearch-入门

很明显这个检索结果让我们能得到更多详情员工信息,即使你不了解语法,但你也能通过大概感觉通过这个特性完成相当复杂聚合工作。

 

六.分布式的特性
elasticsearch致力于隐藏分布式系统的复杂性。以下这些操作都是在底层自动完成的:
(1)将你的文档分区到不同的容器或者分片(shards)中,它们可以存在于一个或多个节点中。
(2)将分片均匀的分配到各个节点,对索引和搜索做负载均衡。
(3)冗余每一个分片,防止硬件故障造成的数据丢失。
(4)将集群中任意一个节点上的请求路由到相应数据所在的节点。
(5)无论是增加节点,还是移除节点,分片都可以做到无缝的扩展和迁移。

 

通过上述案例,我相信大家对es有了一个很基础的了解,这篇文章只是介绍es入门,例如集群配置,索引管理,深入分片这些知识点,后续我们再来聊。

 

参考文档:
elasticsearch入门 第一篇:windows下安装elasticsearch