Elasticsearch 是什么
ES全称ElasticSearch,是一个基于Lucene的搜索服务器。(其实就是对Lucene进行封装,提供了REST API的操作接口)
ElasticSearch作为一个高度可拓展的开源全文搜索和分析引擎,可用于快速的对大数据进行存储,搜索和分析。
ElasticSearch是基于Java开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。
根据DB-Engines排名显示,ElasticSearch是最受欢迎的企业级搜索引擎。
ElasticSearch和Logstash(数据收集、日志解析引擎)、Kibana(分析和可视化平台)一起开发的。这三个产品被设计成一个集成解决方案,称为“Elastic Stack”(以前被称为ELK技术栈)。
Elasticsearch 应用案例
- GitHub: 2013 年初,抛弃了 Solr,采取 Elasticsearch 来做 PB 级的搜索。 “GitHub 使用Elasticsearch 搜索 20TB 的数据,包括 13 亿文件和 1300 亿行代码”。
- 维基百科:启动以 Elasticsearch 为基础的核心搜索架构
- 百度:目前广泛使用 Elasticsearch 作为文本数据分析,采集百度所有服务器上的各类指标数据及用户自定义数据,通过对各种数据进行多维分析展示,辅助定位分析实例异常或业务层面异常。目前覆盖百度内部 20 多个业务线(包括云分析、网盟、预测、文库、直达号、钱包、 风控等),单集群最大 100 台机器, 200 个 ES 节点,每天导入 30TB+数据。
- 新浪:使用 Elasticsearch 分析处理 32 亿条实时日志。
- 阿里:使用 Elasticsearch 构建日志采集和分析体系。
- Stack Overflow:解决 Bug 问题的网站,全英文,编程人员交流的网站。
RESTful & JSON
REST 指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是 RESTful。 Web 应用程序最重要的 REST 原则是,客户端和服务器之间的交互在请求之间是无状态的。从客户端到服务器的每个请求都必须包含理解请求所必需的信息。如果服务器在请求之间的任何时间点重启,客户端不会得到通知。此外,无状态请求可以由任何可用服务器回答,这十分适合云计算之类的环境。客户端可以缓存数据以改进性能。
在服务器端,应用程序状态和功能可以分为各种资源。资源是一个有趣的概念实体,它向客户端公开。资源的例子有:应用程序对象、数据库记录、算法等等。每个资源都使用 URI(Universal Resource Identifier) 得到一个唯一的地址。所有资源都共享统一的接口,以便在客户端和服务器之间传输状态。使用的是标准的 HTTP 方法,比如 GET、 PUT、 POST 和DELETE。
在 REST 样式的 Web 服务中,每个资源都有一个地址。资源本身都是方法调用的目
标,方法列表对所有资源都是一样的。这些方法都是标准方法,包括 HTTP GET、 POST、PUT、 DELETE,还可能包括 HEAD 和 OPTIONS。简单的理解就是,如果想要访问互联网上的资源,就必须向资源所在的服务器发出请求,请求体中必须包含资源的网络路径, 以及对资源进行的操作(增删改查)。REST 样式的 Web 服务若有返回结果,大多数以JSON字符串形式返回。
ES基本语法
#索引操作 #查看索引 GET /_cat/indices?v #创建索引 PUT /products PUT /orders { "settings": { "number_of_shards": 1, "number_of_replicas": 0 } } #删除索引 DELETE /products #映射 #映射信息不允许删除和修改 #类型 : 字符串类型:keyword(适用于比较短的字符串如:关键字,关键词) text(一段字符串如:文本) # 数字类型: integer long # 小数类型: float double # 布尔类型: boolean # 日期类型:date #没办法直接创建映射,只可以在创建索引的时候创建映射 #创建商品索引,指定mapping{id,title,price,created_at,description} PUT /products { "settings": { "number_of_shards": 1, "number_of_replicas": 0 }, "mappings": { "properties": { "id":{ "type": "integer" }, "title":{ "type": "keyword" }, "price":{ "type": "double" }, "created_at":{ "type": "date", "format": "yyyy-MM-dd" }, "description":{ "type": "text" } } } } #查看某个索引的映射信息 GET /products/_mapping #添加文档 手动指定 _id POST /products/_doc/1 { "id":1, "title":"小浣熊", "price":0.5, "created_at":"2022-11-12", "description":"小浣熊真好吃" } #添加文档 自动生成文档id POST /products/_doc/ { "title":"日本豆", "price":1.5, "created_at":"2022-11-18", "description":"日本豆真好吃" } # 文档查询操作 基于id查询 dqwGOIQBxCqpDl5LBOGG GET /products/_doc/4 #删除文档 基于id删除 DELETE /products/_doc/dqwGOIQBxCqpDl5LBOGG #更新文档 删除原始文档,然后重新添加 PUT /products/_doc/1 { "id":1, "title":"小浣熊熊", "price":0.5, "created_at":"2022-11-12", "description":"小浣熊真好吃,真好吃!" } #更新文档 基于指定的字段进行更新 POST /products/_doc/1/_update { "doc":{ "title":"小浣熊熊熊" } } #文档批量操作 添加 POST /products/_doc/_bulk {"index":{"_id":2}} {"id":2,"title":"北京烤鸭","price":8888.8,"created_at":"2022-11-12","description":"北京烤鸭真好吃,真好吃!"} {"index":{"_id":3}} {"id":2,"title":"南京板鸭","price":8888.8,"created_at":"2022-11-11","description":"南京板鸭真好吃,真好吃!"} #文档批量操作 更新 删除 POST /products/_doc/_bulk {"index":{"_id":16}} {"id":16,"title":"mick","price":9999.9,"created_at":"2022-11-12","description":"good mick!"} {"update":{"_id":3}} {"doc":{"title":"南京板鸭2号"}} {"delete":{"_id":2}} #=====================================================高级查询===================================================================== #query DSL 语法 查询所有 match_all GET /products/_doc/_search { "query":{ "match_all":{} } } #查询所有 GET /products/_search { "query":{ "match_all": {} } } #trem 基于关键词查询 # keyword类型不分词 日后搜索使用 全部内容搜索 #text类型在es里是进行分词处理的 默认是es的标准分词器(中文是单字分词,英文是单词分词) #integer类型不分词 #double类型不分词 #date类型不分词 #总结:在es中除了text类型分词,其余类型均不分词 , 在es中默认使用的是标准分词器 GET /products/_search { "query": { "term": { "description": { "value": "good mick" } } } } #范围查询 range GET /products/_search { "query": { "range": { "price": { "gte": 0.5, "lte": 5 } } } } #前缀查询 prefix 精准查询 GET /products/_search { "query": { "prefix": { "description": { "value": "good" } } } } #通配符查询 wildcard ?代表一个字符 *代表多个字符 GET /products/_search { "query": { "wildcard": { "description": { "value": "go*" } } } } #多id查询 GET /products/_search { "query": { "ids": { "values": [1,15] } } } #模糊查询 fuzzy 最大模糊错误 必须在0-2之间 #搜索关键词长度为2不允许存在模糊 查询 #搜索关键词长度为3-5允许一次模糊查询 #搜索关键词长度大于5允许最大2模糊 GET /products/_search { "query": { "fuzzy": { "title": "小浣猫" } } } #布尔查询 #bool关键字 用来组合多个条件实现符合查询 #must相当于&&同时成立 #should相当于||有一个成立就行 #must_not相当于!不能满足任何一个 GET /products/_search { "query": { "bool": { "must": [ { "ids": { "values": [1] } },{ "term": { "title": { "value": "小浣熊熊熊" } } } ] } } } #多字段查询 multi_match # query 输入关键词 输入一段文本 #注意:字段类型分词,将查询条件分词之后进行查询改字段 如果改字段不分词就会将查询条件作为整体查询 GET /products/_search { "query": { "multi_match": { "query": "小浣熊熊熊", "fields": ["title","description"] } } } #默认字段分词查询 GET /products/_search { "query": { "query_string": { "default_field": "description", "query": "熊熊真可爱" } }, "highlight": { "fields": { "*":{} } }, "from": 3, "size": 3 }