没志青年
发布于 2025-12-16 / 13 阅读
0

ElasticSearch

基础概念

  • 索引Index:相当于MYSQL的数据库

  • 文档Document:相当于MYSQL的一行记录

  • 字段Field:相当于MYSQL中的列

  • 映射Mapping:相当于MYSQL的表结构

索引

添加索引

PUT 方法

127.0.0.1:9200/test_index

重复添加会报错。

删除索引

DELETE 方法

127.0.0.1:9200/test_index

查询索引

文档

添加文档

127.0.0.1:9200/test_index/_doc/1

删除文档

全量修改

增量修改

映射

类型

  • text:文本,默认分词。

  • keyword:关键词,该类型只能整体搜索。

  • long、integer、short、byte、double、float 数值

  • date:日期

  • boolean:布尔值

  • object:对象

  • nested:嵌套对象数组

除了 binary 类型默认不索引,其他数据类型都是默认索引的。

动态映射:在插入文档的时候,会根据插入的数据自动推断字段类型,可能会导致字段类型不符合预期。

显式映射:手动指定

在创建索引的时候添加映射

dynamic 控制动态字段的行为:

  • true:默认,自动生成字段

  • false:忽略新字段

  • strict:插入新字段报错

index 控制是否能被索引

PUT方法

127.0.0.1:9200/索引名
{
  "mappings": {
    "properties": {
      "id": {
        "type": "long",
        "index": "false"
      },
      "archive": {
        "type": "integer",
        "index": "false"
      },
      "title": {
        "type": "text",
        "analyzer": "ik_smart"
      },
      "cover": {
        "type": "keyword",
        "index": "false"
      },
      "summary": {
        "type": "text",
        "analyzer": "ik_smart"
      },
      "content_text": {
        "type": "text",
        "analyzer": "ik_smart"
      },
      "content": {
        "type": "text",
        "index": "false"
      },
      "source": {
        "type": "integer",
        "index": "false"
      },
      "status": {
        "type": "integer",
        "index": "false"
      },
      "like": {
        "type": "integer",
        "index": "false"
      },
      "view": {
        "type": "integer",
        "index": "false"
      },
      "reply": {
        "type": "integer",
        "index": "false"
      },
      "tags": {
        "type": "nested",
        "properties": {
          "id": {
            "type": "long"
          },
          "name": {
            "type": "keyword"
          }
        }
      },
      "category": {
        "type": "object",
        "properties": {
          "id": {
            "type": "long",
            "index": "false"
          },
          "name": {
            "type": "keyword"
          }
        }
      },
      "column": {
        "type": "object",
        "properties": {
          "id": {
            "type": "long",
            "index": "false"
          },
          "name": {
            "type": "keyword"
          }
        }
      },
      "createdAt": {
        "type": "date",
        "format": "strict_date_optional_time||epoch_millis"
      },
      "updatedAt": {
        "type": "date",
        "format": "strict_date_optional_time||epoch_millis"
      }
    }
  }
}

1. 通用字段参数

这些参数适用于大多数字段类型。

参数

说明

示例

store

是否单独存储字段值。默认为 false,字段值存储在 _source 中,但可以设为 true 单独存储。

"store": true

null_value

定义当字段为 null 时存储的替代值。

"null_value": "N/A"

doc_values

是否为字段启用 doc_values。默认 true,用于排序和聚合。

"doc_values": false

boost

设置字段的权重值,用于影响查询相关性评分。

"boost": 2.0

copy_to

将字段值复制到另一个字段,便于合并搜索。

"copy_to": "combined_field"

dynamic

控制字段是否动态映射,可选值为 truefalse"strict"

"dynamic": false


2. 针对 text 类型的参数

用于控制分词行为和文本搜索特性。

参数

说明

示例

analyzer

指定用于分词的分析器。默认为 standard 分析器。

"analyzer": "english"

search_analyzer

查询时使用的分析器。默认为 analyzer 指定的值。

"search_analyzer": "whitespace"

search_quote_analyzer

当查询使用带引号的短语时,使用的分析器。

"search_quote_analyzer": "standard"

term_vector

控制是否存储词项向量,用于高亮、快速相关性计算等。可选值:noyeswith_positions 等。

"term_vector": "with_positions"

norms

是否为字段启用归一化因子(默认 true,影响评分)。

"norms": false

eager_global_ordinals

提前加载全局顺序字典,用于加速高频聚合。

"eager_global_ordinals": true

position_increment_gap

多值字段中相邻值之间的位置增量,默认为 100。

"position_increment_gap": 10


3. 针对 keyword 类型的参数

用于精确匹配字段。

参数

说明

示例

ignore_above

如果字段值长度超过指定字符数,则忽略(不索引)。

"ignore_above": 256

normalizer

用于规范化字符串值的处理器,例如小写化。

"normalizer": "lowercase_normalizer"

split_queries_on_whitespace

当启用时,将以空格为分隔符拆分查询字符串。

"split_queries_on_whitespace": true


4. 针对数值类型的参数

适用于 integerfloat 等数值类型。

参数

说明

示例

coerce

是否尝试将非数值数据自动转换为数值。默认为 true

"coerce": false

ignore_malformed

忽略无效的数值数据。默认为 false,如果有无效数据则报错。

"ignore_malformed": true

scaling_factor

用于 scaled_float 类型,定义浮点数的缩放因子。

"scaling_factor": 100"


5. 针对 date 类型的参数

用于日期字段的配置。

参数

说明

示例

format

定义日期字段的格式,支持多种日期格式。

`"format": "yyyy-MM-dd

locale

日期格式的语言环境,默认为 ROOT

"locale": "en_US"


6. 针对 geo_pointgeo_shape 类型的参数

用于地理位置和形状。

参数

说明

示例

ignore_malformed

忽略无效的地理数据输入。默认为 false

"ignore_malformed": true

orientation

定义 geo_shape 的方向,支持 rightleft

"orientation": "right"

在已创建的索引上增加映射

索引一旦创建,映射的字段是无法删除的。

IK分词器

查询

基本搜索

一、查询所有,即无条件查询。

1、GET方法,不带请求体

127.0.0.1:9200/test_index/_search

1、GET方法,带请求体

127.0.0.1:9200/test_index/_search
​
​
{
  "query": {
    "match_all": {
    }
  }
}

这两个效果一样。

二、条件查询

查询 title 字段中包含的

GET /posts/_search
{
  "query": {
    "match": {
      "title": "Elasticsearch"
    }
  }
}

多字段查询

有一个满足就行了

{
  "query": {
    "multi_match": {
      "query": "Elasticsearch tutorial",
      "fields": ["title", "summary", "plainText"]
    }
  }
}

布尔查询

{
  "query": {
    "bool": {
      "must": [
        { "match": { "title": "Elasticsearch" }},
        { "match": { "content": "search" }}
      ],
      "should": [
        { "match": { "tags": "tutorial" }}
      ],
      "must_not": [
        { "match": { "status": 2 }}
      ]
    }
  }
}

must:and,查询的条件,必须都满足

should:or,只满足一个就行了,满足的越多得分越高

must_not:not,根据条件排除

词项查询

用于精准匹配

{
  "query": {
    "term": {
      "status": 1
    }
  }
}

范围查询

{
  "query": {
    "range": {
      "createdAt": {
        "gte": "2025-01-01",
        "lte": "2025-12-31"
      }
    }
  }
}

过滤查询

只对文档进行筛选,不打分排序,比must布尔查询高效。

{
  "query": {
    "bool": {
      "filter": [
        { "term": { "status": 1 }},
        { "range": { "createdAt": { "gte": "2025-01-01", "lte": "2025-01-31" }}}
      ]
    }
  }
}

聚合查询

聚合用于对查询结果进行统计分析,如计数、平均值、最大值等。常用于获取统计数据。

1、计数聚合:统计 status 字段的不同值及其出现的次数。

{
  "size": 0,
  "aggs": {
    "status_count": {
      "terms": {
        "field": "status"
      }
    }
  }
}

2、日期直方图聚合

{
  "size": 0,
  "aggs": {
    "date_histogram": {
      "field": "createdAt",
      "calendar_interval": "month"
    }
  }
}

这个查询会按月份对 createdAt 字段进行直方图聚合,统计每个月的文档数量。

排序查询

排序用于对查询结果按照指定字段进行升序或降序排序。

GET /posts/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    { "createdAt": { "order": "desc" }}
  ]
}

分页查询

{
  "from": 10,
  "size": 10,
  "query": {
    "match_all": {}
  }
}

高亮显示

高亮显示用于突出显示查询匹配的部分,适用于展示查询结果时显示高亮。

{
  "query": {
    "match": {
      "title": "Elasticsearch"
    }
  },
  "highlight": {
    "fields": {
      "title": {
      	"pre_tags": ["<span class='highlight'>"],
						"post_tags": ["</span>"]
      }
    }
  }
}