安装 Elasticsearch
# 创建 es 网络
docker network create es
# 启动单点 es
docker run -d --name elasticsearch --net es -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" --restart=always elasticsearch:7.4.2
# 启动 kibana
docker run -d --name kibana --net es -p 5601:5601 --restart=always kibana:7.4.2
# 启动 es 集群监控工具 cerebro
docker run -d --name cerebro -p 9000:9000 --restart=always lmenezes/cerebro
常用 API
index
// 创建索引
PUT /test
// 查看已有索引
GET /_cat/indices
// 删除索引
DELETE test
Document
// 指定 id 创建文档
PUT /test/_doc/1
{
"username": "wch"
}
// 不指定 id 创建文档
POST /test/_doc
{
"username": "wch"
}
// 查询指定文档
GET /test/_doc/1
// 查询所有文档
GET /test/_search
{
"query": {
"term": {
"_id": {
"value": "1"
}
}
}
}
// 删除指定文档
DELETE /test/_doc/1
// 批量执行
POST _bulk
{"index":{"_index":"test"}}
{"username":"123"} // 指定索引新增
{"delete":{"_index":"test","_id":"wAKA5G4B6QyCVohhC0Yn"}} // 指定索引删除
{"update":{"_index":"test","_id":"1"}}
{"doc":{"username":"wch1"}} // 指定索引更新
// 指定 index、id 批量查询
GET /_mget
{
"docs": [
{
"_index": "test",
"_id": 1
},
{
"_index": "test",
"_id": 2
}
]
}
倒排索引与分词
倒排索引
倒排索引与正排索引
- 正排索引:从文档
id
到文档内容单词的关联关系。 - 倒排索引:从单词到文档
id
的关联关系。
倒排索引组成
- 单词词典:记录文档单词和单词到倒排列表的关联信息。
- 倒排列表:记录了单词对应的文档集合,由倒排索引项组成。倒排索引项包括文档
id
、单词词频、单词位置、单词偏移。
分词
分词是指将文本转换成一系列单词的过程,也可以叫做文本分析。
分词器组成
-
Character Filters
:针对原始文本做预处理,如去增加、删除、替换字符等。 -
Tokenizer
:将原始文本按照一定规则切分为单词。 -
Token Filters
:针对切分单词再加工,如转小写、删除或新增等处理。
验证分词
// 指定分词器验证分词
GET /_analyze
{
"analyzer": "standard",
"text": [
"Hello World"
]
}
// 指定索引、文档字段验证分词
GET /test/_analyze
{
"field": "username",
"text": "Hello World"
}
自带分词器
standard
默认分词器,按词切分,支持多语言,小写处理。
simple
按照非字母切分,小写处理。
whitespace
按空格切分。
stop
按照非字母切分,小写处理,去除停用词。
keyword
不分词,直接作为一个单词输出。
pattern
通过正则表达式(默认为 \W+
)切分,小写处理。
mapping
mapping
类似数据库中的表结构定义,主要作用为:
- 定义索引字段名
- 定义索引字段类型
- 定义倒排索引相关配置,如是否索引、索引配置等
mapping
中的字段类型禁止直接修改(lucene
实现的倒排索引生成后不允许修改),如果修改需要建立新的索引,然后做 reindex
操作。
mapping 配置
PUT /test
{
"mappings": {
"dynamic": "true",
"properties": {
"name": {
"type": "text",
"fields": {
"pinyin": {
"type": "keyword",
"analyzer": "pinyin"
}
}
},
"age": {
"type": "integer",
"null_value": 0
},
"desc": {
"type": "keyword",
"index": false
},
"address": {
"type": "text",
"index_options": "positions"
}
}
}
}
dynamic
mapping
中的 dynamic
参数用来控制字段的新增:
-
true
:默认配置,允许字段新增。 -
false
:不允许字段新增字段,但是文档可以正常写入,但无法对字段进行查询等操作。 -
strict
:文档不允许写入新字段,强行写入会抛出异常。
properties
properties
参数用来定义各个具体的字段。
index
index
参数用于控制字段是否索引。
index_options
index_options
用于控制倒排索引记录内容:
-
docs
:仅记录doc id
。 -
freqs
:记录doc id
和term frequencies
。 -
positions
:记录doc id
、term frequencies
和term position
。 -
offsets
:记录doc id
、term frequencies
、term position
和character offsets
。
text
类型默认为 positions
,其它默认为 docs
。选择记录的内容越多,占用空间越大。
null_value
null_value
字段用于指定字段为 null
时的处理策略,默认 es
会忽略该字段。可以通过该值来设定字段的默认值。
multi-fields
es
允许对一个字段采用不同的配置,只需要在字段配置中增加 fields
参数,成为当前字段的子字段。
dynamic mapping
如果 mapping
配置允许直接写入新字段,es
会对新字段的类型进行推测并写入 mapping
。推测是基于 json
类型的:
JSON 类型 | Elasticsearch 类型 |
---|---|
null | 忽略 |
boolean | boolean |
float | float |
integer | long |
object | object |
array | 基于数组第一个非 null 值的类型 |
string | 会对日期、浮点、整型做推断,否则设置为 text 类型并包含 keyword 子字段 |
dynamic templates
通过定义 dynamic templates
可以介入 dynamic mapping
的映射逻辑,
PUT /test
{
"mappings": {
"dynamic_templates": [
{
"string_as_keyword": {
"match_mapping_type": "string",
"mapping": {
"type": "keyword"
}
}
}
]
}
}
match_mapping_type
参数对应推断出来的 json
类型,当写入字段匹配到该类型,会自动转为配置的类型。