一、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 可以分布式集群,并且可以做一些复杂的数据分析,而且高可用,

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

ElasticSearch 笔记(一)的更多相关文章

  1. Elasticsearch笔记九之优化

    Elasticsearch笔记九之优化 ).get(); } curl命令可以在linux中建立一个定时任务每天执行一次,同样java代码也可以建立一个定时器来执行. 2:内存设置之前介绍过es集群有 ...

  2. Elasticsearch笔记八之脑裂

    Elasticsearch笔记八之脑裂 概述: 一个正常es集群中只有一个主节点,主节点负责管理整个集群,集群的所有节点都会选择同一个节点作为主节点所以无论访问那个节点都可以查看集群的状态信息. 而脑 ...

  3. Elasticsearch笔记七之setting,mapping,分片查询方式

    Elasticsearch笔记七之setting,mapping,分片查询方式 setting 通过setting可以更改es配置可以用来修改副本数和分片数. 1:查看,通过curl或浏览器可以看到副 ...

  4. Elasticsearch笔记二之Curl工具基本操作

    Elasticsearch笔记二之Curl工具基本操作 简介: Curl工具是一种可以在命令行访问url的工具,支持get和post请求方式.-X指定http请求的方法,-d指定要传输的数据. 创建索 ...

  5. 白日梦的Elasticsearch笔记(一)基础篇

    目录 一.导读 1.1.认识ES 1.2.安装.启动ES.Kibana.IK分词器 二.核心概念 2.1.Near Realtime (NRT) 2.2.Cluster 2.3.Node 2.4.In ...

  6. Elasticsearch笔记

    资料 官网: http://www.elasticsearch.org 中文资料:http://www.learnes.net/ .Net驱动: http://nest.azurewebsites.n ...

  7. Elasticsearch笔记六之中文分词器及自定义分词器

    中文分词器 在lunix下执行下列命令,可以看到本来应该按照中文"北京大学"来查询结果es将其分拆为"北","京","大" ...

  8. Elasticsearch笔记四之配置参数与核心概念

    在es根目录下有一个config目录,在此目录下有两个文件分别是elasticsearch.yml和logging.yml. logging.yml是日志文件,es也是使用log4j来记录日志的,我在 ...

  9. Elasticsearch笔记三之版本控制和插件

    版本控制 1:关系型数据库使用的是悲观锁,数据被读取后就被锁定其他的线程就无法对其进行修改. 2:ex使用的是乐观锁,数据被读取后其他程序还可以对其进行修改,而执行修改时发现此数据已经被修改则修改就会 ...

  10. Elasticsearch笔记五之java操作es

    Java操作es集群步骤1:配置集群对象信息:2:创建客户端:3:查看集群信息 1:集群名称 默认集群名为elasticsearch,如果集群名称和指定的不一致则在使用节点资源时会报错. 2:嗅探功能 ...

随机推荐

  1. 常用JavaScript操作页面元素的方法

    1.取得dropdownlist的选中值 var ddl =document.getElementById('<%=ddlusers.ClientID%>'); var index = d ...

  2. Ubuntu-14.04-QT开发环境搭建-(一)

    Ubuntu 14.04 QT 开发环境搭建 一 . 软件:qt-creator-linux-x86-opensource-2.7.0.binqt-everywhere-opensource-src- ...

  3. sql中case when的简单使用

    这是一个很多博客都引用的博客,作者未知,但是我第一次看到的就是这个,所以置顶这个吧, 这里有两个我刚才使用的列子: --查询同一机构的签约数和解约数: select t.sgn_acct_issr_i ...

  4. php中mb_strlen,mb_substr根据中文长度截取字符串

    大于8截取,小于等于则不截取. 结合thinkphp模板引擎规则,代码如下: <,,'utf-8'}..<else/>{sh:$vo.name}</if> 这里if中的函 ...

  5. spring-cloud配置高可用eureka服务端

    spring-cloud配置eureka服务端 eureka用来发现其他程序 依赖 <?xml version="1.0" encoding="UTF-8" ...

  6. 第十二章 Java内存模型与线程(待续)

    ············

  7. flask系列八之请求方法、g对象和钩子函数

    一.get方法 ,post方法 post请求在模板中要注意几点: (1)input标签中,要写name来标识这个value的key,方便后台获取. (2)在写form表单的时候,要指定method=' ...

  8. Android 4 学习(14):Internet Resources

    参考<Professional Android 4 Development> 使用Internet资源 打开URI String myFeed = getString(R.string.m ...

  9. Halcon学习之三:有关图像通道的函数

    黑白摄像机会返回每个像素所对应的能量采用结果,这些结果组成了一幅单通道灰度值图像,而对于RGB彩色摄像机,它将返回每个像素所对应的三个采样结果,也就是一幅三通道图像.下面这些是与图像通道有关的函数: ...

  10. vue 构建前端项目并关联github

    这几天尝试用node开发一个网站,后端的接口已经初步开发完成,现在开始构建前端的项目,记录下过程,在学习下吧. 用vue-cli 构建项目,myproject.(构架过程略过) 每次在本地构建项目后和 ...