# Elastic Search ## 倒排索引 ES为文档型数据库,重要用于全文检索数据。ES通过倒排索引来加速全文检索。 ## 索引基础操作 ### 索引创建 若要创建自定义索引,可向ES服务器发送`PUT`请求。 ``` PUT http://${url}:${port}/${ind_name} ``` PUT请求具有幂等性,如果对相同名称索引进行重复创建,那么第二次创建索引时请求会失败,提示待创建索引已经存在。 ### 索引查询 如果想要查询已经创建的索引信息,可以向ES发送`GET`请求。 ``` GET http://${url}:${port}/${ind_name} ``` ### 查看所有索引 ``` GET http://${url}:${port}/_cat/indices?v ``` ### 删除索引 如果想要删除已经存在的索引,可以向ES发送`DELETE`请求。 ``` DELETE http://${url}:${port}/${ind_name} ``` ### 向索引中添加数据 可以通过向ES发送`POST`请求来向索引中添加文档内容,其中待添加数据为JSON格式 ``` POST http://${url}:${port}/${ind_name}/_doc ==========JSON CONTENT BODY============= ``` 向索引中添加内容是非幂等的,一个索引中可以包含多条数据。 ### 查询索引中所有的数据 ``` GET http://${url}:${port}/${ind_name}/_search ``` ### 修改索引中指定文档的内容 如果要对索引中的文档内容进行修改,有两种修改的方式: - 覆盖性修改,用新内容覆盖旧内容 - 局部修改,只针对原JSON格式数据中的部分内容进行修改 #### 覆盖性修改 如果要对索引中的文档进行覆盖性修改,可以向ES发送`PUT`请求: ``` PUT http://${url}:${port}/${ind_name}/_doc/${doc_id} ==========JSON CONTENT BODY============= ``` #### 局部数据更新 如果要对索引中的文档内容进行部分更新,可以向ES发送`POST`请求: ``` POST http://${url}:${port}/${ind_name}/_update/${doc_id} ==========JSON CONTENT BODY============= ``` ### 对索引中的文档内容进行删除 ``` DELETE http://${url}:${port}/${ind_name}/_doc/${doc_id} ``` ### 索引内容条件查询 通过GET请求进行索引中文档的条件查询 ``` GET http://${url}:${port}/${ind_name}/_search?q=${doc_field_name}:${doc_field_val} ``` 通过POST请求进行索引中文档的条件查询 ``` POST http://${url}:${port}/${ind_name}/_search { "query":{ "match":{ "category":"sword" } } } ``` 查询索引中所有的文档 ``` POST http://${url}:${port}/${ind_name}/_search { "query":{ "match_all":{ } } } ``` ### 索引内容分页查询 ``` POST http://${url}:${port}/${ind_name}/_search { "query":{ "match_all":{ }, "from":0, // 查询偏移量,从0开始 "size":10 // 查询条数 } } ``` ### 索引中只查询文档的特定字段 如下示例只查询了文档中title和category字段的内容 ``` POST http://${url}:${port}/${ind_name}/_search { "query":{ "match_all":{ }, "from":0, // 查询偏移量,从0开始 "size":10, // 查询条数 "_source":[ "title", "category" ] } } ``` ### 索引查询后对查询结果排序 ``` POST http://${url}:${port}/${ind_name}/_search { "query":{ "match_all":{ }, "from":0, // 查询偏移量,从0开始 "size":10, // 查询条数 "_source":[ "title", "category" ], "sort":{ "price":{ "order":"desc" } } } } ``` ### 多个查询条件进行组合 #### and ``` POST http://${url}:${port}/${ind_name}/_search { "query":{ "bool":{ "must":[ { "match":{ "category":"sword" } }, { "match":{ "price":100 } } ] } } } ``` #### or ``` POST http://${url}:${port}/${ind_name}/_search { "query":{ "bool":{ "should":[ { "match":{ "category":"sword" } }, { "match":{ "price":100 } } ] } } } ``` ### 索引范围查询 ``` POST http://${url}:${port}/${ind_name}/_search { "query":{ "bool":{ "should":[ { "match":{ "category":"sword" } }, { "match":{ "price":100 } } ], "filter":{ "range":{ "price":{ "gt":1000 } } } } } } ``` ### 索引分组查询 ``` POST http://${url}:${port}/${ind_name}/_search { "aggs":{ ${group_name}:{ "terms":{ "field":"price" } } }, "size":0 // 只展示聚合后的结果,不展示原始数据 } ``` ### 统计求平均值 ``` POST http://${url}:${port}/${ind_name}/_search { "aggs":{ ${group_name}:{ "avg":{ "field":"price" } } }, "size":0 // 只展示统计后的结果,不展示原始数据 } ``` ### 索引字段配置 可以通过如下方式来配置索引信息 ``` POST http://${url}:${port}/${ind_name}/_mapping { "properties":{ ${field_1}:{ "type":"text", // 该字段内容可被分词 "index":true // 该字段内容可被索引 }, ${field_2}:{ "type":"keyword", // 该字段内容不可被分词 "index":true // 该字段内容可被索引 }, ${field_3}:{ "type":"keyword", // 该字段内容不可被分词 "index":false // 该字段内容不可被索引,在索引查询时将该字段设置为查询条件会报错 } } } ```