Elasticsearch
1、 Elasticsearch是什么
•Elasticsearch 简称ES;
•Elasticsearch 是一个分布式的搜索和分析引擎,可以用于全文检索、结构化检索和分析,并能将这三者结合起来。基于Lucene 开发,现在是使用最广的开源搜索引擎之一,Wikipedia、Stack Overflow、GitHub 等都基于Elasticsearch 来构建自己的搜索引擎。
•通常跟Logstash Kibana一起使用,并称ELK;
2、 特性
- 安装方便:只需要jdk,没有太多依赖,集群搭建也很方便;
- JSON: 输入/输出格式为JSON,不需要定义Schema;
- RESTful:基本所有操作(索引、查询、甚至是配置)都可以通过HTTP 接口;
- 分布式:节点对外表现对等(每个节点都可以用来做入口);
- 准实时:从文档索引到可以被检索几乎实时;
- 多租户:可根据不同的用途分索引(可以理解为一个数据库系统建立多个库给不同的业务使用);
3、 跟传统关系型数据库对比
Elasticsearch 关系型数据库
4、 基本操作 - 增、删、改、查;
- 比较常用的查询:
match_all:表示取出所有documents;
{
“match_all”: {}
}
term:用于精确查找,可用于数值、date、boolean值或not_analyzed string,当使用term时,不会对查询字符串进行分析
{
“term”: {
“date”: “2014-09-01”
}
}
terms 和term 类似,但是,terms 里可以指定多个值,只要doc满足terms 里的任意值,就是满足查询条件的,但terms 表示的是contains 关系,而不是equals关系
{
“terms”: {
“tag”: [“search”, “full_text”, “nosql”]
}
}
range:类比数据库查找的范围查找:
{
“range”: {
“age”: {
“gte”: 20,
“lt”: 30
}
}
}
5、 分词
分词是将文本转换成一系列单词(Term or Token)的过程,也可以叫文本分析,在ES里面称为Analysis;
分词器是ES中专门处理分词的组件,英文为Analyzer;•3、在全文搜索(Fulltext Search)中,词(Term)是一个搜索单元,表示文本中的一个词,标记(Token)表示在文本字段中出现的词,由词的文本、在原始文本中的开始和结束偏移量、以及数据类型等组成。ElasticSearch 把文档数据写到倒排索引(Inverted Index)的结构中,倒排索引建立词(Term)和文档之间的映射,索引中的数据是面向词,而不是面向文档的。分析器(Analyzer)的作用就是分析(Analyse),用于把传入Lucene的文档数据转化为倒排索引,把文本处理成可被搜索的词。分析器由一个分词器(Tokenizer)和零个或多个标记过滤器(TokenFilter)组成,也可以包含零个或多个字符过滤器(Character Filter)。
流程:
ElasticSearch引擎在收到用户的查询请求时,会使用分析器对查询条件进行分析,根据分析的结构,重新构造查询,以搜索倒排索引,完成全文搜索请求
分词中的概念: - 字符过滤器:映射字符过滤器,HTML标记字符过滤器,模式替换字符过滤器;
- 分词器:标准分词器,字母分词器,空格分词器,小写分词器,经典分词器;
- 标记过滤器:小写标记过滤器,停用词标记过滤器,词干过滤器,同义词过滤器;
- 分析器:标准分析器,简单分析器,空格分析器,停用词分析器,雪球分析器,自定义分析器
6、 索引 - 索引(正向索引):
通过字段查询数据库记录;
通过url,链接到指定文章;
查字典:通过拼音或偏旁部首查汉字;
通过门牌号找到XX家等等; - 倒排索引
eg:问题:有X条记录:id=1,content=‘I love study.’Id=2,content=‘And study make me happy.’。。。想搜索‘study happy’。在传统关系型数据库中,用下面语法查询:SELECT id,contentFROM table_nameWHERE (column_name LIKE ‘study’ and column_name LIKE ‘happy’)
用ES搜索结果中可知记录2被命中2次,而记录1被命中1次,记录2比记录1要有更高的关注度; - 应用场景
A. 电商系统上的搜索;
B. 运行系统中的日志搜索;
C. 大数据量分析;