ElasticSearch 笔记(一)

一、Elasticsearch 印象

    分布式、全文检索、数据分析。

二、为什么不用传统关系型数据库,如 MySQL,做搜索

    举个反例。假设有以下数据库表 t_game:    

id   name
1 唐僧取经
2 西天取经
3 唐僧不取经

  

    需求:你在搜索输入框中输入 “唐僧取经”,希望找出相关的游戏。

    转化成 SQL 就是:SELECT * FROM t_game where name LIKE '%唐僧取经%';

    LIKE 前后模糊匹配,不走索引,只能全表扫描,数据量很大的话,比如有个 1 千万条记录,就需要扫描 1 千万次,性能肯定很差。

    还有一个问题,当你搜索 “唐僧取经” 的时候,也许 “唐僧不取经” 也是你想要的结果,

    但是 SQL 查询无法匹配这条记录。

    所以,用关系型数据库做搜索,有两大问题:① 全表扫描,性能不好 ② 只能把输入关键字作为一个整体,也就是不能全文检索。

三、全文搜索 和 倒排索引

   利用一种叫做 “倒排索引” 的东东,大致原理:

   把 t_game 表的 name 字段进行分词,然后记录分出来的词对应的 id

分词 ids
取经 1、2、3
唐僧 1、3
西天 2
3

   

    然后,对搜索关键字 “唐僧取经” 也进行分词:唐僧、取经。

    第一次拿 “唐僧” 去查倒排索引,可以查到游戏 id 为:1、3 的记录;接着用 “取经” 再去查倒排索引,

    可以查到游戏 id 为:1、2、3 的记录,合并结果就是返回 1、2、3 的记录。

    在本例中,即使数据有千千万,只需要 2 次查询,就可以查到所有结。

    所以,利用 倒排索引,可以解决两个问题:全文搜索、性能问题。

四、lucene

    简单来说就是一个 jar 包,封装了建立 倒排索引 的算法,已经各种 搜索 算法,可以用来做全文检索。

五、Elasticsearch

    lucene 虽然可以做全文检索,

    但是只能单机,不能集群,当数据量太大以致单机无法容纳,需要分布式处理时,处理起来很麻烦;

    也不能做复杂的数据分析。

    于是顺其自然的就有了 Elasticsearch,Elasticsearch 可以分布式集群,并且可以做一些复杂的数据分析,而且高可用,

    当一些节点挂掉后,还能正常对外服务。

猜你喜欢

转载自www.cnblogs.com/justmehyp/p/10075808.html