倒排索引和ES相关概念对比MySQL

1.倒排索引

1.1倒排索引两个重要概念:

  • 文档:用来搜索的数据,其中的每一条数据就是一个文档。例如一个网页、一个商品信息以京东商城为列
    image

  • 词条(Term):对文档数据或用户搜索数据,利用某种算法分词,得到的具备含义的词语就是词条。例如:我是中国人,就可以分为:我、是、中国人、中国、国人这样的几个词条,使我们搜索到的数据能够实现多内容搜索

1.2 倒排索引的搜索流程

image

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', 'alice@example.com');

  -- 查询数据
  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 文档存储。
根据具体的应用场景选择合适的技术方案,可以更好地满足业务需求。

posted @ 2024-10-15 20:30  码字的小猪  阅读(34)  评论(0编辑  收藏  举报
/*粒子线条,鼠标移动会以鼠标为中心吸附的特效*/