Elasticsearch
1.基础概念
1) 与mysql区别:
|
mysql
|
ES
|
差异
|
|---|---|---|
| 数据库 | 索引 | 逻辑上是一致的 |
| 表 | type | 逻辑上是一致的 |
| 行 | doc | 结构上存在差别 |
| 列 | ES上的一个字段 | mysql是连续存储的 |
2) 索引字段有为“索引(indexed)”和“存储(stored)”两个属性,只有被“索引”的字段才能在查询/排序条件中使用,只有被“存储”的字段才能在请求的时候返回字段内容,默认情况下字段是既“索引”又“存储”的。如果需要对索引进行“update”操作,那么所有字段都必须“存储(stored)”。
3) 索引创建之后是字段不可变的(Immutable),只允许新增字段。
2.索引数据结构
搜索引擎使用倒排索引来组织数据,比如源文档{"id":1,"title":"这是一张很贵的名画","tag":12345}/{"id":2,"title":"这是一幅相当贵的名画","tag":54321},title可以分词为"这/是/一张/很/贵/名画/画"/"这/是/一幅/相当/贵/名画/画"("的"字作为停止词没有进入到索引),分词得到的每一个词元,比如"画",称作一个term,那么倒排索引存储的数据将会变成:
| title | tag | ||
|---|---|---|---|
| term | 文档id | term | 文档id |
| 这 | 1,2 | 12345 | 1 |
| 是 | 1,2 | 54321 | 2 |
| 一张 | 1 | ||
| 一幅 | 2 | ||
| 很 | 1 | ||
| 相当 | 2 | ||
| 贵 | 1,2 | ||
| 名画 | 1,2 | ||
| 画 | 1,2 | ||
3.匹配问题
搜索引擎使用倒排索引来进行模糊匹配,以上文为例,输入"很贵的画"搜索时,首先输入词也进行分词"很/贵/画",然后用得到的term去和索引数据进行比对,得到:"很"->{1},“贵”->{1,2},"画"->{1,2},然后"很"∩"贵"∩"画"={1},得到文档1为结果,模糊匹配在索引内部都是通过分词后的term精确匹配来计算的。
匹配度:es的match查询通常可以带匹配度(默认是75%),以1.4为例,输入"很贵的画",如果匹配度是100%,那么结果就是"很"∩"贵"∩"画"={1},如果匹配度降到75%(搜索词越短,75%的范围越模糊),那么结果(按正常理解)可以是("很"∩"贵)υ("贵"∩"画")υ("很"∩"画")={1,2}。
4.查询入门
最常用的查询接口,search操作依据的是一个时刻t的快照数据,t之后变更的数据search结果是不会体现的,要高实时的获取单条记录,请使用get操作;
对单条数据的操作请使用kv操作方式(get/exists),开销比search小,实时性更高。
一、请求样例
请求url:http://[域名]/sync/search/[索引]
请求格式: post
完整示例:
|
|
返回:
{
"result": true, // 框架自动封装 "code": 0, // 框架自动封装 "message": null, "data": { // 这里开始才是搜索的响应 "code": 0, // 错误码 "message": "OK", // 错误信息 "took": 4, // 耗时,ms "hits": { "hitCache": false, // 是否通过缓存返回 "totalHits": 100, // 总结果数,不是当次返回的结果数 "hits": [ // 结果集,数组形式 { "id": "0", // 唯一键 "score": 1.0, // 匹配分 "source": "{\"kdt_id\":63077,\"id\":0,\"title\":\"测试商品2-update\"}", // doc内容,是一个json字符串 "setxxx": true // 会有一坨和字段重名的setxxx属性,可以认为是基于nova暴露rest服务的缺陷(其实是为了描述字段是否被设置) } ] }, "setxxx": true // 这里类似 }}一、默认以下查询会被kill:
- from > 3000
- size > 300
- terms内条件个数(相当于mysql的in)> 200
- sort中包含了排序禁止词:
- string类型字段
- array字段
- nested嵌套字段
- 统计查询agg size > 500
- scan查询timeout > 600000
- scan查询size > 500
- 查询qps > 100
1.3 搜索条件(以mysql查询条件为对比):
- '=' :term
- '<','>' :range
- 'like' : match (注意:不完全对等)
- 'in' :terms
- 'and' : bool -> must
- 'not' : bool -> must_not
- 'or' : bool -> should
1.4 示例查询(用curl模拟):
curl -XPOST "http://[host]:[port]/[biz_index]/[biz_type]/_search" -d 'biz_json_query'
- host:服务地址
- port:服务端口
- biz_index:服务的索引名(控制台有全部的)
- biz_type:服务的type名(一般是固定的,默认data,通过控制台可以拿到)
- biz_json_query:组装的查询语句(json格式)
浙公网安备 33010602011771号