Elasticsearch与传统数据库对比
| RelationalDB | Elasticsearch |
|---|---|
| 数据库(database) | 索引(indices) |
| 表(tables) | types |
| 行(row) | documents |
| 字段(columns) | fields |
Elasticsearch数据类型
- 字符串类型:
text, keyword - 数值类型:
long, integer, short, byte, double, float, half_float, scaled_float - 日期类型:
date - 布尔类型:
boolean - 二进制类型:
binary - 在Elasticsearch中,没有专用的array数据类型。默认情况下,任何字段都可以包含零个或多个值,但是,数组中的所有值都必须具有相同的数据类型。这一点是区别于nested的,nested指的对象的集合。而arrays则是单一类型的数组集合而已。此外,不需要专门的类型类定义数组类型。
基础操作
建立带类型的索引
PUT /test2
{
mappings: {
properties: {
name: {
type: 'text'
}
}
}
}
// 废弃
PUT /test2
{
mappings: {
user: {
properties: {
name: {
type: 'text'
}
}
}
}
}
ES的开发者最初希望让用户这样理解,“索引”类似于SQL数据库中的“数据库”,type等价于table。 这被认为是一个糟糕的类比,导致了错误的假设。因为在SQL数据库中,表是相互独立(BC范式以后),一个表中的列与另一个表中具有相同名称的列没有关联,但这不是映射类型中的字段的情况,比如上面的user和tweet两个type都有user_name这个字段。 1.在ElasticSearch索引中,因为是封装的lucene,lucene解决这个问题的办法是:不同type中具有相同名称的字段在内部会是一个相同的Lucene field。换句话说,使用上面的示例,user中的user_name字段存储在与tweet类型中的user_name字段是被储存成完全相同的字段中,并且两个user_name字段在两种类型中必须具有相同的定义,比如想要对这个字段进行统一操作,这个字段的type必须相同。所以假如在同一索引中删除user被存成long的“ID”字段,由于tweet存成了“keyword”,那这就有可能会导致失败。 2.此外,在同一索引中存储很少或没有共同字段的不同实体会导致数据稀疏,并干扰Lucene有效压缩文档的能力。 由于这些原因,所以从ES删除多个映射类型的概念。
查询索引字段的类型
GET /test2
分词
let result = await axios({
method: 'post',
url: 'http://localhost:9200/_analyze',
data: {
"analyzer": "ik_smart",
"text": str
}
});