全文搜索引擎Elasticsearch初探

时间:2021-08-15 17:31:53

前言:

   在Web应用或后台数据管理中,随着数据量的倍数增长,搜索引擎特别是全文搜索引擎的应用越来越迫切。基于技术和成本考虑,我们不可能去开发一个搜索引擎以满足我们的需求,庆幸的是业界已有许多优秀的开源搜索引擎可供我们使用,Elasticsearch便是其中之一。

简介:

    Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎。无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。但是,Lucene只是一个库。想要使用它,你必须使用Java来作为开发语言并将其直接集成到你的应用中,更糟糕的是,Lucene非常复杂,你需要深入了解检索的相关知识来理解它是如何工作的。

    Elasticsearch也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。

    不过,Elasticsearch不仅仅是Lucene和全文搜索,我们还能这样去描述它:

  •     分布式的实时文件存储,每个字段都被索引并可被搜索

  •     分布式的实时分析搜索引擎

  •     可以扩展到上百台服务器,处理PB级结构化或非结构化数据

    而且,所有的这些功能被集成到一个服务里面,你的应用可以通过简单的RESTful API、各种语言的客户端甚至命令行与之交互。

    上手Elasticsearch非常容易。它提供了许多合理的缺省值,并对初学者隐藏了复杂的搜索引擎理论。它开箱即用(安装即可使用),只需很少的学习既可在生产环境中使用。

    Elasticsearch在Apache 2 license下许可使用,可以免费下载、使用和修改。

    随着你对Elasticsearch的理解加深,你可以根据不同的问题领域定制Elasticsearch的高级特性,这一切都是可配置的,并且配置非常灵活。

接口:

    根据是否使用JAVA,Elasticsearch提供两套API接口:JAVA API和RESTful API。

    对于JAVA API,Elasticsearch提供了两种内置客户端:

  • 节点客户端(node client):节点客户端以无数据节点(none data node)身份加入集群,换言之,它自己不存储任何数据,但是它知道数据在集群中的具体位置,并且能够直接转发请求到对应的节点上。

  • 传输客户端(Transport client):这个更轻量的传输客户端能够发送请求到远程集群。它自己不加入集群,只是简单转发请求给集群中的节点。


    两个Java客户端都通过9300端口与集***互,使用Elasticsearch传输协议(Elasticsearch Transport Protocol)。集群中的节点之间也通过9300端口进行通信。如果此端口未开放,你的节点将不能组成集群。

    注意:Java客户端所在的Elasticsearch版本必须与集群中其他节点一致,否则,它们可能互相无法识别。

    RESTful API是基于HTTP协议,以JSON为数据交互格式,可供其他程序语言使用,通过9200端口与Elasticsearch进行通信,你可以使用你喜欢的WEB客户端,甚至可以通过curl命令与Elasticsearch通信。

Restful API基本用法:

    向Elasticsearch发出的请求的组成部分与其它普通的HTTP请求是一样的:

    curl -X<VERB> '<PROTOCOL>://<HOST>/<PATH>?<QUERY_STRING>' -d '<BODY>'

其中:

    VERB HTTP方法:GET, POST, PUT, HEAD, DELETE

    PROTOCOL http或者https协议(只有在Elasticsearch前面有https代理的时候可用)

    HOST Elasticsearch集群中的任何一个节点的主机名,如果是在本地的节点,那么就叫localhost

    PORT Elasticsearch HTTP服务所在的端口,默认为9200

    QUERY_STRING 一些可选的查询请求参数,例如?pretty参数将使请求返回更加美观易读的JSON数据

    BODY 一个JSON格式的请求主体(如果请求需要的话)

    例如:curl -XGET 'http://192.168.0.16:9200/_count?pretty' -d '{"query": {"match_all": {}}}'

索引与文档的概念:

    在Elasticsearch中,文档归属于一种类型(type),而这些类型存在于索引(index)中,我们可以画一些简单的对比图来类比传统关系型数据库:

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

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

    Elasticsearch集群可以包含多个索引(indices)(数据库),每一个索引可以包含多个类型(types)(表),每一个类型包含多个文档(documents)(行),然后每个文档包含多个字段(Fields)(列)。

搜索:

    搜索可以使用URL传参的形式,也可以使用DSL以JSON请求体的形式。

URL传参:GET /index/type/_search?q=field:value

                 GET /index/type/id?_source=title,text

DSL(Domain Specific Language特定领域语言):

    GET /index/type/_search

    {

        "query" : {

            "match" : {

                field : value

            }

        }

    }


参考资料:

Elasticsearch 权威指南(中文版):http://es.xiaoleilu.com/

本文出自 “知止后定” 博客,请务必保留此出处http://xiaoliulaoding.blog.51cto.com/10306359/1713927