ES 基本使用
ES 通过 RESTful API 进行操作,它的数据格式的 JSON 格式,它的语法如下:
通过 Postman 来使用
通过地址栏对资源进行定位
选择“body——raw——json”,就可以对数据进行编写
通过 Kibana 使用
通过使用 Kibana 的 Dev Tools 工具,可以很方便地对 ES 进行 Restful 的操作,例如:
# 插入一个文档
PUT index/type/1
{
"body": "here"
}
复制代码
查询
ES 查询分为:
简单查询
{
"_index" : "customer",
"_type" : "_doc",
"_id" : "1",
"_version" : 1,
"_seq_no" : 26,
"_primary_term" : 4,
"found" : true,
"_source" : {
"name": "John Doe"
}
}
复制代码
条件查询
查询全部
GET book/_search
{
"query": {
"match_all": {}
},
"sort": [
{ "account_number": "asc" }
]
}
复制代码
query
:是查询的关键字
match_all
:代表返回所有相匹配的文档
sort
:代表排序
{
"took" : 63,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value": 1000,
"relation": "eq"
},
"max_score" : null,
"hits" : [ {
"_index" : "bank",
"_type" : "_doc",
"_id" : "0",
"sort": [0],
"_score" : null,
"_source" : {"account_number":0,"balance":16623,"firstname":"Bradshaw","lastname":"Mckenzie","age":29,"gender":"F","address":"244 Columbus Place","employer":"Euron","email":"bradshawmckenzie@euron.com","city":"Hobucken","state":"CO"}
}, {
"_index" : "bank",
"_type" : "_doc",
"_id" : "1",
"sort": [1],
"_score" : null,
"_source" : {"account_number":1,"balance":39225,"firstname":"Amber","lastname":"Duke","age":32,"gender":"M","address":"880 Holmes Lane","employer":"Pyrami","email":"amberduke@pyrami.com","city":"Brogan","state":"IL"}
}, ...
]
}
}
复制代码
"took"
:表示查询花费的毫秒数
timed_out
– 是否请求超时
_shards
– 搜索了多少个分片,其中成功,失败或跳过了多少个分片。
max_score
– 被找到最相关的文档的分数
hits.total.value
- 找到匹配文档的总数
hits.sort
- the document’s sort position (when not sorting by relevance score)
hits._score
- the document’s relevance score (not applicable when using match_all
)
"hits"
:代表响应的结果,默认情况下,返回 10 条满足条件的结果。
添加查询条件
GET book/_search
{
"query": {
"match": {
"title":"Elasticsearch"
}
}
}
复制代码
该请求会查询 title
字段中包含 Elasticsearch
的文档。
如果想要搜索 title = Elasticsearch
的文档,可以把 match
换成 match_phrase
。
指定返回字段
通过设置 _source
的值,可以指定返回的哪些 field。
比如这个例子,就指定返回"firstname", "balance" , “lastname”这三个字段:
GET book/_search
{
"query": {
"match_all": {}
},
"_source": [
"firstname", "balance" , "lastname"
]
}
复制代码
{
"took" : 63,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value": 1000,
"relation": "eq"
},
"max_score" : null,
"hits" : [ {
"_index" : "bank",
"_type" : "_doc",
"_id" : "0",
"sort": [0],
"_score" : null,
"_source" : {
"balance":16623,
"firstname":"Bradshaw",
"lastname":"Mckenzie"
}
}, {
"_index" : "bank",
"_type" : "_doc",
"_id" : "1",
"sort": [1],
"_score" : null,
"_source" : {
"balance":39225,
"firstname":"Amber",
"lastname":"Duke"
}
}, ...
]
}
}
复制代码
分页查询
每个搜索请求都是独立的:Elasticsearch 不会在请求中维护任何状态信息。要对搜索结果进行分页,就需要在请求中指定 from 和 size 参数。
比如请求第 10 到 19 的文档。
GET /bank/_search
{
"query": { "match_all": {} },
"sort": [
{ "account_number": "asc" }
],
"from": 10,
"size": 10
}
复制代码
复杂查询
如果需要使用复杂查询,就需要在请求中使用 bool
字段来组合多个查询条件,查询条件中包括了三种条件:
GET /bank/_search
{
"query": {
"bool": {
"must": [
{ "match": { "title": "quick" }}
],
"must_not": [
{ "match": { "title": "lazy" }}
],
"should": [
{ "match": { "title": "brown" }},
{ "match": { "title": "dog" }}
]
}
}
}
复制代码
以上的查询结果返回 title
字段包含词项 quick
但不包含 lazy
的任意文档。区别就在于两个 should
语句,也就是说:一个文档不必包含 brown
或 dog
这两个词项,但如果一旦包含,我们就认为它们 更相关 :
{
"hits": [
{
"_id": "3",
"_score": 0.70134366,
"_source": {
"title": "The quick brown fox jumps over the quick dog"
}
},
{
"_id": "1",
"_score": 0.3312608,
"_source": {
"title": "The quick brown fox"
}
}
]
}
复制代码
文档 3 会比文档 1 有更高 _score
是因为它同时包含 brown
和 dog
。默认情况下,Elasticsearch 返回的结果按这些相关性分数排序。
也可以直接使用 filter
来进行条件过滤,举个例子,以下请求使用范围过滤器将结果限制为余额在 20,000 美元到 30,000 美元(包括 30000 美元)之间的帐户。
GET /bank/_search
{
"query": {
"bool": {
"must": { "match_all": {} },
"filter": {
"range": {
"balance": {
"gte": 20000,
"lte": 30000
}
}
}
}
}
}
复制代码
Term Query-精确查询
term
用于精确查询,使用 term
时,ES 会返回与指定字段的值完全匹配的结果。因此,通常使用 Term Query 来查找具有精确的值(例如价格,产品 ID 或用户名)的文档。
注意:避免对 text 类型的字段使用term
query
By default, Elasticsearch changes the values of text
fields as part of analysis. This can make finding exact matches for text
field values difficult.
如果需要搜索 text
字段的值, 使用 match 来进行查找会更好。
索引创建
索引相当于数据库中的库,创建索引时,可以指定索引的分片和备份,以及创建结构化的索引如:
{
"settings":{
"number_of_shards": 3,
"number_of_replicas": 1
},
"mappings":{
"man":{
"properties":{
"name":{
"type":"text"
},
"country":{
"type":"keyword"
},
"age":{
"type":"integer"
},
"date":{
"type":"date",
"format":"yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
}
}
}
}
}
复制代码
成功后,就会返回以下数据:
{
"acknowledged": true,
"shards_acknowledged": true,
"index": "people"
}
复制代码
插入
插入分为两种:
下面说明两种插入的使用方法:
指定文档 id 插入
使用 PUT 方法来插入数据,即可自行指定 id。
requests
PUT /customer/_doc/1
{
"name": "John Doe"
}
复制代码
Response
{
"_index" : "customer",
"_type" : "_doc",
"_id" : "1",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 2,
"failed" : 0
},
"_seq_no" : 26,
"_primary_term" : 4
}
复制代码
可以看到 "_id": "1"
指定的文档 id 为 1。
自动产生文档 id 插入
使用 post 方法插入,则会自动指定 id
requests
POST /people/man
{
"name":"insight",
"age":23,
"country":"China",
"date":"1996-12-01"
}
复制代码
response
{
"_index": "people",
"_type": "man",
"_id": "Fw25E2gB3PQKZKHhk0Lj",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 0,
"_primary_term": 1
}
复制代码
_id
为随机生成的一串字符串。
批量插入
如果有大量的数据需要插入,可以使用 bulk API 进行批量插入。在单个 API 调用中执行多个插入或删除操作。这样可以减少网络开销,并可以大大提高插入速度。
POST /_bulk
POST /<target>/_bulk
{ "index":{"_index":"twitter", "_type":"doc" }}
{"word_count" : 1000,"author" : "李四","title" :"Elasticsearch大法好","public_date" : "2010-10-01"}
{ "index":{"_index":"twitter", "_type":"doc" }}
{"word_count" : 2000,"author" : "李三","title" : "Java入门","public_date" : "2010-10-01"}
复制代码
- 第一个{}
:指定插入的索引(表)和插入数据的类型
- 第二个{}
:是数据本身
最佳批处理大小取决于许多因素:文档大小和复杂性,索引编制和搜索负载以及群集可用的资源。比较推荐的配置是:批处理 1,000 至 5,000 个文档,总有效负载在 5MB 至 15MB 之间。
修改
修改分为两种:
直接修改文档
request
POST /people/man/1/_update
{
"doc":{
"name":"我是谁"
}
}
复制代码
response
{
"_index" : "people",
"_type" : "man",
"_id" : "1",
"_version" : 3,
"result" : "updated",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 2,
"_primary_term" : 3
}
复制代码
删除
删除文档
request
response
{
"_index" : "people",
"_type" : "man",
"_id" : "1",
"_version" : 4,
"result" : "deleted",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 3,
"_primary_term" : 3
}
复制代码
删除索引
request
response
评论