Elasticsearch也是基于Lucene的全文检索库,本质也是存储数据,很多概念与MySQL类似的。
对比关系:
索引(indices)--------------------------------Databases 数据库
类型(type)-----------------------------Table 数据表
文档(Document)----------------Row 行
字段(Field)-------------------Columns 列
Elasticsearch具备以下特点:
- 分布式,无需人工搭建集群(solr就需要人为配置,使用Zookeeper作为注册中心)
- Restful风格,一切API都遵循Rest原则,容易上手
- 近实时搜索,数据更新在Elasticsearch中几乎是完全同步的。
另外,在SolrCloud中,有一些集群相关的概念,在Elasticsearch也有类似的:
- 索引集(Indices,index的复数):逻辑上的完整索引
- 分片(shard):数据拆分后的各个部分
- 副本(replica):每个分片的复制
要注意的是:Elasticsearch本身就是分布式的,因此即便你只有一个节点,Elasticsearch默认也会对你的数据进行分片和副本操作,当你向集群添加新数据时,数据也会在新加入的节点中进行平衡。
创建索引:
- 请求方式:PUT
- 请求路径:/索引库名
- 请求参数:json格式:
```json
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 2
}
}
```
- settings:索引库的设置
- number_of_shards:分片数量
- number_of_replicas:副本数量
删除索引:
DELETE /heima
查看索引:
GET /heima
接着创建映射
PUT /索引库名/_mapping/类型名称
{
"properties": {
"字段名": {
"type": "类型",
"index": true,
"store": true,
"analyzer": "分词器"
}
}
}
PUT /heima/_mapping/goods
{
"properties": {
"title":{
"type" : "text",
"analyzer" : "ik_max_word"
},
"image":{
"type" : "keyword",
"index" : false
},
"price":{
"type" : "float"
}
}
}
通过POST请求,可以向一个已经存在的索引库中添加数据。
简单新增
POST /heima/goods/
{
"title":"小米手机",
"images":"http://image.leyou.com/12479122.jpg",
"price":2699.00
}
查询所有
GET heima/_search
{
"query": {"match_all":{}}
}
根据id查询单个
GET heima/goods/1
不加映射也能智能推断保存数据
但是关于String
实验:post 大米手机 超大米手机 小米手机 红米手机
查询到四个,因为映射了有分词器并且默认是or
改成and后查询到两个
term查询精确查询,这里的大米手机相当于一个词条,只匹配不分词条的字段(除text外的字段),所有查询到0个
查询到4个
因为手机作为一个词条 能匹配到已经分好词后的大米手机,小米手机等
结果过滤
对搜索完的结果返回的数据进行过滤,includes/excludes选一
`fuzzy` 查询是 `term` 查询的模糊等价。有一定的容错,能查出apple手机
range对数值字段进行范围查询
bool /must 多个条件同时满足
bool /should 多个条件满足一个即可
bool /must_not 多个条件同时不满足
当多个条件时价格应是一个过滤条件,不应该影响查询后的得分
所以上面写的不合适
bool /must,filter各一个条件这样不影响得分不影响高亮
查询排序分页
聚合
桶:
桶的作用,是按照某种方式对数据进行分组,每一组数据在ES中称为一个`桶`
Elasticsearch中提供的划分桶的方式有很多:
- Date Histogram Aggregation:根据日期阶梯分组,例如给定阶梯为周,会自动每周分为一组
- Histogram Aggregation:根据数值阶梯分组,与日期类似
- Terms Aggregation:根据词条内容分组,词条内容完全匹配的为一组
- Range Aggregation:数值和日期的范围分组,指定开始和结束,然后按段分组
-Avg Aggregation:数值的平均值聚合
度量(metrics)
分组完成以后,我们一般会对组中的数据进行聚合运算,例如求平均值、最大、最小、求和等,这些在ES中称为`度量`
**注意**:在ES中,需要进行聚合、排序、过滤的字段其处理方式比较特殊,因此不能被分词。
- Terms Aggregation:按照生产商分组
在按照生产商分组的前提下计算每组的平均值
查询聚合一块使用,聚合需要的数据是查询得到的数据