您的位置:首页 > 其它

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

2017-08-13 00:08 357 查看
一、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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐