Elasticsearch系列(二)----Elasticsearch 基本使用

258 阅读6分钟
原文链接: blog.csdn.net
一、Restful API


Elasticsearch提供了Restful API,使用json格式,这使得它非常利于与外部交互,Restful的接口很简单,一个url表示一个特定的资源,譬如/blog/article/1,就表示一个index为blog,type为aritcle,id为1的document。

而我们使用http标准method来操作这些资源,POST新增,PUT更新,GET获取,DELETE删除,HEAD判断是否存在。

RESTful接口URL的格式是

[html] view plain copy print?
  1. curl -X<VERB> '<PROTOCOL >://<HOST>/<PATH>? <QUERY_STRING>' -d '<BODY>'  
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格式的请求主体(如果请求需要的话)


二、基础操作


index:写 document 到 Elasticsearch 中,如果不存在,就创建,如果存在,就用新的取代旧的。
create:写 document 到 Elasticsearch 中,与 index 不同的是,如果存在,就抛出异常DocumentAlreadyExistException。
get:根据ID取出document。
update:如果是更新整个 document,可用index 操作。如果是部分更新,用update操作。在Elasticsearch中,更新document时,是把旧数据取出来,然后改写要更新的部分,删除旧document,创建新document,而不是在原document上做修改。

delete:删除document。Elasticsearch 会标记删除document,然后,在Lucene 底层进行merge时,会删除标记删除的document。


三、Filter 与 Query


Elasticsearch 使用 domain-specific language(DSL)进行查询,DSL 使用 JSON 进行表示。

DSL 由一些子查询组成,这些子查询可应用于两类查询,分别是filter 和 query。

filter 正如其字面意思“过滤”所说的,是起过滤的作用,任何一个document 对 filter 来说,就是match 与否的问题,是个二值问题,0和1,没有scoring的过程。

使用query的时候,是表示match 程度问题,有scroing 过程。

另外,Filter 和 Query 还有性能上的差异,Elasticsearch 底层对Filter做了很多优化,会对过滤结果进行缓存;同时,Filter 没有相关性计算过程,所以,Filter 比 Query 快。

所以,官网推荐,作为一条比较通用的规则,仅在全文检索时使用Query,其它时候都用Filter。但是,根据我们的使用情况来看,在过滤条件不是很强的情况下,缓存可能会占用较多内存,如果这些数据不是频繁使用,用空间换时间不一定划算。


四、API 惯例、规则 


1、大多数API都支持index参数,它的值可以是test1,test2,test3 这种形式,也可以使用通配符test*,*test,te*st等,如果是_all那就是作用于所有index,也支持使用+\-号(+test*,-test3),当然,一些作用对象是单个索引的API就不支持这个特性了。


2、Date  math  support in index name  (索引名称的日期数学运算)


       格式:<static_name{date_math_expr{date_format|time_zone}}>  


所有表达式必须是经过URIEncode编码的。 GET   /<logstash-{now/d}>/_search  请求必须写成  GET /%3Clogstash-%7Bnow%2Fd%7D%3E/_search。


       假如当前日期是2020年5月20日中午12:30  ,Date  math表达式为<logstash-{now/d}>,那当前日期将被解析为:logstash-2024.03.22。


以下是官网给出的例子:
       <logstash-{now/d}>                logstash-2024.03.22
       <logstash-{now/M}>                logstash-2024.03.01  
       <logstash-{now/M{YYYY.MM}}>       logstash-2024.03  
       <logstash-{now/M-1M{YYYY.MM}}>    logstash-2024.02  
       <logstash-{now/d{YYYY.MM.dd|+12:00}}>   logstash-2024.03.23   


注意最后一个的写法:+12h  加上12小时 


3、 通用的可选参数 


1)pretty=true/false 返回结果数据是否以漂亮的格式展示
2)human=true/false  返回结果数据是否以人类易读形式显示
3)Date  math 操作   +1h  +1M(月份)  +1m(分钟) +1y 等等
4)返回结果过滤  GET /_search?q=elasticsearch&filter_path=took,hits.hits._id,hits.hits._score ,返回的格式如下:


[html] view plain copy print?
  1. {  
  2.     "took": 3,  
  3.     "hits": {  
  4.         "hits": [  
  5.             {  
  6.                 "_id": "0",  
  7.                 "_score": 1.6375021  
  8.             }  
  9.         ]  
  10.     }  
  11. }  
{
    "took": 3,
    "hits": {
        "hits": [
            {
                "_id": "0",
                "_score": 1.6375021
            }
        ]
    }
}

5)flat_settings  是否以扁平方式显示 =true 和 =false的返回结果分别是:


[html] view plain copy print?
  1. true->{  
  2.     "twitter": {  
  3.         "settings": {  
  4.             "index.number_of_replicas": "1",  
  5.             "index.number_of_shards": "1",  
  6.             "index.creation_date": "1474389951325",  
  7.             "index.uuid": "n6gzFZTgS664GUfx0Xrpjw",  
  8.             "index.version.created": ...,  
  9.             "index.provided_name": "twitter"  
  10.         }  
  11.     }  
  12. }  
true->{
    "twitter": {
        "settings": {
            "index.number_of_replicas": "1",
            "index.number_of_shards": "1",
            "index.creation_date": "1474389951325",
            "index.uuid": "n6gzFZTgS664GUfx0Xrpjw",
            "index.version.created": ...,
            "index.provided_name": "twitter"
        }
    }
}

[html] view plain copy print?
  1. false->{  
  2.     "twitter": {  
  3.         "settings": {  
  4.             "index": {  
  5.                 "number_of_replicas": "1",  
  6.                 "number_of_shards": "1",  
  7.                 "creation_date": "1474389951325",  
  8.                 "uuid": "n6gzFZTgS664GUfx0Xrpjw",  
  9.                 "version": {  
  10.                     "created": ...  
  11.                 },  
  12.                 "provided_name": "twitter"  
  13.             }  
  14.         }  
  15.     }  
  16. }  
false->{
    "twitter": {
        "settings": {
            "index": {
                "number_of_replicas": "1",
                "number_of_shards": "1",
                "creation_date": "1474389951325",
                "uuid": "n6gzFZTgS664GUfx0Xrpjw",
                "version": {
                    "created": ...
                },
                "provided_name": "twitter"
            }
        }
    }
}

6) 还有一些其他的error_trace等可选参数


4、基于URL的访问控制  URL-based  access control