Elasticsearch 介绍
Elasticsearch 是构建在Apache Lucene之上的开源分布式搜索引擎。Lucene是凯源的搜索引擎包,允许通过java程序实现搜索功能。Elasticsearch充分利用了lucene,并对其进行了扩展,使存储、索引、搜索变得更快、更容易。 那么Elastic是如何解决搜索问题的呢? 1,提供快速查询。Elasticsearch 采用Lucene作为底层,Lucene是个高性能的搜索引擎包,默认情况下会将所有数据全部进行索引。 2,确保结果的相关性。可以使用几个算法来计算相关性得分,然后根据分数将结果逐个排序。 3,超越精确匹配 可以处理错误的拼写;支持变体;使用统计信息;给予自动提示
典型的Elasticsearch使用案例
1,将es作为主要的后端系统 2,将es添加到现有系统 3,将es作为现有解决方案中的后端部分。
es如何组织数据
可以从2个方面进行观察:逻辑设计和物理设计 逻辑设计: 文档:相当于mysql表格中的一行记录 类型:相当于mysql中的一张表 索引:相当于一个数据库 物理设计: 节点和和分片:一个节点是一个es的实例。每启动一个es进程,就增加一个实例。每个机器上可以有一到多个节点。 分片是es所处理的最小单元,一份分片是Lucene的索引,是一个包含倒排索引的文件目录。分片可以是主分片或副本分片,副本分片用于搜索,或者在原油的主分片丢失后成为新的主分片。
es中的3种类型
核心--包括字符串和数值型 数组和多元字段--在某个字段中存储相同核心类型的多个字段 预定义--包括_ttl和_timestamp等 es中对数据的基本操作包括索引、更新、和删除数据
搜索数据
1,搜索请求的范围
// 搜索整个集群
% curl 'localhost:9200/_search' -d '...'
// 搜索get-together索引
%curl 'localhost:9200/_get-together/_search' -d '...'
// 在get-together中搜索事件类型
%curl 'localhost:9200/get-together/event/_search' -d '...'
// 在get-together中搜索所有的事件类型
% curl‘localhost:9200/_all/event/_search' -d '...'
% curl‘localhost:9200/*/event/_search' -d '...'
// 在get-together和其他索引中搜索事件和分组类型
% curl 'localhost:9200/get-together,other/event,group/_search' -d '...'
// 搜索以get-toge开头的索引,但是不包括get-together
% curl 'localhost:9200/+get-toge*,-get-together/_search' -d '...'
搜索请求的基本模块
query: 这是搜索请求中最重要的组成部分。配置了基于评分返回的最佳文档,也包括你不希望返回哪些文档。使用查DSL和过滤器DSL来配置。 size:返回文档的数量 from:和size一起使用,用于分页操作 _source: 配置返回字段 sort:默认的排序是文档的得分。如果不关心文档得分,也可以添加额外的sort控制文档的返回。
match查询和term过滤器的区别
match查询:判断文档中是否匹配,如果匹配就计算文档得分,返回文档,不匹配就继续下一个文档。 term过滤器:判断文档是否匹配,如果匹配就缓存匹配,如果不匹配记忆跳过文档。 主要区别在于是否有打分的过程 #####Elasticsearch如何分析数据 1,字符过滤--使用字符过滤器转变字符 有两种方式来i制定i字段所使用的分析器: 创建索引的时候,为特定的索引进行设置;在es的配置文件中,设置全局的分析器 2,文本切分为分词--将文本切分为单个或多个分词 3,分词过滤--使用分词过滤器转变每个单词 4,分词索引--将这些分词存储到索引中
Elasticsearch的打分机制
词频:一个词条在文档中出现的次数越高,那么文档和搜索的相关性越高。 逆文档频率:一个词条在不同文档中出现越多的次数,那么它就越不重要。
使用聚集来探索数据
很多情况下,用户并不关心具体的搜索结果,他们更希望获得一组统计数据,这些统计数据可能是新闻热点话题、不同产品的营收趋势、网站的访客数量等。es的聚集特性很好的解决了这个问题。 聚集包括度量聚集和桶聚集。度量型聚集是指一组文档的统计分析,包括最大最小值,标准差等。桶聚集将匹配的文档切分为一个或者多个桶,然后告诉你每个桶里的文档数量。有了桶聚集,可以嵌套其他聚集,让子聚集在上层聚集所产生的每个桶上运行。
文档间的关系
有些文档天生就是有关联的。数据中会有相互关联的实体。定义es文档间的关系可以用以下类型。 对象类型:允许你将一个对象或者对象数组作为文档字段的值。 嵌套文档:对象类型的问题在于,所有的数据都存储在同一个文档中,所以搜索可能会查找多个子文档。将部分字段保存在单独的Luncne文档中,可以避免查询到一些非预期的结果 文档间的父子关系:为不同类型的数据,使用完全独立的es文档。但是他们之间仍然可以保持父子关系。 反规范化:将数据进行复制,达到关系的目的。
扩展能力
为了处理更多的索引和搜索请求,或者更快的处理索引和搜索请求,扩展性是一个非常重要的因素。 主要包括添加节点,删除节点和主节点的选举。
提升性能
为了更好的提升es的性能可以有以下方法 1,合并http请求。批量索引、更新和删除 2,优化Lucene分段的处理。(1)包括刷新和冲刷的频率。冲刷是指将索引的数据从内存写入磁盘;(2)合并,将数据存储在不可变的一组文件中,也就是分段中。索引越多就会创建更多的分段,由于在过多的分段中搜索是很慢的,因此在后台小分段会合并成大分段。(3)存储和存储限流。es调节每秒的写入速度,来限制合并对于I/O系统的影响。 3,充分利用缓存 包括过滤器缓存、分片查询缓存和JVM堆和操作系统缓存。 等等