文章目录
适用于已经学习过es的同学快速查阅。
索引库
常见属性
核心配置
settings 全局设置,如主分片数(number_of_shards)、副本数(number_of_replicas)、刷新间隔(refresh_interval)等
mappings 定义文档结构,包含字段类型和属性配置字段类型
text 全文检索类型,会分词,可配置分词器(analyzer)
keyword 精确匹配类型,不分词,适合标签、ID 等数值类型
long/integer/double等,存储数字数据
date 日期类型,支持多种格式(如yyyy-MM-dd、时间戳)
boolean 布尔类型,存储true/false或等效数值 / 字符串
object 存储嵌套 JSON 对象,内部字段独立存储
nested 特殊object类型,解决数组对象查询歧义通用属性
index 控制字段是否索引(true/false,默认true)
store 控制字段是否独立存储(默认false,从_source提取)
ignore_above 超过指定长度的keyword字段不索引
format 针对date等类型,指定数据格式记住常用的,其他用到的时候再查就行。
创建
PUT /索引库
{
"mappings": {
"properties": {
"info": {
"type": "text",
"analyzer": "ik_smart",
"index": true
},
"name": {
"type": "object",
"properties": {
"firstName":{
"type": "keyword"
},
"lastName": {
"type": "keyword"
}
}
}
}
}
}
查询
GET /索引库
删除
DELETE /索引库
修改(只可新增字段)
PUT /索引库/_mapping
{
"properties": {
"age": {
"type": "long"
}
}
}
文档
新增
POST /索引库/_doc/文档id
{
"age": 15,
"info": "你好",
"name": {
"firstName": "li",
"lastName": "bai"
}
}
查询
GET /索引库/_doc/文档id
删除
DELETE /索引库/_doc/文档id
全量修改
先删除后新增。
存在即修改,不存在则新增。有点像mysql的duplicate
PUT /索引库/_doc/文档id
{
// 要修改的字段
}
增量修改
POST /索引库/_update/文档id
{
// 要修改的字段
}
查询
查询全部
GET /cosmos/_search
{
"query": {
"match_all": {
}
}
}
条件查询
GET /索引库/_search
{
"query": {
"match": {
"FIELD": "TEXT"
}
}
}
- 字段可用填写all表示文档全部字段中查询,7之前默认创建,7+被copy_to机制取代。
- 相似度评分(TF-IDF)
对匹配到的文档计算相关性得分(_score),核心逻辑基于 TF-IDF:
TF(词频):词条在当前文档中出现的频率越高,得分越高。
IDF(逆文档频率):词条在整个索引中出现的文档越少(越稀有),得分越高。
最终得分是 TF、IDF 及字段长度归一化(字段越短,相同词频下得分越高)等因素的综合计算结果。
7后使用BM25算法
精确查询
一般查找keyword
GET /索引库/_search
{
"query": {
"term": {
"FIELD": {
"value": "VALUE"
}
}
}
}
范围查询
GET /索引库/_search
{
"query": {
"range": {
"FIELD": {
"gte": 10,
"lte": 20
}
}
}
}
位置查询
- 矩阵查询
GET /索引库/_search
{
"query": {
"geo_bounding_box": {
"FIELD": {
"top_left": {
"lat": 40.73,
"lon": -74.1
},
"bottom_right": {
"lat": 40.01,
"lon": -71.12
}
}
}
}
}
- 中心点范围查询
GET /cosmos/_search
{
"query": {
"geo_distance": {
"distance": "10km", // 范围(支持 km、m、mi 等单位)
"FIELD": { // 需为 geo_point 类型字段
"lat": 39.9042, // 中心点纬度
"lon": 116.4074 // 中心点经度(示例为北京坐标)
}
}
}
}
简化:
GET /索引库/_search
{
"query": {
"geo_distance": {
"distance": "5km",
"FIELD": "39.9042, 116.4074" // 直接使用 "纬度,经度" 字符串
}
}
}
算分查询
默认算法的基础上,添加一些算分规则。
GET /索引库/_search
{
"query": {
"function_score": {
"query": { // 基础查询:匹配all字段包含"手机"的文档
"match": {
"all": "手机"
}
},
"functions": [ // 评分函数:对符合条件的文档增加权重
{
"filter": { // 筛选条件:brand字段为"苹果"
"term": {
"brand": "苹果"
}
},
"weight": 10 // 符合筛选条件的文档,评分权重增加10
}
],
"boost_mode": "sum" // 评分合并方式:基础分 + 函数分
}
}
}
boost_mode有这些模式:multiply、sum、min、max、replace。
bool 复合查询
GET /索引库/_search
{
"query": {
"bool": {
"must": [
{ "term": { "district": "朝阳区" } } // 必须在朝阳区
],
"should": [
{ "term": { "cuisine": "川菜" } }, // 优选川菜
{ "term": { "cuisine": "湘菜" } } // 或湘菜
],
"must_not": [
{ "range": { "average_price": { "gte": 800 } } } // 排除人均≥800的高端餐厅
],
"filter": [
{ "range": { "rating": { "gte": 4.2 } } } // 筛选评分≥4.2的餐厅(不影响算分)
]
}
}
}
- must 必须包含
- should 或者
- must_not 不包含(不影响分数计算)
- filter 过滤(不影响分数计算)
结果处理
排序
默认按分数排序,可以自己指定字段排序,指定后就会放弃打分。
GET /索引库/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"FIELD": "desc" // asc,desc
}
]
}
特殊:地理位置排序:
GET /索引库/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"_geo_distance": {
"FIELD": "纬度, 经度",
"order": "asc",
"unit": "km"
}
}
]
}
分页
默认10个。
GET /hotel/_search
{
"query": {
"match_all": {}
},
"from": 990, // 分页开始的位置,默认为0
"size": 10, // 期望获取的文档总数
"sort": [
{"price": "asc"} // 按price字段升序排序
]
}
from + size 不能大于1万。
高亮
GET /索引库/_search
{
"query": {
"match": {
"FIELD": "TEXT" // 替换为实际的字段名和要匹配的文本
}
},
"highlight": {
"fields": {
"FIELD": { // 要高亮显示的字段,与查询字段保持一致
"pre_tags": ["<em>"], // 高亮前置标签
"post_tags": ["</em>"] // 高亮后置标签
}
}
}
}
聚合
分为:Bucket 聚合(桶聚合)、Metric 聚合(指标聚合)、Pipeline 聚合(管道聚合)、Matrix 聚合(矩阵聚合,少见)
Bucket 聚合(桶聚合)
GET /索引库/_search
{
"size": 0, // 设置size为0,结果中不包含文档,只包含聚合结果
"aggs": { // 定义聚合
"xxAgg": { // 给聚合起个名字
"terms": { // 聚合的类型,terms表示按字段值分组
"field": "brand", // 参与聚合的字段
"size": 20 // 希望获取的聚合结果数量
}
}
}
}
Metric 聚合(指标聚合)
GET /hotel/_search
{
"size": 0,
"aggs": {
"xxAgg": {
"terms": {
"field": "brand",
"size": 20
},
"aggs": { // 这是xxAgg聚合的子聚合
"score_stats": { // 子聚合名称
"stats": { // 聚合类型,会计算min、max、avg、sum、count
"field": "score" // 要计算统计信息的字段
}
}
}
}
}
}
自动补全
// 1. 创建索引库并定义completion类型字段
PUT 索引库
{
"mappings": {
"properties": {
"title": {
"type": "completion" // 定义为completion类型,用于自动补全
}
}
}
}
// 2. 添加示例文档,字段内容为词条数组
POST 索引库/_doc
{
"title": ["Sony", "WH-1000XM3"]
}
POST test/_doc
{
"title": ["SK-II", "PITERA"]
}
POST test/_doc
{
"title": ["Nintendo", "switch"]
}
// 3. 执行自动补全查询
POST 索引库/_search
{
"suggest": {
"title_suggest": { // 补全查询名称
"prefix": "S", // 用户输入的前缀
"completion": {
"field": "title" // 指定补全字段
}
}
}
}