zoukankan      html  css  js  c++  java
  • Elasticsearch之基本操作

    elasticsearch是一个是开源的(Apache2协议),分布式的,RESTful的,构建在Apache Lucene之上的的搜索引擎

    它有很多特点例如Schema Free,Document Oriented。它是#nosql的,基于JSON,同时支持多种API,包括HTTP, thrift, memcached。支持HTTP,是比较爽的一点,因为基本上所有的应用都可以用ES了,页面上的js脚本都可以去查询。

    安装

    启动和安装特别简单,在ES下载页面下载zip或者tar包后,解压,然后到elasticsearch的目录下,运行下面的命令就可以了。

    bin/elasticsearch -f

    搭建集群也非常简单,在同网段的机器上,启动es后,它们会自动组建成一个集群,并完成数据的分布式存储,查询时也会按照分布式的方式去查找。

    好了恭喜你,现在你已经可以搭建ES单机版和ES集群了,一切都这么简单。

    下面我们就来看一下ES的HTTP的API的插入、删除、更新、查找、搜索的功能吧,(ES安装在ubuntu server 64位 12.04LTS)。

    插入

    先来一个简单的官方例子,插入的参数为-XPUT,插入一条记录。

    $ curl -XPUT 'http://localhost:9200/twitter/tweet/1' -d '{
        "user" : "kimchy",
        "post_date" : "2009-11-15T14:12:12",
        "message" : "trying out Elastic Search"
    }'
    

    执行结果如下图所示,绿色框内的内容是ES返回的执行结果:

    andrew@ubuntu:~$ curl -XPUT 'http://localhost:9200/twitter/tweet/1' -d '{
    >     "user" : "kimchy",
    >     "post_date" : "2009-11-15T14:12:12",
    >     "message" : "trying out Elastic Search"
    > }'
    {"ok":true,"_index":"twitter","_type":"tweet","_id":"1","_version":6}andrew@ubuntu:~$

    从上面的这个例子中,可以看出ES的http的服务的默认端口9200,后面的/twitter/tweet/1是这条记录的索引部分。

    这也就体现了它的RESTful风格,所有的记录都是通过URI确定。这三级目录分布对应了_index_type_id(绿框内可以看出来)。实际上ES上存放的所有的记录都只能通过三级目录的方式找到,不能多也不能少。

    _id字段可以是数字也可以是字符串。在执行上面的命令时ES会自动创建这些索引。-d后面跟上了要插入的json格式的记录。

    -XPUT表明这是插入一条数据,ES中叫创建一个索引。ES返回的结果中,一个_version字段,表明了当前记录的版本号,当你想这个索引重新put一条记录时,版本号会自动加一。

    删除

    删除的http请求参数为-XDELETE,通过下面的命令可以删除这条记录:

    curl -XDELETE 'http://localhost:9200/twitter/tweet/1'
    

    删除这条记录的时候,_verison也会自动加一的。

    查询

    创建了一个索引后,可以通过下面的方式查询(参数-XGET)出来:

    curl -XGET 'http://localhost:9200/twitter/tweet/1'
    

    执行上面的查询命令,可以等到下面的结果:

    andrew@ubuntu:~$ curl -XGET 'http://localhost:9200/twitter/tweet/1'
    {"_index":"twitter","_type":"tweet","_id":"1","_version":5,"exists":true, "_source" : {
        "user" : "kimchy",
        "post_date" : "2009-11-15T14:12:12",
        "message" : "trying out Elastic Search"
    }}andrew@ubuntu:~$ 
    

    exists表示是否有查询结果,_source字段是查询到的记录。

    查询的时候,可以将_type设置成为_all,ES就会返回在_index下所有type中,第一个匹配_id的记录。

    还可以通过参数对返回结果继续控制,例如:用fields选取返回的字段,用pretty控制返回的json格式是否更阅读友好。format=yaml可以设置输入格式为YAML。 下面是两个例子

    curl -XGET 'http://localhost:9200/twitter/tweet/1?fields=message,user&pretty=true'
    curl -XGET 'http://localhost:9200/twitter/tweet/1?fields=message,user&format=yaml'

    当然ES还支持一次查询多组记录,即multi get,在URI中是使用关键字_mget,具体可以参考ES的文档multi get

    更新

    ES同样支持更新,但是更新的方式是通过一个提供的脚本进行的。ES的做法是,通过index找到相应的存放记录的节点,然后执行脚本,执行完之后,返回新的索引。实际上执行的是一个get和reindex的过程,在这个过程中,通过versioning来控制没有其它的更新操作(这个功能是0.19后可用的)。具体实现的原理应该和elasticsearch Versioning相关。

    get,reindex的含义是,ES先取出这条记录,然后根据新数据生成新记录,然后在把新记录放回到ES中(并不会覆盖老的记录)。

    首先创建一条记录

    $ curl -XPUT localhost:9200/test/type1/1 -d '{
        "counter" : 1,
        "tags" : ["red"]
    }'
    

    将counter的值加4

    $ curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{
        "script" : "ctx._source.counter += count",
        "params" : {
            "count" : 4
        }
    }'
    

    也可以添加一个tag的值

    $ curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{
        "script" : "ctx._source.tags += tag",
        "params" : {
            "tag" : "blue"
        }
    }'
    

    现在还支持upsert功能,即在更新的时候,如果记录没有这个key,则插入这个key,下面是一个例子,如果没有counter字段,则插入该字段:

    $ curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{
        "script" : "ctx._source.counter += count",
        "params" : {
            "count" : 4
        },
        "upsert" : {
            "counter" : 1
        }
    }'
    

    关于update还有其它很多功能,可以参考ES的API update

    搜索

    elasticsearch的名字里面有一个search,那么主要功能也是search了。

    es的search有两种形式,一是通过URI,二是通过Requst Body。通过URI查询,即将查询的语句放入到请求的url中,例如:

    curl -XGET 'http://localhost:9200/twitter/tweet/_search?q=user:kimchy'
    

    第二种方式,即在查询的请求中加入一个doc

    $ curl -XGET 'http://localhost:9200/twitter/tweet/_search' -d '{
        "query" : {
            "term" : { "user" : "kimchy" }
        }
    }'
    

    query body的定义可以查看query DSL 另外两种查询方式都可以带参数,参数的含义参考URI RequestRequest Body

    ES的搜索功能是可以跨index和type的,例如下面这几条命令

    curl -XGET 'http://localhost:9200/twitter/_search?q=user:kimchy'
    curl -XGET 'http://localhost:9200/twitter/tweet,user/_search?q=user:kimchy'
    curl -XGET 'http://localhost:9200/kimchy,elasticsearch/tweet/_search?q=tag:wow'
    curl -XGET 'http://localhost:9200/_all/tweet/\_search?q=tag:wow'
    curl -XGET 'http://localhost:9200/\_search?q=tag:wow'

    第一条是在所有的twitter这个index下的所有type中查找,第二条是在tweet,user这两个type中查找,第三条是在kimchy,elasticsearch这两个index的tweet这个type中查找,第四条使用了_all关键字,是在所有的index的tweet的type中查找,第五条更暴力,在所有的index和type中查找。

    查找还有其它的很多选项,sort高亮,选取返回记录的域Fields,还可以对返回的域使用一个脚本进行计算script Fields,或者对返回结果继续统计Facets,Facets的内容比较多,它支持关键词统计,范围内统计,直方图式统计,日期的直方图式统计,过滤,查询,还有记录地理位置距离的统计geo distance。 支持名字过滤Named Filters。 定义搜索类型Search Type 。例如什么Query And Fetch,Query Then Fetch。 索引加速的功能Index Boost,可以让某一个索引的权重大于另外一个。 保持上次检索的环境了结果Scroll。保留每一个命中的score值Explain。 设置命中的min_score。保留版本号Version

    Search的参数很多,我也没有一一看,不过果然是名字里面有个search,对检索的各种场景都有支持。

    当然还支持多个查询multi search,例如下面这个例子

    $ cat requests
    {"index" : "test"}
    {"query" : {"match_all" : {}}, "from" : 0, "size" : 10}
    {"index" : "test", "search_type" : "count"}
    {"query" : {"match_all" : {}}}
    {}
    {"query" : {"match_all" : {}}}
    
    $ curl -XGET localhost:9200/_msearch --data-binary @requests; echo
    

    小结

    以上就是elasticsearch的基本的几个功能了。当然它还有其它的很多功能,大家可以上http://www.elasticsearch.org去查看。

    ES是基于Lucene的,有很多概念是直接来自于它,所有要想深入学习ES,还得有点Lucene的基础。

    总的,感觉elasticsearch是一个比较强大的工具,而且对社交网络的支持比较好,而且使用方便,配置简单,就不知道稳定性如何了。

    下面是两篇不错的文章,大家也可以借鉴一下:

    还有elasticsearch的中文站点http://www.elasticsearch.cn/,不过这个网站还在构建中,翻译工作也才刚刚开始,大家就期盼早点完成。

  • 相关阅读:
    Spring MVC 核心组件详解
    Spring MVC 入门就这一篇
    Spring 事务解决方案
    【UGUI源码分析】Unity遮罩之Mask详细解读
    游戏开发中不同时区下的时间问题
    ARTS第十三周(阅读Tomcat源码)
    Win10 电脑安装.NET低版本提示“这台计算机中已经安装了 .NET Framwork 4.6.2或版本更高的更新”问题
    Dynamics 365 Setup 提示SqlServer 存在
    Dynamics CRM "Verification of prerequisites for Domain Controller promotion failed. Certificate Server is installed."
    Dynamics CRM
  • 原文地址:https://www.cnblogs.com/wdpnodecodes/p/7407222.html
Copyright © 2011-2022 走看看