Alan Hou的个人博客

Elastic Stack从入门到实践之Elasticsearch

Elasticsearch 入门

常见术语

Document

Json Object,由字段(Field)组成,常见数据类型如下:

每个文档有唯一的id 标识

Document MetaData

元数据

Index

Rest API

Elasticsearch 集群对外提供 RESTful API

常用两种交互方式

索引API

es 有专门的 Index API,用于创建、更新、删除索引配置等

创建索引 API:PUT /test_index (蓝色部分为索引名)

查看现有索引:GET _cat/indices

删除索引:DELETE /test_index

文档 Document API

es 有专门的 Document API

Elasticsearch倒排索引与分词

正排索引:文档 id 到文档内容、单词的关联关系(下图左侧)

倒排索引:单词到文档 id 的关联关系(下图右侧)

倒排索引组成

倒排索引是搜索引擎的核心,主要包含两部分:

倒排列表(Posting )主要包含如下信息:

es 存储的是一个 json 格式的文档,其中包含多个字段,每个字段会有自己的倒排索引

分词

分词是指将文本转换成一系列单词(term or token)的过程,也可以叫做文本分析,在 es 里称为 Analysis

分词器是 es 中专门处理分词的组件,英文为 Analyzer,组成如下(按从上到下的顺序):

Analyze API

es 提供了一个测试分词的 API 接口,方便验证分词效果,endpoint 是_analyze

预定义分词器

es 自带分词器

中文分词

难点

常用分词系统

基于自然语言处理的分词系统

自定义分词

当自带的分词无法满足需求时,可以自定义分词

Character Filters

Tokenizer

将原始文本按照一定规则切分为单词(term or token)

自带的如下:

Token Filters

对于 tokenizer 输出的单词(term) 进行增加、删除、修改等操作

自带的如下:

自定义分词 API

自定义分词需要在索引的配置中设定

自定义分词验证

示例1

示例2

分词使用说明

分词使用的两个时机:

索引时分词是通过配置 Index Mapping 中的每个字段的 analyzer 属性实现的,不指定分词时,使用默认 standard,如下:

查询时分词的指定方式有如下几种:

一般不需要特别指定查询时分词器,直接使用索引时分词器即可,否则会出现与索引无法匹配的情况

分词的使用建议

Mapping 设置

Mapping类似数据库中的表结构定义,主要作用如下:

自定义 Mapping

Mapping 中的字段类型一旦设定后,禁止直接修改,原因是 Lucene 实现的倒排索引生成后不允许修改。修改需重新建立新的索引,然后做 reindex 操作。

允许新增字段,通过 dynamic 参数来控制字段的新增

copy_to

index

控制当前字段是否索引,默认为 true,即记录索引,false 不记录,即不可搜索

index_options

null_value

当字段遇到 null 值时的处理策略,默认为 null,即空值,此时 es 会忽略该值。可以通过设定该值设定字段的默认值

有关 mapping 更多参数请见官方文档

数据类型

核心数据类型

复杂数据类型

地理位置数据类型

专用类型

多字段特性 multi-fields

更多有关数据类型的介绍请见官方文档

Dynamic Mapping

es 可以自动识别文档字段类型,从而降低用户使用成本

es 是依靠 JSON 文档的字段类型来实现自动识别字段类型,支持的类型如下:



日期的自动识别可以自行配置日期格式,以满足各种需求

字符串是数字时,默认不会自动识别为整型,因为字符串中出现数字是完全合理的

Dynamic Templates

允许根据 es 自动识别的数据类型、字段名等来动态设定字段类型,可以实现如下效果

匹配规则一般有如下几个参数:

自定义 Mapping 的操作步骤如下:

  1. 写入一条文档到 es 的临时索引中,获取 es 自动生成的 mapping
  2. 修改步骤1得到的 mapping,自定义相关配置
  3. 使用步骤2的 mapping 创建实际所需索引

索引模板,英文为 Index Template,主要用于在新建索引时自动应用预先设定的配置,简化索引创建的操作步骤

Search API

实现对 es中存储的数据进行查询分析,endpoint 为_search,如下所示:

查询主要有两种形式

https://github.com/mobz/elasticsearch-head

https://github.com/medcl/elasticsearch-analysis-ik

常见问题

1、You are not authorized to access Ingest Manager. Ingest Manager requires superuser privileges.

此时使用默认超级用户 elastic进行登录

2、跨域配置

 

 

退出移动版