一、顾名思义:

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. CF894C Marco and GCD Sequence

    题目链接:http://codeforces.com/contest/894/problem/C 题目大意: 按照严格递增的顺序给出 \(m\) 个数作为公因数集,请你构造出一个数列,对于数列中的任意 ...

  2. [PHP]用PHP自己写一个基于zoomeye的api(偷懒必备quq)

    0x01 起因 因为手速慢,漏洞刷不过别人,一个个手补确实慢,所以想自己写一个api,一键抓取zoomeye的20页,然后就可以打批量了 ovo(真是太妙了!) 0x02 动工       1.抓包做 ...

  3. 一个茴字有三种写法——吐槽C#9.0的Records

    最近是微软开了Build 2020大会,由于疫情原因,改成了在线举行,Build大会上,C#公布9.0版本. 我个人对于C#的更新向来都是喜闻乐见,乐于接受的,对于博客园上某些人天天嘲讽C#只会增加语 ...

  4. el-select检索功能

    使用element-UI框架的使用,我们经常使用el-select下拉框,很多时候还需要使用可搜索的下拉框,然后elementUI官网的实例中只是提了一下filter-method可以自定义搜索方法, ...

  5. 2/3/4G网络架构

    1通讯网络演进 1.1 概念名词 LTE=Long Term Evolution=长期演进, 是3GPP制定的高数据率.低时延.面向分组域优化的新一代宽带移动通信标准项目. E-UTRAN 无线接入网 ...

  6. Golang源码学习:监控线程

    监控线程是在runtime.main执行的时候在系统栈中创建的,监控线程与普通的工作线程区别在于,监控线程不需要绑定p来运行. 监控线程的创建与启动 简单的调用图 先给出个简单的调用图,好心里有数,逐 ...

  7. [Android-NDK编译] ndk 编译 c++ 兼容性问题汇总整理

    1.__int64找不到符号 采用int64_t来代替: #if defined(__ANDROID__) typedef int64_t __int64; #endif 2.<sys/io.h ...

  8. 50个SQL语句(MySQL版) 问题四

    --------------------------表结构-------------------------- student(StuId,StuName,StuAge,StuSex) 学生表 tea ...

  9. Rocket - debug - Periphery

    https://mp.weixin.qq.com/s/uGxn-Xec0LkwdaSsCtQBvw 简单介绍Periphery的实现. 1. ExportDebugDMI/ExportDebugJTA ...

  10. 【HBase】与关系型数据库区别、行式/列式存储

    [HBase]与关系型数据库区别 1.本质区别 mysql:关系型数据库,行式存储,ACID,SQL,只能存储结构化数据 事务的原子性(Atomicity):是指一个事务要么全部执行,要么不执行,也就 ...