💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
**这篇是前几年的笔记, 有些在7.x用不了了** https://www.elastic.co/guide/en/elasticsearch/reference/current/removal-of-types.html **从6.x开始每个索引只能使用一个类型(type), 并且未来将去掉类型(type) 6.x 很多地方要加 _doc** 1. 索引 1.1 添加索引 PUT product 返回 { "acknowledged": true, "shards_acknowledged": true, "index": "product" } 1.2 创建 mapping 映射 ES中创建一个mapping映射类似于在数据库中定义表结构,即表里面有哪些字段、字段是什么类型、字段的默认值等;也类似于solr里面的模式schema的定义 未创建索引的情况下 "type" : "text", 表示是文本类型, 会被分词 "type" : "keyword", 和text 类似, 但不会被分词, 值将作为一个整体 "index": false 表示不会被查询 PUT product { "mappings" : { "properties" : { "name" : { "type" : "text", "index": true }, "desc": { "type" : "text" }, "price" : { "type" : "keyword", "index": true }, "producer": { "type" : "text" }, "ssss": { "type" : "text", "index": false } } } } 为已存在的索引创建或创建mappings 目前6.x 不使用_doc 会报错 "reason": "Validation Failed: 1: mapping type is missing;" POST /product/_doc/_mapping { "properties": { "name": { "type": "text", "index": true } } } GET     /hp_goods/_doc/_search // null_value 是加默认值 PUT  /hp_goods/_doc/_mapping {   "properties": {     "isDel": {       "type": "integer",       "null_value": 0     }   } } 1.3 mapping 增加数据 值一旦创建, 无法修改, 只能添加新值 如 tag 已经有了, 则无法修改其内容, 只能新增tags POST /product/_doc/_mapping { "properties": { "tags": { "type": "text" } } } 或者 POST /product { "mappings": { "properties": { "tags": { "type": "text" } } } } 1.4 迁移数据 properties 里的具体值 一旦新建则无法修改 如果必须修改则要重建索引 需要新建 index 索引, 把之前的index 数据迁移到新的索引 获取当前 index 的结构 GET /product/_mapping 新建新的索引, 结构从上面复制进行修改 POST /newproduct { "mappings": { "properties": { "tags": { "type": "text" } } } } 迁移 1.5 删除索引 DELETE product 2 文档 2.1 添加文档 PUT /product/_doc/1 { "name" : "gaolujie yagao", "desc" : "gaoxiao meibai", "price" : 30, "producer": "gaolujie producer", "tags": [ "meibai", "fangzhu" ] } 2.2 删除文档 DELETE /product/_doc/1 2.3 修改文档 局部修改 POST 方式 id后面跟着 /_update, 里面使用 doc 包裹数据 POST /product/_doc/1/_update { "doc": { "price" : 50 } } // 7.4 版本, 现在是这样修改 POST /product/_update/1 { "doc": { "price": 50 } } 全量修改 和添加时的代码结构是一样的, 如果数据和添加时的数据不一样, 不同的部门会删除掉 "price" : 30, 在这里就被删除了 PUT /product/_doc/1 { "name" : "gaolujie yagao", "desc" : "gaoxiao meibai", "producer": "gaolujie producer", "tags": [ "meibai", "fangzhu" ] } 每次修改后,version会更改, 同一个文档连续多次删除, version也会累加 2.4 简单查询 2.4.1 查询全部 GET /product/_doc/_search hits 查询到的数据信息 _score 是数据的匹配度 _source 是返回的数据的哪些字段, 默认全部(类似数据库的 * ) { "took": 3, "timed_out": false, "_shards": { "total": 5, "successful": 5, "skipped": 0, "failed": 0 }, "hits": { "total": 2, "max_score": 1, "hits": [ { "_index": "product", "_type": "_doc", "_id": "2", "_score": 1, "_source": { "name": "gaolujie yagao", "desc": "gaoxiao meibai", "price": 30, "producer": "gaolujie producer", "tags": [ "meibai", "fangzhu" ] } }, { "_index": "product", "_type": "_doc", "_id": "1", "_score": 1, "_source": { "name": "gaolujie yagao", "desc": "gaoxiao meibai", "price": 50, "producer": "gaolujie producer", "tags": [ "meibai", "fangzhu" ] } } ] } } 2.4.2 判断数据是否存在 不存在返回404状态码 HEAD /product/_doc/11 存在返回200状态码 HEAD /product/_doc/1 2.4.3 定制返回的字段(_source) 多个用 , 逗号隔开 返回的_source结果只会有name,desc GET /product/_doc/_search?_source=name,desc 3. 乐观锁并发控制 6.7 以前 使用version , 以后用 if_seq_no=2&if_primary_term=1 当给一个新增加的数据做更新操作时, 第一次更新可以完成, 因为version=1是当前版本号, 当第二次更新时, 由于版本号传还是1, 但是实际最新的已经是2了, 会报版本冲突错误. 改为最新的才会成功. 用于解决并发问题, 俩个客户端, 都传version=1, 当一个修改成功后, version为2了, 另一个就会更新失败 高版本es 把 version 换为 if_seq_no和if_primary_term POST /product/_doc/1/_update?version=1 { "doc": { "price" : 51 } } 对于if_primary_term记录的就是具体的哪个主分片, 而if_seq_no这个参数起的作用和旧版本中的_version是一样的 4. DSL 查询 4.1 term查询 term 不会把查询条件进行分词后查询, 作为一整个关键词去搜索 POST /shop/_doc/_search { "query":{ "term":{ "desc":"中国" } } } 4.2 查询表达式分词搜索 是条件分词查询, 先把查询条件进行分词后查询 term 换成 match, 条件被分词了, 查询结果变了 POST /shop/_doc/_search { "query":{ "match":{ "desc":"中国" } } } 4.3 多个词语匹配检索 相当于是tag标签查询, 所有带数组里其中一个词语的数据, 就会被查询到 POST /shop/_doc/_search { "query":{ "terms":{ "desc": ["中国", "学生"] } } } 4.4 短语搜索 match_phrase的分词结果必须在text字段分词中都包含,而且顺序必须相同,而且必须且都是连续的 POST /shop/_doc/_search { "query" : { "match_phrase" : { "desc" : "导游坐飞机去海外旅游" } } } 4.5 查询全部 match_all POST /shop/_doc/_search { "query": { "match_all": {} }, "_source": ["id", "nickname", "age"] } 4.6 使用过滤器的模糊查询 gte >= gt > lte <= lt < POST /shop/_doc/_search { "query" : { "bool": { "must": { "match" : { "nickname" : "飞翔" } }, "filter": { "range" : { "age" : { "gt" : 19 } } } } } } 4.7 分页查询 from 起始查询索引 size 每次返回数量 POST /shop/_doc/_search { "query": { "match_all": {} }, "_source": [ "id", "nickname", "age" ], "from": 2, "size": 10, "sort": ["age"] } 4.8 match(operator) "operator": or:搜索内容分词后,只要存在一个词语匹配就展示结果 and:搜索内容分词后,都要满足词语匹配 POST /shop/_doc/_search { "query" : { "match" : { "desc" : { "query": "学习慕课网", "operator": "or" } } } } minimum_should_match: 最低匹配精度,至少有[分词后的词语个数]x百分百,得出一个数据值取整。举个例子:当前属性设置为70,若一个用户查询检索内容分词后有10个词语,那么匹配度按照 10x70%=7,则desc中至少需要有7个词语匹配,就展示;若分词后有8个,则 8x70%=5.6,则desc中至少需要有5个词语匹配,就展示。 minimum_should_match 也能设置具体的数字,表示个数 POST /shop/_doc/_search { "query": { "match": { "desc": { "query": "女友生日送我好玩的xbox游戏机", "minimum_should_match": "60%" } } } } 4.9 ids查询 POST /shop/_doc/_search { "query": { "ids": { "type": "_doc", "values": ["1001", "1010", "1008"] } } } 4.10 multi_match 满足使用match在多个字段中进行查询的需求 POST /shop/_doc/_search { "query" : { "multi_match" : { "query": "慕课网", "fields": [ "desc", "nickname" ] } } } 4.11 boost 权重, 为某个字段设置权重,权重越高,文档相关性得分就越高。通畅来说搜索商品名称要比商品简介的权重更高。 POST /shop/_doc/_search { "query": { "multi_match": { "query": "皮特帕克慕课网", "fields": ["desc", "nickname^10"] } } } nickname^10 代表搜索提升10倍相关性,也就是说用户搜索的时候其实以这个nickname为主,desc为辅,nickname的匹配相关度当然要提高权重比例了。