一、顾名思义:

Elastic:灵活的;Search:搜索引擎

二、官方简介:

Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。

三、优势:

天然分片,天然集群,天然索引--->正如他的名字一样,查询速度快,是他最大的优势。

四、业务场景:

在大数据场景下,面对千万级数据,我们一般都会在mysql上进行分库分表。

比如我们根据公司名称查询公司详细信息,数据库已经被分成若干个,表分成若干个,

我们是不知道具体在哪个库,哪个表。分库分表后,每个表都有一个唯一标识id,

这个id可以解析出库表的后缀。那怎么根据名称获取这个id呢,有一种思路就是公司名称的md5,

然后解析到指定的索引库表,然后我们就可以查询到id,再根据id获取其他信息。

按照传统模式,我们需要从mysql查询两次,第一次从索引库查询id,

然后根据id获取其他信息。面对亿级数据,每过一次数据库,效率都要打折扣。

于是es携带其天生的全文高速检索优势正式亮相:有以下3种方案:

  1、将索引库整合导入es,我们优先从es中进行精确或者模糊匹配,然后再去mysql查询具体数据。

  2、将所有数据库整合导入es,直接从es查询。

  3、每次先从es查询,es没有从mysql查询,然后更新到es。

大概分析下各自的优缺点。

  1、可以大大提高检索效率,但需要消耗巨大存储与内存空间。

  2、可以高效的支持精确与模糊查询,空间与效率折中。中庸之道。

  3、业务环节变多,风险多,查询速度较低。

五、掀起盖头来(探索底层的奥秘)

很遗憾,这篇文章是掀不起来了,多次提笔,却发现自己还是没真正领悟,

无法用自己语言通俗的写出来,后续专门写一篇《掀起ElasticSearch的盖头》

六、重要知识点:

6.1、核心数据类型:

text:文本,默认会采用指定分词器进行分词,然后按照分词进行倒排索引。

keyword:一个串就是一个整体,直接按照keyword进行倒排索引。

6.2、分词:

分词是模糊匹配的基础,比如“中华人民共和国”,不同的分词器拆分不同,假设会将其拆分成“中华”,“人民”,“共和国”。

于是当我们利用“中华“进行模糊查询时,中华人民共和国就会被我们检索到。

6.3、常用工具:

Kibana(ELK中的K):功能强大,酷炫。使用起来没有eshead的”德福感“(丝滑)

es_head:小而精悍,你要的他都有。

七、事上炼:

SpringBoot+ElasticSearch

7.1、es数据来源:

  7.1.1、利用logstash导入

  7.1.2、利用java api导入

7.2、es操作:

ES 7.0版本中将弃用TransportClient客户端,已证明存在性能问题

目前大都采用:ElasticsearchTemplate

7.3、例子

7.3.1、es中的结构

"name": {
"type": "text", #支持text,用于模糊匹配
"fields": {
"keyword": {
"ignore_above": 256,
"type": "keyword" #支持keyword,用户精确匹配
}
}
}

7.3.2、模糊匹配

  1、将要查询的词,先进行分词,再进行匹配(MatchQuery)

  2、将要查询的词,作为一个整体,进行匹配(MatchPraseQuery),主要用这种

/**
* 模糊匹配*/
public List getEidsFromEs(String name) {
QueryBuilder queryBuilder = QueryBuilders.matchPhraseQuery(name, "name");
Pageable pageable = PageRequest.of(0, 10); //分页
NativeSearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(queryBuilder)
.withIndices("index")
.withTypes("_doc")
.withPageable(pageable)
.build();
AggregatedPage<doc> docs = template.queryForPage(searchQuery, doc.class);
List<doc> eids = docs.getContent();
return eids;
}

7.3.3精确匹配场景

  1、单条件,单字段(条件:”中华“,查询es中name字段)->termQuery

  2、单条件,多字段(条件:”中华“,查询es中name,ename,com_name字段)->termQuery+boolQuery

  3、多条件,单字段(条件:”中华“,”中国“,查询es中name)->termsQuery

  4、多条件,多字段(条件:”中华“,”中国“,查询es中name,ename,com_name字段)->termQuery+boolQuery

/**
* <单条件,单字段>模糊匹配*/
public List getEidsFromEs(String name) {
name = name + ".keyword"; //这很关键,增加后缀,启用keyword精确匹配
QueryBuilder queryBuilder = QueryBuilders.termQuery(name, "name");
Pageable pageable = PageRequest.of(0, 10); //分页
NativeSearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(queryBuilder)
.withIndices("index")
.withTypes("_doc")
.withPageable(pageable)
.build();
AggregatedPage<doc> docs = template.queryForPage(searchQuery, doc.class);
List<doc> eids = docs.getContent();
return eids;
}

  

/**
* <单条件,多字段>模糊匹配*/
Map<String, Object> boolQueryMap = new HashMap<>();
Map<String, Object> boolQuery = new HashMap<>();
for (String key : keys) {
boolQueryMap.put(key+".keyword", name);
boolQuery.put(key+".keyword", Constants.SHOULD);
}
SearchQueryBean searchQueryBean = new SearchQueryBean()
.setIndex(Constants.CBI_COMMON_INDEX).setType(Constants.CBI_COMMON_DOC)
.setBoolQuery(boolQuery).setBoolQueryMap(boolQueryMap)
.setPageNum(0).setPageSize(10)
.setClazz(EsIndexDocument.class);
BoolQueryBuilder booleanBoolQuery = QueryBuilders.boolQuery();
Iterator var3 = searchQueryBean.boolQueryMap.keySet().iterator();
while(var3.hasNext()) {
Object key = var3.next();
if (searchQueryBean.getBoolQuery().containsKey(key)) {
QueryBuilder queryBuilder = QueryBuilders.termQuery(key.toString(), searchQueryBean.boolQueryMap.get(key));
Method method = booleanBoolQuery.getClass().getMethod(searchQueryBean.getBoolQuery().get(key).toString(), QueryBuilder.class);
method.invoke(booleanBoolQuery, queryBuilder);
}
}
NativeSearchQuery searchQuery = this.buildNativeSearchQuery(searchQueryBean, booleanBoolQuery);
return this.elasticsearchTemplate.queryForPage(searchQuery, searchQueryBean.getClazz());

写到这里,文章已经到了尾声,此篇文章,主要讲述了es的入门步骤,也仅仅是入门,学习还是在个人。

对文中有任何异议,可随时留言或者邮箱反馈:wpt191@163.com,您的反馈是我们共同进步的催化剂。

还是那句话:学一门,爱一门,精一门,从知道到做到,还需要不停的努力与付出。

《ElasticSearch入门》一篇管够,持续更新的更多相关文章

  1. 《IM开发新手入门一篇就够:从零开发移动端IM》

        登录 立即注册 TCP/IP详解 资讯 动态 社区 技术精选 首页   即时通讯网›专项技术区›IM开发新手入门一篇就够:从零开发移动端IM   帖子 打赏 分享 发表评论162     想开 ...

  2. Gitlab-CI使用及.gitlab-ci.yml配置入门一篇就够了

    转载:Gitlab-CI使用及.gitlab-ci.yml配置入门一篇就够了 - 简书 (jianshu.com) 一. Gitlab-CI/CD使用场景 首先,公司使用Gitlab作为工作仓库进行代 ...

  3. ElasticSearch入门 第二篇:集群配置

    这是ElasticSearch 2.4 版本系列的第二篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 E ...

  4. ElasticSearch入门 第一篇:Windows下安装ElasticSearch

    这是ElasticSearch 2.4 版本系列的第一篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 E ...

  5. ElasticSearch入门 第九篇:实现正则表达式查询的思路

    这是ElasticSearch 2.4 版本系列的第九篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 E ...

  6. Python开发【第二十三篇】:持续更新中...

    Python开发[第二十三篇]:持续更新中...

  7. ElasticSearch查询 第二篇:文档更新

    <ElasticSearch查询>目录导航: ElasticSearch查询 第一篇:搜索API ElasticSearch查询 第二篇:文档更新 ElasticSearch查询 第三篇: ...

  8. [转帖]linux常用命令大全(linux基础命令入门到精通+实例讲解+持续更新+命令备忘录+面试复习)

    linux常用命令大全(linux基础命令入门到精通+实例讲解+持续更新+命令备忘录+面试复习) https://www.cnblogs.com/caozy/p/9261224.html 总结的挺好的 ...

  9. SEO入门一篇就够-SEO教程

    大家口中的SEO(Search Engine Optimization),中文翻译为"搜索引擎优化",从本质上来说,其实就是如何迎合搜索引擎的规则,使得网站在搜索结果中能有更好的排 ...

  10. Elasticsearch 思维导图集锦(持续更新...)

    目录 引言 思维导图 全文搜索 Elastic 基础 Query DSL Multi Match Query 系列文章列表 参考 引言 本文主要是对 elasticsearch 的一些知识点使用思维导 ...

随机推荐

  1. Hystrix入门

    hystrix对应的中文名字是“豪猪”,豪猪周身长满了刺,能保护自己不受天敌的伤害,代表了一种防御机制,这与hystrix本身的功能不谋而合,因此Netflix团队将该框架命名为Hystrix,并使用 ...

  2. 【谎言大揭秘】Modin真的比pandas运行更快吗?

    最近看了某公众号文章,推荐了所谓的神器,据说读取速度吊打pandas,可谓牛逼,事实真是这样吗? 来一起揭秘真相. 首先安装包. # pip install ray # pip install das ...

  3. oracle计算两日期相差多少秒,分钟,小时,天,周,月,年

    --计算两个时间差相差多少秒select ceil((sysdate-t.transdate)* 24 * 60 * 60),t.transdate,sysdate from esc_trans_lo ...

  4. js数组对象的一些常用方法

    pop:删除数组最后一个元素 语法: array.pop(); 如 var array = ['1','2','3']; array.pop(); 返回结果:[‘1’,‘2’]此方法会改变数组的长度 ...

  5. 工作中oracle常用操作

    常用数据库操作 启动数据库监听器lsnrctl start 停止数据库监听器lsnrctl stop 登录oraclesqlplus / as sysdba启动oralcestartup;关闭orac ...

  6. 我的Android知识结构图——20200507停止更新,后续通过标签或分类继续完善结构图

    *持续更新中.调整中(带链接的是已经总结发布的,未带链接是待发布的) *个别知识点在多个分类中都是比较重要部分,为了分类完整性 可能多出都列出了 *每一篇都是认真总结并写出来的,若哪里有问题欢迎指正 ...

  7. win10系统下计算器界面变成英文的解决方法

    标题: win10系统下计算器界面变成英文的解决方法 作者: 梦幻之心星 347369787@QQ.com 标签: [win10, 计算器, 英文] 目录: 软件 日期: 2019-04-20 目录 ...

  8. WALT(Window Assisted Load Tracking)学习

    QCOM平台使用WALT(Window Assisted Load Tracking)作为CPU load tracking的方法:相对地,ARM使用的是PELT(Per-Entity Load Tr ...

  9. Java实现 LeetCode 647 回文子串(暴力)

    647. 回文子串 给定一个字符串,你的任务是计算这个字符串中有多少个回文子串. 具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被计为是不同的子串. 示例 1: 输入: "a ...

  10. Java实现【USACO】1.1.2 贪婪的礼物送礼者 Greedy Gift Givers

    [USACO]1.1.2 贪婪的礼物送礼者 Greedy Gift Givers 题目描述 对于一群要互送礼物的朋友,你要确定每个人送出的礼物比收到的多多少(and vice versa for th ...