创建
put 索引名称
创建索引并设置映射
删除
delete 索引名称
查找
get 索引名称
添加mapping字段
索引mapping字段创建好后,无法直接修改
但是可以添加新的mapping字段
2.映射
为已有索引添加映射
put 索引名称/_mapping{"properties":{"字段名1":{"type":"字段类型"},......}}
3.文档
新增
查询
get 索引库名/_doc/{文档id}
删除
delete 索引库名/_doc/{文档id}
修改
1.全量修改
根据id删除原文档,新增一个id相同文档
2,增量修改
只修改指定id文档的部分字段
ES索引库/文档在代码中的实现 1.导入ES依赖 2.初始化RESTHighLevelClient
使用完成后需要close
各种操作的代码实现
1.索引
创建索引
删除索引
判断索引是否存在
2.文档
新增文档
查询文档
删除文档
更新文档
1.局部更新
2.全量更新
同新增文档操作,将字段值改为新的就可以
批量添加文档
1.准备批量数据
2.new BulkRequest()对象
3.把数据全部放进bulkRequest中
ES中DSL查询文档 查询所有
Get /索引名称/_search { "query":{ "match_all":{}}}
Get /索引名称/_search
全文检索
执行流程
1.根据输入内容做分词,得到词条
2.根据词条去倒排索引库中匹配,得到文档id
3.根据文档id得到文档
使用场景
商城的搜索框
注意事项
因为需要进行分词得到词条,所以参与搜索的字段也必须是可分词的text类型字段.
语法
单字段查询
Get /索引库名称/_search { "query":{ "match":{ "查询字段名称":"查询字段内容(text)" }}}
多字段查询
Get /索引库名称/_search { "query":{ "multi_match":{ "query":"查询字段内容" "fileds":["查询字段名1","查询字段名2"]}}}
参与查询字段越多,性能越低,所以建议将查询次数较多的字段,利用copy_to,放到公共字段里作为查询数据,以减少字段数
精确查询
概念
一遍查找keyword,数值等不会分词的字段,以精准定位到符合条件的数据.
根据词条进行精准查询
Get /索引库名/_search { "query":{ "term":{ "查询字段名称":{ "value":"条件值" }}}}
根据值的范围进行范围查询
Get /索引库名/_search { "query":{ "range":{ "字段名称":{ "gte(大于等于)":数值1, "lte(小于等于)":数值2}}}}
地理位置查询
官方文档
Geo queries | Elasticsearch Guide [8.0] | Elastic
根据地址位置的经纬度进行查询
矩形范围查询
需要指定矩形的左上和右下两个点的经纬坐标确定一个矩形,在这个矩形范围内的位置都算
Get /索引库名/_search { "query":{ "geo_bounding_box":{ "字段名称":{ "top_left":{ "lat":纬度坐标, "lon":经度坐标 }, "bottom_right":{ "lat":纬度坐标, "lon":经度坐标 }}}}}
附近查询
需要指定圆心和半径,确定一个圆的范围
Get /索引库名/_search { "query":{ "geo_distance":{ "distance": "半径和单位", "地理位置字段名":"经坐标,纬坐标" }}}}
复合查询
概念
将简单查询的组合
算分函数查询
可以控制文档的分数,控制文档的排名
ES使用的打分算法为:BM25算法,它会对词条算分进行控制,保证词条频率增加时,算分也能保持稳定.
组成部分
原始条件
过滤条件
算分函数
运算模式
Get /索引库名/_search { "query":{ "function_score":{ "query":{任意查询条件}, "functions":[ { "filter":{ 需要满足的条件 } , "weight": 算分权重数字 } ], "boost_mode":"加权模式" }}}
布尔查询
是一个或多个查询子句的组合
组合方式
must:必须匹配每个子查询,类似与
should:选择性匹配每个子查询,类似或
must_not:必须不匹配,不参与算分,类似非
filter:必须匹配,不参与算分
GET /索引库名称/_search { "query": { "bool": { "must": [ {"term": {"字段名称": "字段值" }} ], "should": [ {"term": {"字段名称1": "字段值1" }}, {"term": {"字段名称2": "字段值2" }} ], "must_not": [ { "range": { "字段名称": { "lte": 值 } }} ], "filter": [ { "range": {"字段名称": { "gte": 值 } }} ]}}}
注意在这些布尔查询里可以写任何条件,这里只是举例
搜索结果处理
排序
可以排序的字段有keyword,数值类型,地理坐标,日期类型等
普通字段排序
GET /索引库名称/_search { "query": { "match_all": {} }, "sort": [ { "FIELD": "desc" // 排序字段、排序方式ASC、DESC }, { "FIELD": "desc" // 排序字段、排序方式ASC、DESC }, ........... ]}
地理坐标排序
GET /索引库名称/search { "query": { "match_all": {} }, "sort": [ { "geo_distance" : { "FIELD" : "纬度,经度", // 文档中geo_point类型的字段名、目标坐标点 "order" : "asc", // 排序方式 "unit" : "km" // 排序的距离单位 } }]}
指定一个坐标,作为目标点
计算每一文档中,指定字段(必须是geo_point类型的位置)到目标点的距离是多少
根据距离排序
分页
GET /索引库名称/_search { "query": { "match_all": {} }, "from": 0, // 分页开始的位置,默认为0 "size": 10, // 期望获取的文档总数 "sort": [ {"排序字段名称": "asc"} ] }
深度分页问题
search after
官方推荐使用方式,分页时排序,从上一次的排序值开始,查询下一页数据
scroll
官方不推荐
高亮处理
GET /索引库名称/_search { "query": { "match": { "FIELD": "TEXT" // 查询条件,高亮一定要使用全文检索查询 } }, "highlight": { "fields": { // 指定要高亮的字段 "FIELD": { "pre_tags": "", // 用来标记高亮字段的前置标签 "post_tags": "" // 用来标记高亮字段的后置标签 }}}}
默认情况下,高亮的字段,必须与搜索指定的字段一致**,否则无法高亮
如果要对非搜索字段高亮,则需要添加一个属性:required_field_match=false



