众所周知ElasticSearch(后面简称ES)很多用来做全文搜索,因为性能高,一般的数据库如果直接模糊查询,性能非常低下,比如要查询要将关键词分开查,数据库是满足不了的。ES是基于Lucene的。隐藏复杂性,提供简单易用的restful api接口、java api接口,它并非什么新技术,也是对Lucene等技术的封装。
Elasticsearch是一个实时分布式搜索和分析引擎。它用于全文搜索、结构化搜索、分析。
全文检索:将非结构化数据中的一部分信息提取出来,重新组织,使其变得有一定结构,然后对此有一定结构的数据进行搜索,从而达到搜索相对较快的目的。
结构化检索:我想搜索商品分类为日化用品的商品都有哪些,select * from products where category_id='日化用品'
ES在Stack Overflow、GitHub等知名网站都有使用,很多站内搜索,比如电商、新闻、门户网站等都使用了ES,也是比较适合ES的一个场景
ElasticSearch的核心概念:
非实时:在插入数据到可以查询该数据有延迟,大概在1秒左右。
集群(Cluster)
顾名思义,集群包含多个节点,当然每个节点属于哪个集群的话也是需要配置文件来进行配置,集群默认是elasticserach名称
Node节点
集群的每一个节点都有自己的名字,默认是随机命名,节点名称也是很重要的。节点默认加入"elasticsearch"的集群,如果启动多个节点的话,相当于组成了一个"elasticsearch"的集群,一个节点也可以当做是一个集群。
Index(索引-数据库)
相当于对应mysql的数据库,包含一堆结构类似的文档数据(document),这里说的类似就是说一个document里面的大多数fields都是一样的,假如有一个index里面有5个document,如果每个document里面的的fields都不一样,那这些document就不合适放入到同一个index里面去。
Type(类型-表)
相当于数据库的表,每个索引里都可以有一个或多个type,type是index中的一个逻辑数据分类,一个type下的document,都有相同的field。简单理解就是,比如我有一张商品表,这张商品表就相当于type,商品type,都知道数据库的每张表字段列都是一样的。这里的field就理解为数据库的列,一个type下的document,都有相同的field,这个理解就是document就相当于每张表(type)里面的行数据,type也是属于Index
Document(文档-行)
文档是es中的最小数据单元,一个document可以是一条客户数据,一条商品分类数据,一条订单数据,通常用JSON数据结构表示,每个index下的type中,都可以去存储多个document。
Field(字段-列)
Field是Elasticsearch的最小单位。一个document里面有多个field,每个field就是一个数据字段。
mapping(映射-约束)
数据如何存放到索引对象上,需要有一个映射配置,包括:数据类型、是否存储、是否分词等。
这样就创建了一个名为blog的Index。Type不用单独创建,在创建Mapping 时指定就可以。Mapping用来定义Document中每个字段的类型,即所使用的 analyzer、是否索引等属性,非常关键等。
版本:在6.x中,一个index只能有一个type,推荐的type名是 _doc。而在7.0版本后完全抛弃了type