Es全文检索引擎
Es的概述:随着时间的发展,常规的搜索已经很难满足人们的需要,像京东,百度,他们是怎么实现这些快速寻找的功能呢?答案是Es(特殊的全文搜索引擎)~
```全文检索引擎:其实就是将无结构的数据,通过全文检索引擎变成有结构的数据,从而实现高效率搜索
- 全文:针对所有文本,也就是我们存储到搜索服务器中的文本内容
- 检索:就是搜索的意思
- 引擎:可以认为是一个服务器,一个工具,我们可以使用这个工具达到我们想要的效果
这里我们要简单说一下他的底层,ES的底层就是使用了Lucene(基于Java开发的,全文检索引擎工具包),说到这里就不得不说一下他的黄金面试题了
Lucene原理:
从索引的创建-1.给原始数据加索引(类似于下标的东西)
2.给原始数据进行分页(比如说helloworld=>hello world)给分隔开
3.原始数据进行小写及现代词改变(过去时等其他时态变成现在时,通俗点来说就是昨天的事情都拿来今天来做)
4.字母进行排序(这是为了让响应速度更快)
5.将所有的词进行去重并且合并索引,最终形成倒排索引文档(可以理解为key,value的交换位置)
索引的搜索-1.对搜索的数据进行分词
2.对分词的数据去去倒排索引中寻找
3.根据索引值匹配原始数据
4.计算出匹配的值的相关度进行排序响应
ES索引&文档操作
索引-1.DELETE 索引库 删除索引
文档- 1.GET /索引库/_doc/Id:查询单个文档
2.GET /索引库/_doc/_search:查询所有文档
3.PUT /索引库/_doc/Id {jeson}: 添加id对应的索引
4.POST /索引库/_doc {json数据}:随即添加
5.POST /索引库/_doc/id/_updat{"doc":{json数据}}:局部修改数据
6.POST /索引库/_doc/id {json数据}覆盖并生成新数据
7.DELETE /索引库/_doc/id删除指定文档
DSL语法的引入
目前DSL语法有两种形式
- DSL查询:query DSL 模糊查询
- DSL过滤:filter DSL 等值查询
DSL常用关键字
1.query 查询
2.bool 多个组合条件
3.filter 过滤
4.term 全值匹配,不会分词
5.match 分词后进行匹配
6.must DSL查询可以加多个条件
7.from 从哪一条开始取,以数值的下一条数据开始
8.size 每页展示条数
9._source 只选择某些字段
10.must_not 不包含
11.range 匹配某个范围
事列代码:
GET /pethome/pet/_search where sex = 1 and username like "%zs%"
{
"query": { // 编写DSL查询条件关键字
"bool": { // 开启组合查询
"must": [{ // 必须匹配
"match": { // 分词后再进行查询
"username": "zs"
},
}],
"filter": { // DSL过滤
"term": { // 等值查询
"sex": 1
}
}
}
},
"from": 20,
"size": 10,
"_source": ["name", "age", "username"],
"sort": [{
"age": "desc"
}, {
"id": "asc"
}]
}
文档类型映射:
为了方便字段的检索,我们会指定存储在ES中的字段是否进行分词,但是有些字段类型可以分词,有些字段类型不可以分词,所以对于字段的类型需要我们自己去指定
字符串 text-分词 keyword-不分词 StringField-不分词文本 TextFiled分词文本
数字 long integer short double float
日期 date
逻辑 boolean
复杂字段类型:
数组类型 array
地理位置 geo_point,geo_shape
添加映射 如果索引已经有数据了,那么不能再添加映射,添加映射之前必须先创建索引,可以先删除索引,再重新添加映射