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

来源:互联网 发布:b2c商城网站源码下载 编辑:程序博客网 时间:2024/06/06 15:01
一、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