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 只返回部分字段
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。