• ElasticSearch 基本概念 and 索引操作 and 文档操作 and 批量操作 and 结构化查询 and 过滤查询


    基本概念

    索引:
        类似于MySQL的表。索引的结构为全文搜索作准备,不存储原始的数据。
        索引可以做分布式。每一个索引有一个或者多个分片 shard。每一个分片可以有多个副本 replica。
    文档:
        类似与MySQL的一行记录。
    映射:
        所有文档写入索引之前,会进行分析, 分析将输入的文本进行分割为词条,分析哪些词条会被过滤。
    文档类型:
        每个文档都可以有不同的结构。
        不同的文档类不能为相同的属性设置不同的类型。
        【同一索引中所有文档类型中,一个title字段必须是相同的类型】
    

    索引操作

    添加索引

    创建不指定文档,文档类型的索引库
    PUT:127.0.0.1:9200/index_name
    
    {
        "settings": {
            "index": {
                "number_of_shards": "2",
                "number_of_replicas": "0"
            }
        }
    }
    
    创建指定文档,文档类型的索引库
    PUT:127.0.0.1:9200/test_stu
    
    {
        "settings": { 
            "index": {
                "number_of_shards": "2",
                "number_of_replicas": "0"
            }
        },
        "mappings": {
            "properties": {
                "name": {
                    "type": "text"
                },
                "age": {
                    "type": "integer"
                },
                "mail": {
                    "type": "keyword"
                },
                "hobby": {
                    "type": "text"
                }
            }
        }
    }
    

    查看映射

    GET:127.0.0.1:9200/test_stu/_mapping
    

    删除索引

    DELETE:127.0.0.1:9200/index_name
    

    文档操作

    添加文档

    POST:127.0.0.1:9200/{index_name}/{type_name}/{_id 非必需}
        
    # 指定数据的唯一标示符
    POST:127.0.0.1:9200/test/user/1001
    
    {
        "id": 1001,
        "name": "张三",
        "age": 10,
        "sex": "男"
    }
    
    # 不指定数据的唯一标示符
    POST:127.0.0.1:9200/test/user
    
    {
        "id": 1002,
        "name": "张五",
        "age": 11,
        "sex": "男"
    }
    

    删除文档

    DELETE:127.0.0.1:9200/{index_name}/{type_name}/{_id 非必需}
    说明:
    删除一个文档的时候不会立即从磁盘上移除,它只是被标记为已删除。
    Elasticsearch 将会在以后添加更多索引的时候才会在后台进行删除内容的清理。
    

    修改文档

    全局覆盖 
    在 Elasticsearch 中,文档数据是不能被修改的,但是可以通过指定唯一标示符的方式进行覆盖更新
    
    PUT:127.0.0.1:9200/test/user/1001
    
    {
      "id": 1010,
      "name": "张三",
      "age": 11,
      "sex": "男"
    }
      
    局部更新
    1、从旧文档中检索到JSON;2、修改;3、删除旧文档;4、索引新文档
    
    POST:127.0.0.1:9200/test/user/1001/_update
    
    {
        "doc":{
            "age": 100
        } 
    }
    

    查询文档

    查询文档

    根据ID搜索数据
    GET:127.0.0.1:9200/test/user/1001
    
    获取所有数据默认10条
    GET:127.0.0.1:9200/test/user/_search
    
    根据关键词搜索数据
    GET:127.0.0.1:9200/test/user/_search?q=age:100
    

    DSL搜索

    Elasticsearch 提供的丰富的灵活的查询语言叫做DSL查询【Query DSL】
    filter 过滤
    must 匹配 
    
    POST:127.0.0.1:9200/test/user/_search
    
    {
        "query": {
            "match": { 
                "age": 20
            }
        }
    }
    

    全文检索

    POST:127.0.0.1:9200/test/user/_search
    
    {
        "query": {
            "match": { 
                "name": "三 五"
            }
        }
    }
    

    高亮显示

    POST:127.0.0.1:9200/test/user/_search
    
    {
        "query": {
            "match": { 
                "name": "三 五"
            }
        },
        "highlight": {
            "fields": {
                "name": {}
            }
        }
    }  
    

    聚合操作

    类似SQL中的 group by 操作
    POST:127.0.0.1:9200/test/user/_search
    
    {
        "aggs": {
            "all_interests": {
                "terms": {
                    "field": "age"
                }    
            }
        }
    }
    

    判断文档是否存在

    HEAD:127.0.0.1:9200/test/user/1001
    存在:HTTP状态码为200
    不存在:HTTP状态码为404
    

    批量查询数据

    POST:127.0.0.1:9200/test/user/_mget
    
    {
        "ids": [ 1001, 1002  ]
    }
    

    批量添加数据

    POST:127.0.0.1:9200/test/user/_bulk
    注意:数据最后要有一个空行
    
    { "create": { "_index": "test","_type": "user","_id": 1010 }}
    { "id": 1010,"name": "1010","age": 10,"sex": "女" }
    { "create": { "_index": "test","_type": "user","_id": 1011 }}
    { "id": 1011,"name": "1011","age": 11,"sex": "女" }
    

    批量删除数据

    POST:127.0.0.1:9200/test/user/_bulk
    注意:数据最后要有一个空行
    
    { "delete": { "_index": "test","_type": "user","_id": 1010 }}
    { "delete": { "_index": "test","_type": "user","_id": 1011 }}
    

    分页

    和SQL中使用LIMIT关键词返回一页的结果一样。ELasticssearch接受from和size参数
    size:结果数;默认是10
    from:偏移量;默认是0
    
    如果每页显示5条数据,页码从1到3,那请求分别如下:
    GET:127.0.0.1:9200/test/user/_search?size=5
    GET:127.0.0.1:9200/test/user/_search?size=5&from=5
    GET:127.0.0.1:9200/test/user/_search?size=5&from=10
    

    数据类型

    自动判断 
    
    | JSON TYPE | Field type |
    | :- | :- |
    | Boolean:true or false | boolean |
    | 123 | long |
    | 123.45 | double |
    | 2014-09-15 | date |
    | "string" | string |
    
    Elasticsearch 中支持的类型
    
    | 类型 | 表示的数据类型 |
    | ---- | ---- |
    | string | string, text, keyword |
    | whole number | byte, short, integer, long |
    | floating point | float, double |
    | boolean | boolean |
    | date | date |
    
    5.x 开始,不支持string,由 text 和 keyword 类型代替。
    text 类型,当一个字段需要被全文搜索的时候,比如 Email内容,产品描述,应该使用 text类型。
    设置 text 类型之后,字段内容会被分析。
    text 类型的字段不用于排序,很少用于聚合。
    keyword 类型适用于索引结构优化的字段。比如 Email地址,主机名,状态等。
    keyword 类型的字段只能通过准确值搜索到。
    

    结构化查询 - term 精确查询

    主要用于精确匹配值。比如数字,日期,布尔值,或者不能进行分词的字符串
    例如:查询年龄为16的学生
    POST:127.0.0.1:9200/test_stu/_doc/_search
    
    {
        "query": {
            "term": {
                "age": 16
            }
        }
    }
    

    结构化查询 - terms 查询

    和 term 有点类似,但是 terms 允许指定多个匹配条件。
    如果某个字段指定了多个值,那么文档需要一起去做匹配;
    例如:查询年龄为16和15的学生
    POST:127.0.0.1:9200/test_stu/_doc/_search
    
    {
        "query": {
            "terms": {
                "age": [16,15]
            }
        }
    }
    

    结构化查询 - range 范围查询

    gt:大于
    gte:大于等于
    lt:小于
    let:小于等于
    
    例如:查询年龄在 15 到 22 之间的学生
    POST:127.0.0.1:9200/test_stu/_doc/_search
    
    {
        "query": {
            "range": {
                "age": {
                    "gte": 15,
                    "lte": 22
                }
            }
        }
    }
    

    结构化查询 - exists 查询

    exists 查询用于查找文档中是否包含指定字段。
    
    例如:查询文档中是否包含 title 字段
    POST:127.0.0.1:9200/test_stu/_doc/_search
    {
        "query": {
            "exists": {
                "field": "title"
            }
        }
    }
    

    结构化查询 - match 标准查询

    match 查询是一个标准查询,不管你是否需要全文检索还是精准查询都可以使用。
    
    例如:查询年龄为15岁的用户
    POST:127.0.0.1:9200/test_stu/_doc/_search
    {
        "query": {
            "match": {
                "age": 15
            }
        }
    }
    

    结构查询 - bool 查询

    bool 查询可以用来合并多个条件查询结果的布尔逻辑,包含以下逻辑:
    must 多个查询条件的完全匹配,相当于 and; 
        "must": {
            "match": { "hobby": "跑步" }
        }
    must_not 多个查询条件的相反匹配,相当于 not;
        "must_not": {
            "match": { "hobby": "跑步" }
        }
    should:至少有一个查询条件匹配,相当于 or;
        "should": {
            "match": { "hobby": "跑步" }
            "match": { "hobby": "爬山" }
        }
    
    例如:查询姓名中包含六且爱好不包含跑步的数据
    POST:127.0.0.1:9200/test_stu/_doc/_search
    {
        "query": {
            "bool": {
                "must": {
                    "match": {
                        "name": "六"
                    }
                },
                "must_not": {
                    "match": {
                        "hobby": "跑步"
                    }
                }
            }
        }
    }
    

    过滤查询 filter 查询

    例如:查询年龄为20的用户
    POST:127.0.0.1:9200/test_stu/_doc/_search
    {
        "query": {
            "bool": {
                "filter": {
                    "term": {
                        "age": 15
                    }
                }
            }
        }
    }
    

    查询和过滤对比:

    多虑语句会询问每个文档的字段值是否包含着特定值;
    查询语句会询问每一个文档的字段值与特定值的匹配程度如何;
    查询语句不仅要查找匹配的文档,还需要计算每个文档的相关性;
    所以一般来说查询语句要比过滤语句更耗时,并且查询结果也不可缓存。
    

    建议:

    做精确匹配搜索的时候,最好使用过滤语句,因为过滤语句可以缓存数据。

    添加报错

    1、添加数据出错
    报错: [FORBIDDEN/12/index read-only/allow delete (api)];
    原因: 这个索引是只读状态。
    解决: PUT:http://127.0.0.1:9200/索引名称/_settings
    {
        "index.blocks.read_only_allow_delete": false
    }
    
    2、创建索引报错
    报错: Root mapping definition has unsupported parameters
    原因: ElasticSearch 7.x 默认不在支持指定索引类型;默认索引类型是_doc
  • 相关阅读:
    织梦标签调用:根据特定需求调用文章的标签代码
    织梦DedeCMS信息发布员发布文章阅读权限不用审核自动开放亲测试通过!
    javascript中的this和e.target的深入研究
    vue-cli入门(二)——项目结构
    Mysql千万级大数据量查询优化
    MySQL大数据量分页查询方法及其优化
    Spring Bean的生命周期分析
    多线程下,两个线程交替打印0 -100,使用wait()和notify()
    ReentrantLock
    多线程交替打印ABC的多种实现方法
  • 原文地址:https://www.cnblogs.com/laowenBlog/p/13409969.html
Copyright © 2020-2023  润新知