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基本语法
1. #索引操作 2. #查看索引 3. GET /_cat/indices?v 4. 5. 6. #创建索引 7. PUT /products 8. 9. PUT /orders 10. { 11. "settings": { 12. "number_of_shards": 1, 13. "number_of_replicas": 0 14. } 15. } 16. 17. #删除索引 18. DELETE /products 19. 20. #映射 21. 22. #映射信息不允许删除和修改 23. 24. #类型 : 字符串类型:keyword(适用于比较短的字符串如:关键字,关键词) text(一段字符串如:文本) 25. # 数字类型: integer long 26. # 小数类型: float double 27. # 布尔类型: boolean 28. # 日期类型:date 29. 30. #没办法直接创建映射,只可以在创建索引的时候创建映射 31. 32. #创建商品索引,指定mapping{id,title,price,created_at,description} 33. PUT /products 34. { 35. "settings": { 36. "number_of_shards": 1, 37. "number_of_replicas": 0 38. }, 39. 40. "mappings": { 41. "properties": { 42. "id":{ 43. "type": "integer" 44. }, 45. "title":{ 46. "type": "keyword" 47. }, 48. "price":{ 49. "type": "double" 50. }, 51. "created_at":{ 52. "type": "date", 53. "format": "yyyy-MM-dd" 54. }, 55. "description":{ 56. "type": "text" 57. } 58. } 59. } 60. } 61. 62. #查看某个索引的映射信息 63. GET /products/_mapping 64. 65. 66. #添加文档 手动指定 _id 67. POST /products/_doc/1 68. { 69. "id":1, 70. "title":"小浣熊", 71. "price":0.5, 72. "created_at":"2022-11-12", 73. "description":"小浣熊真好吃" 74. } 75. 76. #添加文档 自动生成文档id 77. POST /products/_doc/ 78. { 79. "title":"日本豆", 80. "price":1.5, 81. "created_at":"2022-11-18", 82. "description":"日本豆真好吃" 83. } 84. 85. 86. # 文档查询操作 基于id查询 dqwGOIQBxCqpDl5LBOGG 87. GET /products/_doc/4 88. 89. #删除文档 基于id删除 90. DELETE /products/_doc/dqwGOIQBxCqpDl5LBOGG 91. 92. #更新文档 删除原始文档,然后重新添加 93. PUT /products/_doc/1 94. { 95. "id":1, 96. "title":"小浣熊熊", 97. "price":0.5, 98. "created_at":"2022-11-12", 99. "description":"小浣熊真好吃,真好吃!" 100. } 101. 102. #更新文档 基于指定的字段进行更新 103. POST /products/_doc/1/_update 104. { 105. "doc":{ 106. "title":"小浣熊熊熊" 107. } 108. } 109. 110. #文档批量操作 添加 111. POST /products/_doc/_bulk 112. {"index":{"_id":2}} 113. {"id":2,"title":"北京烤鸭","price":8888.8,"created_at":"2022-11-12","description":"北京烤鸭真好吃,真好吃!"} 114. {"index":{"_id":3}} 115. {"id":2,"title":"南京板鸭","price":8888.8,"created_at":"2022-11-11","description":"南京板鸭真好吃,真好吃!"} 116. 117. 118. #文档批量操作 更新 删除 119. 120. POST /products/_doc/_bulk 121. {"index":{"_id":16}} 122. {"id":16,"title":"mick","price":9999.9,"created_at":"2022-11-12","description":"good mick!"} 123. {"update":{"_id":3}} 124. {"doc":{"title":"南京板鸭2号"}} 125. {"delete":{"_id":2}} 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. #=====================================================高级查询===================================================================== 136. 137. 138. 139. #query DSL 语法 查询所有 match_all 140. GET /products/_doc/_search 141. { 142. "query":{ 143. "match_all":{} 144. } 145. } 146. 147. #查询所有 148. GET /products/_search 149. { 150. "query":{ 151. "match_all": {} 152. } 153. } 154. 155. 156. #trem 基于关键词查询 157. # keyword类型不分词 日后搜索使用 全部内容搜索 158. #text类型在es里是进行分词处理的 默认是es的标准分词器(中文是单字分词,英文是单词分词) 159. #integer类型不分词 160. #double类型不分词 161. #date类型不分词 162. #总结:在es中除了text类型分词,其余类型均不分词 , 在es中默认使用的是标准分词器 163. GET /products/_search 164. { 165. "query": { 166. "term": { 167. "description": { 168. "value": "good mick" 169. } 170. } 171. } 172. } 173. 174. #范围查询 range 175. GET /products/_search 176. { 177. "query": { 178. "range": { 179. "price": { 180. "gte": 0.5, 181. "lte": 5 182. } 183. } 184. } 185. } 186. 187. #前缀查询 prefix 精准查询 188. GET /products/_search 189. { 190. "query": { 191. "prefix": { 192. "description": { 193. "value": "good" 194. } 195. } 196. } 197. } 198. 199. 200. #通配符查询 wildcard ?代表一个字符 *代表多个字符 201. GET /products/_search 202. { 203. "query": { 204. "wildcard": { 205. "description": { 206. "value": "go*" 207. } 208. } 209. } 210. } 211. 212. #多id查询 213. GET /products/_search 214. { 215. "query": { 216. "ids": { 217. "values": [1,15] 218. } 219. } 220. } 221. 222. #模糊查询 fuzzy 最大模糊错误 必须在0-2之间 223. #搜索关键词长度为2不允许存在模糊 查询 224. #搜索关键词长度为3-5允许一次模糊查询 225. #搜索关键词长度大于5允许最大2模糊 226. GET /products/_search 227. { 228. "query": { 229. "fuzzy": { 230. "title": "小浣猫" 231. } 232. } 233. } 234. 235. 236. #布尔查询 237. #bool关键字 用来组合多个条件实现符合查询 238. #must相当于&&同时成立 239. #should相当于||有一个成立就行 240. #must_not相当于!不能满足任何一个 241. GET /products/_search 242. { 243. "query": { 244. "bool": { 245. "must": [ 246. { 247. "ids": { 248. "values": [1] 249. } 250. },{ 251. "term": { 252. "title": { 253. "value": "小浣熊熊熊" 254. } 255. } 256. } 257. ] 258. } 259. } 260. } 261. 262. 263. #多字段查询 multi_match 264. # query 输入关键词 输入一段文本 265. #注意:字段类型分词,将查询条件分词之后进行查询改字段 如果改字段不分词就会将查询条件作为整体查询 266. GET /products/_search 267. { 268. "query": { 269. "multi_match": { 270. "query": "小浣熊熊熊", 271. "fields": ["title","description"] 272. } 273. } 274. } 275. 276. 277. #默认字段分词查询 278. GET /products/_search 279. { 280. "query": { 281. "query_string": { 282. "default_field": "description", 283. "query": "熊熊真可爱" 284. } 285. }, 286. "highlight": { 287. "fields": { 288. "*":{} 289. } 290. }, 291. "from": 3, 292. "size": 3 293. } 294.