Elasticsearch(一):概念与基本API

安装 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 idterm frequencies
  • positions:记录 doc idterm frequenciesterm position
  • offsets:记录 doc idterm frequenciesterm positioncharacter 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 类型,当写入字段匹配到该类型,会自动转为配置的类型。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容