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格式)