1.倒排索引
1.1倒排索引两个重要概念:
-
文档:用来搜索的数据,其中的每一条数据就是一个文档。例如一个网页、一个商品信息以京东商城为列
-
词条(Term):对文档数据或用户搜索数据,利用某种算法分词,得到的具备含义的词语就是词条。例如:我是中国人,就可以分为:我、是、中国人、中国、国人这样的几个词条,使我们搜索到的数据能够实现多内容搜索
1.2 倒排索引的搜索流程
2.ES相关概念对比MySQL
2.1数据存储模型
2.1.1 MySQL:
关系型数据库:
MySQL 是一种关系型数据库管理系统(RDBMS),数据存储在表中,表之间通过外键关联。
SQL 语言:使用 SQL(Structured Query Language)进行数据操作,包括 CRUD(Create, Read, Update, Delete)操作。
2.1.2 Elasticsearch:
NoSQL 数据库:Elasticsearch 是一种 NoSQL 数据库,主要用于全文搜索和分析。
JSON 文档:数据以 JSON 格式存储,每个文档可以包含嵌套对象和数组。
索引:类似于 MySQL 中的数据库,用于组织和管理文档。
2.2数据结构
2.2.1 MySQL:
表:数据存储在表中,表由行和列组成。
字段:每个表由多个字段组成,字段有固定的类型(如 int, varchar, date 等)。
主键:每个表有一个或多个主键,用于唯一标识每行数据。
外键:用于关联不同表之间的数据。
2.2.2 Elasticsearch:
索引:类似于 MySQL 中的数据库,用于组织和管理文档。
类型:在 Elasticsearch 6.x 及之前版本中,索引下可以有多个类型(type)。7.x 版本开始,每个索引只能有一个类型,默认为 _doc。
文档:数据以 JSON 格式存储,每个文档是一个独立的对象。
字段:每个文档由多个字段组成,字段可以是任何类型,包括嵌套对象和数组。
2.3数据操作
2.3.1 MySQL:
CRUD 操作:使用 SQL 语句进行增删改查操作
-- 插入数据
INSERT INTO users (id, name, email) VALUES (1, 'Alice', '[email protected]');
-- 查询数据
SELECT * FROM users WHERE id = 1;
-- 更新数据
UPDATE users SET name = 'Bob' WHERE id = 1;
-- 删除数据
DELETE FROM users WHERE id = 1;
2.3.2 Elasticsearch:
RESTful API:使用 HTTP 请求进行数据操作
private static final String ITEM = "item";
private static final String MAPPINGS = "{\n" +
" \"mappings\": {\n" +
" \"properties\": {\n" +
" \"id\": {\n" +
" \"type\": \"keyword\"\n" +
" },\n" +
" \"name\":{\n" +
" \"type\": \"text\",\n" +
" \"analyzer\": \"ik_max_word\"\n" +
" },\n" +
" \"price\":{\n" +
" \"type\": \"integer\"\n" +
" },\n" +
" \"stock\":{\n" +
" \"type\": \"integer\"\n" +
" },\n" +
" \"image\":{\n" +
" \"type\": \"keyword\",\n" +
" \"index\": false\n" +
" },\n" +
" \"category\":{\n" +
" \"type\": \"keyword\"\n" +
" },\n" +
" \"brand\":{\n" +
" \"type\": \"keyword\"\n" +
" },\n" +
" \"sold\":{\n" +
" \"type\": \"integer\"\n" +
" },\n" +
" \"commentCount\":{\n" +
" \"type\": \"integer\",\n" +
" \"index\": false\n" +
" },\n" +
" \"isAD\":{\n" +
" \"type\": \"boolean\"\n" +
" },\n" +
" \"updateTime\":{\n" +
" \"type\": \"date\"\n" +
" }\n" +
" }\n" +
" }\n" +
"}";
@Resource
RestHighLevelClient restHighLevelClient;
@Test
public void testClient(){
CreateIndexRequest createIndexRequest = new CreateIndexRequest(ITEM);
createIndexRequest.source(MAPPINGS, XContentType.JSON);
try {
CreateIndexResponse response = restHighLevelClient.indices().create(createIndexRequest, RequestOptions.DEFAULT);
log.warn("{}",response.isAcknowledged());
} catch (IOException e) {
e.printStackTrace();
}
}
3. 总结
3.1 MySQL:
适合结构化数据存储和事务处理,支持复杂的关系型数据操作。
3.2 Elasticsearch:
适合大规模的全文搜索和实时数据分析,支持灵活的 JSON 文档存储。
根据具体的应用场景选择合适的技术方案,可以更好地满足业务需求。