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

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

程序员文章站 2022-07-05 08:04:48
...
一、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的格式是

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 ,返回的格式如下:


{
    "took": 3,
    "hits": {
        "hits": [
            {
                "_id": "0",
                "_score": 1.6375021
            }
        ]
    }
}

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


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"
        }
    }
}

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