对文档的内容进行分词,对词条创建索引,记录词条所在的文档信息根据词条查询到文档的id 从而查到文档
根据文档的id创建索引 查询词条必须先找到文档完了判断是否包含词条
es是面向文档存储的可以是数据库中的一条商品数据订单信息,文档会被序列化为json后存储在es中
mysql:擅长事务类型操作,可以确保数据的安全和一致性
es:擅长海量数据的搜索、分析、计算
index:如果需要根据该字段进行搜索设置为true(默认为true)
analyzer:当type为text需要指定分词器
分词器的作用:
properties:字段的子字段
通过DSL对索引文档CRUD
索引:
增PUT /indexName
删DELETE /indexName
改:不能修改已经存在的域
先删除后新增
查GET /indexName
文档:
增:POST /indexName/_doc/docId
删:DELETE /indexName/_doc/docId
改:
全量修改(删除旧文档添加新文档
)
增量修改(修改指定的字段)
差:GET /indexName/_doc/docId
RestApi
在java中使用es的步骤
@Autowired
private RestHighLevelClient client;
对索引crud
通过调用 client.indices()
增:creat
删:delete
改:直接通过那个set设置
查:get
对文档crud
通过client
增:index
删:delete
查:get
改:全量:index
增量:update
批量:bulk
常见的查询类型:
查询基本语法:
match查询:全文检索查询的一种 会对用户输入的内容分词然后去倒排索引库检索
multi_match:和match相似 允许插入多个字段(参与查询的字段越多 查询性能越差)
精确查询一般是查找keyword、数值、日期、boolean等类型字段。所以不会对搜索条件分词
term:根据词条精确值查询 一般搜索keyword类型、数值类型、布尔类型、日期类型字段
range:根据值的范围查询 可以是数值、日期的范围
term:
根据经纬度查询
geo_bounding_box:查询geo_point值落在某个矩形范围的所有文档
geo_distance:查询到指定中心点小于某个距离值的所有文档
复合查询:复合查询可以将其它简单查询组合起来,实现更复杂的搜索逻辑
fuction sorce:算分函数查询 可以控制文档相关性算分 控制文档的排名
function score query定义的三要素是什么?
排序:默认是根据相关度算分(_score)来排序。可以排序字段类型有:keyword类型、数值类型、地理坐标类型、日期类型等。
分页:默认情况下只返回top10的数据。而如果要查询更多数据就需要修改分页参数了。
深度分页问题:
如果搜索页数过深,或者结果集(from + size)越大,对内存和CPU的消耗也越高。因此ES设定结果集查询的上限是10000
解决方案:
search after:分页时需要排序,原理是从上一次的排序值开始,查询下一页数据。官方推荐使用的方式。
高亮 :就是在搜索结果中把搜索关键字突出显示。
高亮的原理
吧搜索结果中的关键字用标签标记出来
在页面添加css样式
查询的基本步骤
1 创建searchRequest对象
2 准备Request.source()
全文检索的match和multi_match查询与match_all的API基本一致。差别是查询条件,也就是query的部分。
同样是利用QueryBuilders提供的方法:
精确查询常见的有term查询和range查询,同样利用QueryBuilders实现:
精确查询常见的有term查询和range查询,同样利用QueryBuilders实现:
高亮API包括请求DSL构建和结果解析两部分
什么是聚合:
聚合可以实现对文档数据的统计、分析、运算。
聚合的种类
DSL实现Bucket聚合
统计所有酒店品牌
类型为term类型
聚合结果排序
默认情况bucket聚合会统计bucket内的文档数量 记为_count 按照降序排序
限定聚合范围
默认情况下:bucket聚合对索引库所有 的文档做聚合 我们可以限定聚合的文档范围只要添加query属性即可
aggs代表聚合,与query同级,此时query的作用是?
限定文档的范围
聚合必须的三要素是:
聚合可配置属性有
实现Metrics聚合
球每个品牌的用户评分的min max avg 等值
stats聚合
RestAPI实现聚合
品牌聚合