- elasticsearch 是一款非常强大的开源搜索引擎,能帮助我们从海量数据中, 快速找到我们要的内容
- ELK技术栈 elasticsearch kibana ,logstash,beats,也就是elastic stack ,被广泛运用到日志数据分析,实时监控等
elasticsearch 底层是用lucence Lucene使用java开发的核心类库,提供了搜索的核心api
倒排索引: 倒排索引的概念是基于myql这样的正向索引而言的
- 文档:用来搜索的数据,其中的每一条数据就是一个文档,
- 词条,对文档数据或者用户搜索数据的,利用某种算法分词得到的词语就是词条
- **倒排索引创建是对正向索引的一种特殊处理:流程如下
将每一个文档的数据利用算法处理,得到词条,
创建表 表的id就是词条,值就是 词条所在的 文档id或者位置
因为词条的唯一性 可以给词条创建索引,例如hash表结构
**
正向索引和倒排索引的优缺点
- 正向索引 :
优点:可以给多个字段创建索引, 根据字段搜索排序速度非常快
缺点: 根据非索引字段,或者索引字段中的部分词条查询时,只能全表查找 - 倒排索引:
优点:(在模糊搜索的时非常快)可以根据词条查找词条所在的文档id 在根据文档id 快速定位词条所在的文档
缺点:无法根据字段做排序
- 正向索引 :
elasticsearch的一些概念:
- 文档和字段: elasticsearch是面向文档储存的 以json的进行存储 ,而文档中包含许多字段
- 索引和映射:idnex 索引在elsatic中表示相同类型文档的集合 优点类似于mysql中的表
映射:用来约束索引中的字段类型 - **mysql和elasticsearch的对比:mysql擅长事务类型的操作 保证数据的一致性
elasticsearch擅长数据的搜索,分析和计算
对安全性要求较高的数据 使用mysql存储,对查询 分析较多的数据 使用elasticsearch实现,2着搭配使用 保证数据的一致性
**
- **elasticsearch 默认的分词器是 把每个词拆分为一个一个的字 对中文并不友好 ; 我们需要使用ik分词
分词器作用;创建倒排索引时 对文档分词,用户搜索时 ,对输入的内容进行分词
**
- DSL 索引库语法: 创建索引库:请求方式 : put /索引名库{ 请求参数 mapping映射}
请求参数类型: type:字符串类型:text 表示文本要分词 keyword 不分词 精确查找
数值:long integer short byte double float
….类同于java
- 查询索引库: 请求方式:GET/索引库名
- 修改索引库: elasticsearch创建了的索引库 无法修改mapping ,因为会滴倒排索引产生影响; 但是可以新增字段 因为不会对倒排索引产生影响
- 删除索引库:请求方式:DELETE/索引库名
- 文档操作语法:
- 新增:POST/索引库名/_doc/文档id
- 删除:DELETE/索引库名/_doc/文档id
- 查询:GET/索引库名/_doc/文档id
- **修改: 全量修改: 请求方式:PUT /索引库/_doc/文档id{字段:值} 注意:全量修改会把原有的内容全部删除 在把修改的内容填进去 ,
增量修改:请求方式:POST/索引库_doc/文档id{字段1:值} 只针对某个字段做修改 不影响其他的字段
**
- java 代码操作elasticsearch: Restcilent
- JAVA 有2种REST client操作es : JAVA LOW LEVEL REST CLIENT/ JAVA High Level Rest Client
- low level rest client 是比较偏底层的 我们使用 High level rest client
- 核心API: 创建 RestHighLevelClient client = new RestHighLevelClient(RestClient.bulider(HttpHost.create(“完整的http连接地址”http://域名:端口“”)))
- 索引库创建: CreateIndexRequest request=new CreateIndexRequest(“库命名”)
request.source(“索引库的映射”,XContextTpye.JSON) 注意需要指定为json格式
client.indices().create(request,HttpOptions.DEfault);
删除请求: DeleteIndexRequest
查询请求:GetIndexRequest 方法exist 判断是否存在索引库
规律:操作索引库需要 client.indices().具体的方法 - 新增文档: Indexrequest request =new IndexRequest(“索引库名”);request.source(“要增加的内容”,XContestType.JSON).id( “id” )如果不指定文档id 系统会自动生成
client.index(reuqest,RequestOptions.DEFAULT) - 删除文档: DeleteRequest request = new DeleteRequest(“索引库名”,文档id)
cilent.delete(request,RequestOptions.DEFAULT) - 修改文档: UpdateRequest request = new UpdateRequest(“索引库名”,文档id);
request.doc(字段名,值…..)设置要修改的内容;
client.update(request,Request.DEFAULT)提交请求 - **批量操作文档: BulkRequest bulk = new BulkRequest(“索引库名”)全局的索引库名
bulk.add(请求对象…)可以添加多个 请求对象 而且可以是删除增加 修改操作同时存在
**
DSL 查询文档
- 查询分类
- 查询所有 :查询所有的数据,一般测试用 match_All
- 全文检索查询:利用分词器对用户输入的内容分词,然后去倒排索引库中匹配,
- match_query
- multi_match
- 精确查询:根据词条查找数据,一般是是keyword,数值,日期,boolean等字段
- ids
- term
- range
- 地理(geo)查询
- geo-distance
- geo_bounding_box
- 复合(compound) 查询:复合查询可以将上述查询条件组合起来,合并查询条件
- bool
- **function_score
**
- 查询分类
