文档的CRUD
命令 | 示例 |
---|---|
Index | PUT my_index/_doc/1 {"user":"mike", "comment":"You know,for search"} |
Create | PUT my_index/_create/1 {"user":"mike","comment":"You know, for search"} POST my_index/_doc (不指定ID, 自动生成) {"user":"mike", "comment":"You know, for search"} |
Read | GET my_index/_doc/1 |
Update | POST my_index/_update/1 {"doc":{"user":"mike", "comment":"You know, Elasticsearch"}} |
Delete | DELETE my_index/_doc/1 |
- Type名, 约定都用_doc
- Create: PUT方式指定ID( 如果ID已经存在,会失败),POST方式自动给生成ID
- Index: 如果ID不存在,创建新的文档,否则,先删除现有的文档,再创建新的文档,版本会增加
- Update: 文档必须已经存在,更新只会对相应字段做增量修
Bulk API
- 支持在一次API调用中,对不同的索引进行操作
- 支持四种类型操作
- Index
- Create
- Update
- Delete
- 可以在URI中指定Index,也可以在请求的Payload中进行
- 操作中单条操作失败,并不会影响其他操作
- 返回结果包括了每一条操作执行的结果
POST _bulk
{"index":{"_index":"test","_id":"1"}}
{"field1":"value1"}
{"delete":{"_index":"test","_id":"2"}}
{"create":{"_index":"test2","_id":"3"}}
{"field1":"value3"}
{"update":{"_id":"1","_index":"test"}}
{"doc":{"field2":"value2"}}
批量读取 - mget
批量操作,可以减少网络连接所产生的开销,提高性能
GET _mget
{
"docs":[
{
"_index" : "user",
"_id":1
},
{
"_index":"comment",
"_id":1
}]
}
批量查询 - msearch
POST users/_msearch
{}
{"query":{"match_all":{}}, "from":0,"size":10}
{}
{"query":{"match_all":{}}}
{"index":"twitter2"}
{"query":{"match_all":{}}}
常见错误返回
429:集群过于繁忙
4xx:请求体格式有错
500:集群内部错误
正排索引和倒排索引
正排
文档 | 文档内容 |
---|---|
1 | Mastering Elasticsearch |
2 | Elasticsearch Server |
3 | Elasticsearch Essentials |
倒排
Term | Count | DocumentID:Position |
---|---|---|
Elasticsearch | 3 | 1:1, 2:0, 3:0 |
Mastering | 1 | 1:0 |
Server | 1 | 2:1 |
Essentials | 1 | 3:1 |
-
倒排索引包含两个部分
- 单词词典(Term Dictionary),记录所有文档的单词,记录单词到倒排列表的关联关系
- 单词词典一般比较大,可以通过
B+树
或哈希拉链法
实现,以满足高性能的插入与查询
- 单词词典一般比较大,可以通过
- 倒排列表(Posting List)记录了单词对应的文档结合,由倒排索引项组成
- 倒排索引项:
- 文档 ID
- 词频TF - 该单词在文档中出现的次数,用于相关性评分
- 位置(Position) - 单词在文档中分词的位置。用于语句搜索(phrase query)
- 偏移(Offset) - 记录单词的开始结束位置,实现高亮显示
- 倒排索引项:
- 单词词典(Term Dictionary),记录所有文档的单词,记录单词到倒排列表的关联关系
例子 - Elasticsearch的文档和Posting List:
文档ID | 文档内容 |
---|---|
1 | Mastering Elasticsearch |
2 | Elasticsearch Server |
3 | Elasticsearch Essentials |
- Posting List
Doc ID | TF | Position | Offset |
---|---|---|---|
1 | 1 | 1 | <10,23> |
2 | 1 | 0 | <0,13> |
3 | 1 | 0 | <0,13> |
- Elasticsearch的JSON文档中的每个字段,都有自己的倒排索引
- 可以指定对某些字段不做索引
- 优点:节省存储空间
- 缺点: 字段无法被搜索
Analysis 与 Analyzer 分词器
- Analysis - 文本分析是把全文本转换一系列单词(term/token)的过程,也叫分词
- Analysis 是通过Analyzer来实现的
- 可使用Elasticsearch内置的分析器/或者按需定制化分析器
- 除了在数据写入时转换词条,匹配Query语句时候也需要用相同的分析器对查询语句进行分析
内容 | 分词后 |
---|---|
Elasticsearch Server | elasticsearch server |
Analyzer的组成
- 分词器是专门处理分词的组件,Analyzer由三部分组成
- Character Filters(针对原始文本处理,例如去除html) / Tokenizer(按照规则切分为单词)/ Token Filter(将切分的单词进行加工,小写,删除stopwords,增加同义词)
例如:Mastering Elasticsearch & Elasticsearch in Action
- Character Filters
- Tokenizer
- Token Filters
- 经过前三步骤:master elasticsearch action
Elasticsearch的内置分词器
- Standard Analyzer -- 默认分词器,按词切分,小写处理
- Simple Analyzer -- 按照非字母切分(符号被过滤),小写处理
- Stop Analyzer -- 小写处理,停用词过滤(the, a, is)
- Whitespace Analyzer -- 按照空格切分,不转小写
- Keyword Analyzer -- 不分词,直接将输入当作输出
- Patter Analyzer -- 正则表达式,默认\W+(非字符分隔)
- Language -- 提供了30多种常见语言的分词器
- Customer Analyzer 自定义分词器
* 使用_analyzer API
GET /_analyze
{
"analyzer":"standard",
"text":"A B, C D E",
}
POST books/_analyze
{
"field":"title",
"text":"Mastering Elasticsearch"
}
POST /_analyze
{
"tokenizer":"standard",
"filter":["lowercase"],
"text":"Mastering Elasticsearch"
}
中文分词
- ICU Analyzer
安装icu Elasticsearch-plugin install analysis-icu
提供了Unicode支持,更好的支持亚洲语言 - IK
支持自定义词库,支持热更新分词字典
https://github.com/medcl/elasticsearch-analysis-ik - THULAC
THU Lexucal Analyzer for Chinese,清华的大学自然语言处理和社会人文计算实验室的中文分词器
https://github.com/microbun/elasticsearch-thulac-plugin