倒排索引
倒排索引是单词文档矩阵的一种存储形式
分词系统将文档切分成单词序列
单词文档矩阵 = 单词词典 + 倒排文件
单词词典:所有单词的集合,包括单词本身的信息和指向倒排列表的指针
倒排文件:所有单词的倒排列表顺序地存储在磁盘里形成的文件
倒排列表最简单的形式仅记录包含某个单词的文档编号(DocID),复杂一些的,还记录了单词在某个文档出现的次数,即单词频率(TF),还可能包含某个单词的文档数,即文档频率(DF),和单词在文档中的位置(Pos)
ES操作记录
版本:7.5
创建索引(同时创建映射)
1 | curl -XPUT http://localhost:9200/book -H "Content-Type: application/json" -d '{ |
7.0之后的版本没有type的概念(见Removal of mapping types)。如果需要迁移包含多个type的旧索引到新版本ES里,可以创建多个index分别对应一个type,或者只创建一个index并增加type字段,然后使用reindex迁移文档。
用PUT还是POST?
操作具体的资源用PUT,操作集合资源用POST,POST非幂等性。
_settings需用PUT不能用POST
_search不能用PUT
查看映射
1 | [root@localhost es_api_test]# curl -s -XGET http://localhost:9200/book/_mapping |jq |
创建一个文档、查看
1 | PUT /user/_doc/1 |
1 | # curl创建 |
1 | { |
更新一个文档
1 | PUT /user/_doc/1 |
乐观更新
1 | PUT /user/_doc/1?version=7 |
报错如下:
1 | { |
version不能用于乐观并发更新。改用seq_no和primary_term如下:
1 | GET /user/_doc/1 # 查看当前seq_no, primary_term |
批量创建文档
1 | [root@localhost es_api_test]# cat songs.bulk |
1 | curl -s -H "Content-Type: application/x-ndjson" -XPOST localhost:9200/_bulk --data-binary "@songs.bulk" #是--data-binary,不是-d,否则提示parse_exception |
查看索引
1 | [root@localhost es_api_test]# curl http://localhost:9200/_cat/indices?v |
查看集群健康状态
1 | [root@localhost es_api_test]# curl http://localhost:9200/_cluster/health?pretty |
查看分片
1 | [root@localhost es_api_test]# curl http://localhost:9200/_cat/shards/songs?v |
查看文档数
1 | [root@localhost es_api_test]# curl http://localhost:9200/songs/_count?pretty |
基数聚合
1 | POST /songs/_search |
报错信息如下:
1 | { |
解决方法:
- 改name为name.keyword
- 设置fileddata=true
1 | POST /songs/_mapping |
获取索引前50个文档
1 | GET|POST /songs/_search?size=50 |
用GET还是POST?
有点奇怪,GET也可以带请求体,ES官网的search语法示例都是GET。
GET请求是是依靠URI检索数据的,RFC没有规定不能有响应体,只是说GET通过URI标识并获取了一个资源,且再次获取不会重新请求,可以减少网络负担。
1 | [root@localhost ~]# curl -s -XPOST localhost:9200/songs/_search?size=50 -H 'Content-Type: application/json' -d '{"query": {"match_all": {}}}' 2>/dev/null |jq |
生成jsonp
1 | [root@localhost ~]# curl -s -XPOST localhost:9200/songs/_doc/_search?size=50 -H 'Content-Type: application/json' -d '{"query": {"match_all": {}}}' 2>/dev/null |jq |awk 'BEGIN{flag=0}{if($0~/"_source":/){print "{"; flag=1}else if(flag){print $0;} if($0~/^\s*}$/){flag=0}}' |sed 's/\s*}/},/g;' |sed '1 s/^{/{"data": [{/' |sed '$ s/,$/]}/' |jq |sed '1 i callBack(' |sed '$ s/$/);/' |