ES中有一些名词与非关系型数据库很类似,因为平常接触关系型数据库比较多,就来对比一下关系型数据库和ES的名词的含义:
ElasticSearch | 关系型数据库 |
---|---|
索引Index | 数据库database |
类型Type | 表table |
文档document | 行Row |
属性Field | 列column |
一个 Elasticsearch 集群可以 包含多个 索引 ,相应的每个索引可以包含多个 类型 。 这些不同的类型存储着多个 文档 ,每个文档又有 多个 属性 。
增加
PUT /retail/car/1
{
"uid": "X0Mtlfa5iB",
"spu_id": "127",
"surface_color": "#D7361C",
"surface_color_name": "熔岩橙",
"inner_color": "#000000",
"inner_color_name": "黑色",
"delete_mark": "0"
}
retail为elasticSearch中的一个索引,car为索引中的一个类型,1为插入的文档的id。插入的文档具体信息如请求体所示。
创建成功:
查询
GET retail/car/_search;
如果需要查询特定的字段(比如uid和surface_color_name)
GET new_retail/spu/1?_source=uid,surface_color_name;
如果只需要返回_source字段,不需要任何元数据:
GET new_retail/spu/1/_source;
返回插入的文档信息:
{
"_index": "retail",
"_type": "car",
"_id": "1",
"_version": 2,
"found": true,
"_source": {
"uid": "X0Mtlfa5iB",
"spu_id": "127",
"surface_color": "#D7361C",
"surface_color_name": "熔岩橙",
"inner_color": "#000000",
"inner_color_name": "黑色",
"delete_mark": "0"
}
}
ES Restful API GET、POST、PUT、DELETE、HEAD含义:
1)GET:获取请求对象的当前状态。
2)POST:改变对象的当前状态。
3)PUT:创建一个对象。
4)DELETE:销毁对象。
5)HEAD:请求获取对象的基础信息。
接下来,尝试查询外观颜色(surface_color_name)包含黑色的记录。
方法一:在请求路径中使用 _search
端点(后文解释),并将查询本身赋值给参数 q=。
GET retail/car/_search?q=uid:vHK2lW0NHq
方法二:使用match查询(查询方法之一,后文解释),使用请求体代替query-string参数。
GET retail/car/_search
{
"query":{
"match":{
"surface_color_name":"黑色"
}
}
}
(注意:使用head插件进行查询时,需要将方法改为POST,GET是不生效的)
再来看看稍微复杂一些的搜索:
在搜索外观颜色的基础上,查询spu_id小于130的记录。
GET retail/car/_search{
"query":{
"bool":{
"must":{
"match":{"surface_color_name":"黑色"}
},
"filter":{
"range":{"spu_id":{"lt":132}}
}
}
}
}
其中包括一个range过滤器,其中lt同HTML中的标签表示小于。
得到两个匹配值:
{
"took": 2,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 2,
"max_score": 0.68324494,
"hits": [
{
"_index": "retail",
"_type": "car",
"_id": "3",
"_score": 0.68324494,
"_source": {
"uid": "V6uKDzn3MA",
"spu_id": "132",
"surface_color": "#0000FF #000000",
"surface_color_name": "蓝色 黑色",
"inner_color": "#000000 #FFFFFF",
"inner_color_name": "黑色 白色",
"delete_mark": "0"
}
},
{
"_index": "retail",
"_type": "car",
"_id": "2",
"_score": 0.2876821,
"_source": {
"uid": "vHK2lW0NHq",
"spu_id": "131",
"surface_color": "#0000FF",
"surface_color_name": "蓝色",
"inner_color": "#000000",
"inner_color_name": "黑色",
"delete_mark": "0"
}
}]
}
}
其中"_score": 0.68324494 表示相关性得分,将会返回inner_color_name包含黑色、黑、色的所有记录,只是包含黑、色的记录相关性得分低于黑色记录。
(短语搜索:如果需要查找同时包含黑色短语的记录,需要使用match_phrase关键字代替match)
高亮搜索:
GET retail/car/_search{
"query": {
"match":{
"surface_color_name":"黑色"
}
},
"highlight":{
"fields":{
"surface_color_name":{}
}
}
}
返回值多了一条高亮,其中使用<em>标签封装匹配的文本字段:
"highlight": { "surface_color_name": [ "<em>黑</em><em>色</em> 蓝<em>色</em>" ] }
聚合(aggregations):
如下为一个简单的统计,统计surface_color_name中的个数。
GET retail/car/_search{
"aggs":{
"all_color":{
"terms":{"field":"surface_color_name"}
}
}
}