导入数据并搜索
前提条件
开通百度智能云Elasticsearch服务(参考创建集群)且可访问Elasticsearch集群(参考访问Elasticsearch服务)后,可以通过附赠的kibana节点访问Elasticsearch集群,然后可以创建索引、导入数据和搜索数据。
创建索引
在导入数据之前,可以评估shard和创建索引,以下示例创建一个名称为index_name的索引。
PUT index_name
{
"settings": {
"index": {
"number_of_shards": 1,
"number_of_replicas": 1
}
}
}
其中,number_of_shards指主分片数,number_of_replicas指每个主分片有多少个副本分片数。Elasticsearch 7.0以下版本默认创建5个主分片和1个副本分片,Elasticsearch 7.0及以上版本默认创建1个主分片和1个副本分片。主分片数只能在索引创建前指定,且索引创建后不能动态修改,只能通过reindex或split等方式达到修改目的,副本分片数可以动态修改。
创建成功,返回如下结果。
{
"acknowledged" : true,
"shards_acknowledged" : true,
"index" : "index_name"
}
返回结果各个字段的含义如下所示。
返回字段 | 含义 |
---|---|
acknowledged | 索引在集群中是否创建成功 |
shards_acknowledged | 每个分片组在超时之前是否激活了所需数量的分片 |
index | 索引名称 |
注:返回值中acknowledged或者shards_acknowledged为false时,索引创建操作仍然可能成功,这两个值只是表示操作是否在超时之前完成。假设acknowledged为false,新创建的索引更新集群状态时超时,创建索引操作仍然可能会在之后执行成功。假设shards_acknowledged为false,新创建的索引成功更新集群状态,但激活所需数量的分片超时,默认只启动主分片。
导入数据
导入单条数据
以下示例创建单个文档并导入数据。
PUT index_name/_doc/1
{
"name": "Amber Adams",
"age": 32
}
导入数据成功,返回如下结果。
{
"_index" : "index_name",
"_type" : "_doc",
"_id" : "1",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 0,
"_primary_term" : 1
}
返回结果各个字段的含义如下所示。
返回字段 | 含义 |
---|---|
index | 索引名称 |
_type | 文档类型 |
_id | 文档唯一标识符 |
_version | 文档版本,每次更新文档,版本都会增加 |
result | 操作结果 |
_shards | 被操作的分片总数量、成功数量、失败数量 |
_seq_no | 文档序列号,序列号用于确保旧版本文档不会覆盖新版本 |
_primary_term | 主项 |
可以使用如下命令查询数据来进行验证。
GET index_name/_search
{
"query": { "match_all": {} }
}
导入多条数据
以下示例使用_bulk API创建多个文档并导入数据。
POST _bulk
{"index":{"_index": "index_name", "_id": 2}}
{"name": "Fulton Rich","age": 40}
{"index":{"_index": "index_name", "_id": 3}}
{"name": "Virginia Ayala", "age": 12}
{"index":{"_index": "index_name", "_id": 4}}
{"name": "Mcgee Mooney", "age": 23}
{"index":{"_index": "index_name", "_id": 5}}
{"name": "Burton Meyers", "age": 60}
可以使用如下命令查询插入的数据来进行验证。
GET index_name/_search
{
"query": { "match_all": {} }
}
搜索数据
向集群导入数据之后,可以进行数据搜索,比如查询索引、全文搜索、按条件搜索等。
查询索引
如下命令查询集群的所有索引。
GET _cat/indices?v
查询结果如下所示。
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
green open index_name GKL71ejiT0CyqJZgVgkMjA 3 1 5 0 11.2kb 11.2kb
查询结果各个字段的含义如下所示。
返回字段 | 含义 |
---|---|
health | 索引健康状态 |
status | 索引的开启状态 |
index | 索引名称 |
uuid | 索引uuid |
pri | 索引主分片数 |
rep | 索引副本分片数量 |
docs.count | 索引中文档总数 |
docs.deleted | 索引中删除状态的文档 |
store.size | 主分片+副本分片的大小 |
pri.store.size | 主分片的大小 |
全文搜索
如下命令搜索name包含Ayala的文档数据。
GET index_name/_search
{
"query": {
"match": {
"name": "Ayala"
}
}
}
搜索结果如下所示。
{
"took" : 10,
"timed_out" : false,
"_shards" : {
"total" : 3,
"successful" : 3,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 0.9808292,
"hits" : [
{
"_index" : "index_name",
"_type" : "_doc",
"_id" : "3",
"_score" : 0.9808292,
"_source" : {
"name" : "Virginia Ayala",
"age" : 12
}
}
]
}
}
搜索结果各个字段的含义如下所示。
返回字段 | 含义 |
---|---|
took | 执行搜索耗时,单位为毫秒 |
time_out | 搜索是否超时 |
_shards | 多少分片被搜索,成功多少,跳过多少,失败多少 |
hits | 搜索结果展示 |
hits.total | 匹配条件的文档总数 |
hits.max_score | 最大匹配得分 |
hits._score | 返回文档的匹配得分(得分越高,匹配程度越高,越靠前) |
hits.hits | 返回结果展示 |
按条件搜索
如下命令搜索age在20-30岁之间(闭区间)的文档数据。
GET index_name/_search
{
"query": {
"range": {
"age": {
"gte": 20,
"lte": 30
}
}
}
}
搜索结果如下所示。
{
"took" : 18,
"timed_out" : false,
"_shards" : {
"total" : 3,
"successful" : 3,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "index_name",
"_type" : "_doc",
"_id" : "4",
"_score" : 1.0,
"_source" : {
"name" : "Mcgee Mooney",
"age" : 23
}
}
]
}
}
搜索结果各个字段的含义同上。