ElasticSearch 学习-笔记

末鹿安然 提交于 2020-03-21 16:39:09

3 月,跳不动了?>>>

Lucene 工作原理

  • 处理文本的最高效做法就是:正则匹配。

ElasticSearch 中的基本概念

  • 索引: 含有相同属性的文档集合。
  • 类型:索引可以定义一个或多个类型,文档必须属于一个类型。
  • 文档:文档是可以被索引的基本数据单元。
  • 分片:每个索引都有多个分片,每个分片是一个Lucene 索引。
  • 备份:拷贝一份分片就完成了分片的备份。

ElasticSearch API 命名风格

  • API 基本格式: http://<ip>:<port>/<索引>/<类型>/<文档ID>
  • 常用的HTTP 动词:GET/PUT/POST/DELETE

关系型数据库和ElasticSearch 操作姿势对比

ElasticSearch 基本操作

  • 创建索引
    • 方式一:创建非结构化的索引(如下图所示)。
    • 方式二:创建结构化的索引,输入book/novel/_mappings(如下图所示),
    • 方式三:可以在Postman 中选择PUT 方法,输入localhost:9200/people,然后在raw 中编辑一下json 信息(如下图):
    • 输入的json 内容如下:
      •     {
                    "settings":{
                    "number_of_shards":3,
                            "number_of_replicas":1
                },
                    "mappings":{
                    "man":{
                        "properties":{
                            "name":{ "type":"text" },
                            "conutry":{ "type":"keyword" },
                            "age":{ "type":"integer" },
                            "date":{
                                "type":"date",
                                        "format":"yyyy-MM-dd HH:mm:ss ||yyyy-MM-dd||epoch_millis"
                            }
                        }
                    },
                    "woman":{}
                }
            }

         

  • 插入数据
    • 方式一:指定文档ID 插入,在Postman 中使用PUT 方法,输入localhost:9200/people/man/1,在raw 区域输入:
      •     {
                "name":"Tom",
                    "country":"China",
                    "age":18,
                    "date":"2000-10-11"
            }

         

      • 执行结果:
    • 方式二:自动生成文档ID 插入,在Postman 中使用POST 方法,输入localhost:9200/people/man,在raw 区域输入:
      •     {
                "name":"Tom老师",
                    "country":"China",
                    "age":88,
                    "date":"2000-10-11"
            }
      • 执行结果如下:
  • 修改文档
    • 方式一:直接修改文档,打开Postmain,选择POST 方法,输入localhost:9200/people/man/1/_update,运行结果如下:
    • 方式二:通过脚本修改文档,在raw 区输入以下内容:
      • 所有年龄增加一岁。
        •     {
                  "script":{
                  "lang":"painless",
                          "inline":"ctx._source.age += 1",
                  }
              }

           

      • 或者输入:修改年龄为30 岁。
        •    {
                      "script":{
                      "lang":"painless",
                              "inline":"ctx._source.age = params.age",
                              "params":{
                          "age":30
                      }
                  }
              }

           

  • 删除文档
    • 删除文档:打开Postman,选择DELETE 方法,输入localhost:9200/people/man/1,执行结果如下:
    • 删除索引,打开Postman 输入localhost:9200/people,执行结果如下:
  • 查询语法
    • 全表查询:在Postman 中选择GET 方法,输入localhost:9200/book/_search 得到以下结果:
    • 条件查询:在Postman 中选择GET 方法,输入localhost:9200/book/_search,然后在raw 区域中编辑如下内容:
      • 查询书籍中包含老师关键字,且按年龄降序排序。
      •     {
                "query":{
                "match":{
                    "name":"老师"
                }
            },
                "sort":[
                   {"age":{"order":"desc"}}
                 ]
            }

         

    • 聚合查询:在Postman 中选择GET 方法,输入localhost:9200/book/_search,然后在raw 区域中编辑如下内容:
      • 根据国家和名称进行分组
    • 聚合统计:在Postman 中选择GET 方法,输入localhost:9200/book/_search,然后在raw 区域中编辑如下内容:
      • 根据年龄的字数进行聚合统计。
        • {
          	"aggs":{
          		"grades_age":{
          			"stats":{ "field":"age" }
          		}
          	}
          }

解决聚合分组没效果::

  • people是index、man是类型、country是你需要设置的text字段    

ElasticSearch 高级查询

  • query 条件:
    • 方式一:模糊匹配,在Postman 中选择GET 方法,输入localhost:9200/people/_search,然后在raw 区域中编辑如下内容:
      • 注意这里的匹配,你随便输,他自己会切词
        •     {
                  "query":{
                      "match":{
                          "name":"Tom小"
                      }
                  }
              }
    • 方式二:习语匹配查询name中包含”小小”
      •    {
                "query":{
                    "match_phrase":{
                        "name":"小小"
                    }
                }
            }

         

    • 方式三:多字段匹配查询name和country中都包含”Tom”
      •     {
                "query":{
                    "multi_match":{
                        "query":"Tom",
                                "fields":["name","country"]
                    }
                }
            }
    • 方式三:Query 语法查询查询name和country中同时包含XXX和YYY,或者包含ZZZ。
      •     {
                "query":{
                    "query_string":{
                        "query":"(小 AND USA) OR china",
                                "fields":["name","country"]
                    }
                }
            }
    • 方式四:结构化数据查询
      • 查询字数在87到90之间的数据
        •     {
                  "query":{
                      "range":{
                          "age":{
                              "gt":87,
                                      "lte":90
                          }
                      }
                  }
              }
    • 查询2000-10-12 至今 的数据
      •     {
                "query":{
                    "range":{
                        "date":{
                            "gt":"2000-10-12",
                            "lte":"now"
                        }
                    }
                }
            }
    • filter 条件:
      • {
                "query":{
                    "bool":{
                        "filter":{
                            "term":{
                                "age":98
                            }
                        }
                    }
                }
            }
    • 复合查询
      • {
                "query":{
                    "bool":{
                        "must":[
                            {
                                "match":{
                                "name":"老师"
                                }
                            },
                            {
                                "match":{
                                "country":"China"
                                }
                            }
                        ],
                        "filter":{
                            "term":{
                                "age":88
                            }
                        }
                    }
                }
            }
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!