1. 基础概念
1.1 倒排索引原理
倒排索引原理举例.png 倒排索引原理.png1.2 倒排索引构成
- 单词词典,使用 BTree 记录所有文档的单词,记录单词到倒排列表之间的关联信息。
- 倒排索引项(Posting)。
|术语|概念|
|------|------|
|文档 Id|用于获取原始信息|
|单词频率|记录该单词在该文档中出现的次数,用户后续相关性分析|
|位置|记录单词在文档中的分词位置,用于做词语检索。|
|偏移(Offset)|记录单词在文档的开始和结束为止,用于高亮显示。|
对每个属性建立倒排索引。 - 分词
分词是指将文本转换为一系列单词(term or token)的过程,也可以叫文本分析,在 es 中称为 Analysis。 -
分词器
分词器是 es 中专门处理分词的组件,英文名为 Analyzer,它的组成如下:
Character Filters:针对原始文本进行处理,比如去除 html 特殊标识符等。
Tokenizer:将原始文本按照一定规则切分成单词。
Token Filters:针对 Tokenizer 处理的单词进行再加工,比如转小写,删除新增等处理。
屏幕快照 2019-01-10 上午9.38.10.png
屏幕快照 2019-01-10 上午9.41.56.png
1.2 关键词解释
名称 | 定义 |
---|---|
索引 | 含有相同属性的文档集合,类似于数据库。 |
类型 | 索引可以定义一个或多个类型,文档必须属于一个类型,类似于表。 |
文档 | 可以被索引的基本数据单位,类似于记录。 |
分片 | 每个索引有多个分片,每个分片是一个 Lucene 索引。 |
副本 | 拷贝一个分片就形成该分片的一个副本。 |
Mapping | 类似于数据库中的表结构定义,主要作用如下:(1)定义 Index 下的字段名(Field Name);(2)定义 字段的类型,比如数值型、字符串型、布尔型等;(3)定义倒排索引相关的配置,比如是否索引、记录 position 等。 |
2. Rest API
以下 API 基于 ES7。
2.1 Mapping 设置
创建索引:分片数为3,副本数位1的索引,该索引中包含一个 man 类型和一个 woman 类型,其中 man 类型包括 "name"、"country"、"age"和"date"属性。
PUT /people
{
"settings":{
"number_of_shards":3,
"number_of_replicas":1
},
"mappings":{
"properties":{
"name":{
"type":"text"
},
"country":{
"type":"keyword"
},
"age":{
"type":"integer"
},
"birthday":{
"type":"date",
"format":"yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
}
}
}
}
2.2 增加文档
指定文档 id
PUT /people/_doc/1
{
"name":"wlj",
"country":"china",
"age":"24",
"birthday":"1994-06-01"
}
不指定文档 id
POST /people/_doc
{
"name":"wlj1",
"country":"china",
"age":"24",
"birthday":"1994-06-01"
}
2.3 修改文档
将 id 为 1 的文档 name 属性改为 "wlj1"
POST /people/_doc/1/_update
{
"doc":{
"name":"wlj1"
}
}
2.4 Search API
2.4.1 全量查询
GET /people/_search
全量查询,返回第一条。
POST /people/_search
{
"query":{
"match_all":{}
},
"from":1,
"size":1
}
URL | 功能 |
---|---|
/_search | 查询所有的索引。 |
/my_index/_search | 查询单个索引。 |
/my_index1,my_index2/_search | 查询多个索引。 |
/my_*/_search | 使用通配符查询多个索引。 |
2.4.2 主键查询
GET /people/_doc/1
2.4.3 全文检索
match_phrase 和 match 的区别:关键词出现顺序一致,使用 slop 设置差异度。
POST /people/_doc/_search
{
"query":{
"match":{
"name":"wlj1"
}
},
"sort":[
{"birthday":{"order":"desc"}}
]
}
2.4.6 复合查询
should
must
must_not
2.4.7 聚合查询
按 "publish_date" 聚合计数
POST /people/_doc/_search
{
"query":{
"match":{
"country":"china"
}
},
"aggs":{
"group_by_birthday":{
"terms":{
"field":"birthday"
}
}
},
"sort":[
{"birthday":{"order":"desc"}}
]
}
查询 "publish_date" 的统计值
{
"aggs":{
"grades_publish_date":{
"stats":{
"field":"publish_date"
}
}
}
}
查询 "publish_date" 的最小值
{
"aggs":{
"grades_publish_date":{
"min":{
"field":"publish_date"
}
}
}
}
2.4.9 关键字
关键字 | 功能 |
---|---|
"profile":true | 显示查询过程。 |
explain | 显示相关性算分过程。 |
网友评论