search api
实现对 es 中存储的数据进行查问剖析,endpoint 为_search,如 GET /_search
查问有两种模式
- URI search
- Request body search
es 提供的齐备的查问语法 Query DSL domain specific language
URI search
通过 url query 参数来实现搜寻,罕用参数如下:
- q 指定查问的语句,语法为 query string syntax
- df q 中不指定字段时默认查问的字段,如果不指定,es 会查问所有的字段
- sort 排序
- timeout 指定超时工夫
-
from size 分页
GET /my_index/_search?q=alfred&df=user&sort=age:asc&from=4&size=10&timeout=1s 查问 user 字段中蕴含 alfred 的文档,后果依照 age 升序排列,返回第 5 -14 个文档,如果超时 1s 则完结
term and phrase
- alfred way 等于 alfred OR way
- “alfred way” 词语查问 要求先后顺序
泛查问 - alfred 等效与在所有的字段取匹配该 term
在指定字段 - name:alfred
Group 分组
group 分组设定,应用括号指定匹配规定
- (quick OR brown) AND fox
- status:(active OR pending) title:(full text search)
boolean 操作符
AND OR NOT
- name:(tom NOT leee)
- 必须大写
+- 对应 must 和 must_not
- name:(tom +lee -alfred)
- name:((lee && !alfred) || (tom && lee && !alfred))
-
- 在 url 中会被解析为空格 要应用 encode 后后果才能够 %2B
范畴查问
范畴查问 反对数值和日期
-
区间写法 闭区间用[] 开区间用{}
- age:[1 TO 10]
- age:[1 TO 10}
- age:[1 TO] age>=1
- age:[* TO 10] age<=10
-
算数符号写法
- age:>=1
- age:(>=1 && <=10)
- age:(+>=1 +<=10)
通配符 正则表达式
- ?代表一个字符 * 代表 0 或者多个字符
- 通配符匹配执行效率低,占用内存大,不倡议应用
- 如无非凡需要,不要将?/* 放在最前
- name:/[ab]oat/ 正则表白的问题和通配符一样
含糊匹配 近似度查问
含糊匹配 fuzzy query
- name:roam~1 匹配与 roam 差一个 character 的词 例如 foam roams
近似度查问 proximity search
- “fox quick”~5 以 term 为单位进行差别比拟,例如 ”quick fox” “quick brown fox” 都会被匹配
Query DSL
基于 json 定义的查询语言,次要蕴含如下两种类型
- 字段类查问
如 term match range 等 只针对某一个字段进行查问 - 复合查问
如 boolean 查问 蕴含一个或多个字段类查问或者复合查问语句
字段类查问
- 全文匹配
针对 text 类型的字段进行全文检索,回对查问语句进行分词解决,如 match match_phrase 等 query 类型 - 单词匹配
不会对查问语句做分词解决,间接去匹配字段的倒排索引 如 term terms range 等 query 类型 - minimum_should_match 管制须要匹配的单词数
相关性算分
指文档与查问语句间的相关度 relevance
- 通过倒排索引能够获取与查问语句项匹配的文档列表,那么如何将最合乎用户查问需要的文档放在前列
- 实质是一个排序问题 排序的根据是相关性算分
相关性算分的几个重要概念
- term frequency 词频 即单词在该文档中呈现的次数,词频越高 相关度越高
- document frequency df 文档频率,即单词呈现的 文档数
- inverse document frequency idf 逆向文档频率 与 文档频率相同,简略了解为 1/df 单词呈现的文档数越小,相关度越高
- field-length norm 文档越短 相关性越高
es 有两个算分模型
- tf/idf
- BM25 5.X 当前默认
match phrase query
- 对字段进行检索,有程序要求
- 应用 slop 参数管制单词之间的距离
query string query
相似与 uri search 中的 q 参数查问
simple query string query
相似于 query string 然而会疏忽谬误的查问语法,并且反对局部查问语法
罕用的逻辑符号如下,不能应用 and or not 等关键词
-
- 为 AND
- | 为 OR
-
- 为 NOT
term query
一次传入多个单词 不做分词 查问
range query
数值和日期的范畴查问
date math
针对日期提供一种更敌对的计算形式
now – 1d
基准日期,也能够是更具体的日期,例如 2018-01-01 应用具体日期时 要用 || 做隔离
计算公式 次要有三种
-
- 1h
-
- 1d
- /d 将工夫舍入到天
复合查问
蕴含字段类查问或复合类查问的类型
- constant_score query
该查问将其外部的查问后果文档得分都设定为 1 或者 boost 的值
多用于联合 bool 查问实现自定义得分 -
bool query
由一个或多个布尔子句组成,次要蕴含一下 4 个-
filter 值过滤复合条件的文档 不计算相关性得分
- es 针对 filer 有只能缓存,提高效率
- 做简略的匹配查问且不思考算分时,举荐应用 filter 代替 query
- must 文档必须复合 must 中所有条件 会影响相关性得分
- must_not 文档必须不合乎 must_not 中所有的条件
- should 文档能够复合 should 中的条件,会影响相关性得分
-
count and source api
- count 获取复合条件的文档数
- source 只返回局部字段