全文检索技术:
1 Elasticsearch是什么
Elasticsearch是一个分布式的Restfull风格的搜索和数据分析引擎,他有以下特点:
- 分布式:无需人工搭建集群,会自动扩展
- Restful风格,一切API都遵循Rest原则,容易上手
- 近实时搜索,数据更新在Elasticsearch中几乎是完全同步的。
为什么说Elasticsearch是近乎实时的呢?
Elasticsearch和磁盘之间还有一层称为FileSystem Cache的系统缓存,正是由于这层cache的存在才使得es能够拥有更快搜索响应能力。
在Elasticsearch中新增的document(相当于数据库的行)会被收集到indexing buffer(索引,相当于数据库)区后被重写成一个segment然后直接写入filesystem cache中,这个操作是非常轻量级的,相对耗时较少,之后经过一定的间隔或外部触发后才会被flush到磁盘上,这个操作非常耗时。但只要sengment文件被写入cache后,这个sengment就可以打开和查询,从而确保在短时间内就可以搜到,而不用执行一个full commit也就是fsync操作,这是一个非常轻量级的处理方式而且是可以高频次的被执行,而不会破坏Elasticsearch的性能。
默认情况下,每隔1秒自动refresh一次,这就是我们为什么说es是近实时的搜索引擎而不是实时的,也就是说给索引插入一条数据后,我们需要等待1秒才能被搜到这条数据,这是es对写入和查询一个平衡的设置方式,这样设置既提升了es的索引写入效率同时也使得es能够近实时检索数据。
参考资料:为什么说Elasticsearch搜索是近实时的?
2 索引
Elasticsearch和MySQL的对比关系:
索引(indices)--------------------------------Databases 数据库
类型(type)------------------------------------Table 数据表
文档(Document)----------------------------Row 行
字段(Field)-----------------------------------Columns 列
- 数据库里面的每一行商品数据就可以称为一个文档
- 商品名称这一列,就可以称为一个字段
概念 | 说明 |
---|---|
索引库(indices) | indices是index的复数,代表许多的索引, |
类型(type) | 类型是模拟mysql中的table概念,一个索引库下可以有不同类型的索引,比如商品索引,订单索引,其数据格式不同。不过这会导致索引库混乱,因此未来版本中会移除这个概念 |
文档(document) | 存入索引库原始的数据。比如每一条商品信息,就是一个文档 |
字段(field) | 文档中的属性 |
映射配置(mappings) | 字段的数据类型、属性、是否索引、是否存储等特性 |
2.1 对索引的操作
增:
Elasticsearch采用Rest风格API,因此其API就是一次http请求
创建索引的请求格式:
-
请求方式:PUT
-
请求路径:/索引库名
-
请求参数:json格式:
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 2
}
}
查:
GET /索引库名
删:
DELETE /索引库名
2.2 映射的配置
索引有了,接下来肯定是添加数据。不过数据存储到索引库中,必须指定一些相关属性,比如:
- 字段的数据类型
- 是否要存储
- 是否要索引
- 是否分词
- 分词器是什么
创建映射:PUT
PUT /索引库名/_mapping/类型名称
{
"properties": {
"字段名": {
"type": "类型",
"index": true,
"store": true,
"analyzer": "分词器"
}
}
}
查看映射:
GET /索引库名/_mapping
2.3 对数据的操作
增:
通过POST请求,可以向一个已经存在的索引库中添加数据。
随机产生数据id:
POST /索引库名/类型名
{
"key":"value"
}
自定义id:
POST /索引库名/类型/id值
{
...
}
改:
请求方式为put,不过修改必须指定id。
- id对应文档存在,则修改
- id对应文档不存在,则新增