实现对es中存储的数据进行查询分析,以_search为结尾,查询主要有两种形式:
URI Search
:操作简便,方便通过命令行测试,仅包含部分查询语法Request Body Search
:es提供完备查询语法Query DSL
(Domain Specific Language)
URI Search详解
通过url query
参数来实现搜索,常用参数如下:
q
: 指定查询语句,语法为 Query String Syntaxdf
: q中不指定字段时默认查询的字段,如果不指定,es会查询所有字段sort
:排序timeout
:指定超时时间,默认不超时from,size
:用于分页
案例如下所示:
GET /myindex/_search?q=alfred&df=user&sort=age:asc&from=4&size=10&timeout=1s
#查询user字段包含alfred的文档,结果按照age升序排列,返回第5-14个文档,如果超过1s没有结束,则以超时结束
Query String Syntax
- 1.term与phrase
alfred way 等效于 alfred OR way
"alfred way" 词语查询,要求先后顺序
- 2.泛查询
alfred等效于在所有字段去匹配该term
- 3.指定字段
name:alfred
- 4.Group分组指定,使用括号指定匹配的规则
(quick OR brown) AND fox
status:(active OR pending) title:(full text search)
- 5.布尔操作符
AND(&&),OR(||),NOT(!)
name:(tom NOT lee) 注意大写,不能小写
+ - 分别对应must和must_not
name:(tom +lee -alfred)
name:((lee && !alfred)||(tom && lee && !alfred))
+
在url中会被解析为空格,要使用encode后的结果才可以,为%2B
6.范围查询,支持数值和日志
- 区间写法,闭区间用[],开区间用{}
age: [1 TO 10]意为 1<=age<=10 age: [1 TO 10}意为 1<=age<10 age: [1 TO ]意为 age>=1 age: [* TO 10]意为 age<=10
- 算数符号写法
age:>=1 age:(>=1&&<=10)或者age:(+>=1 +<=10)
- 7.通配符查询:?代表一个字符,*代表0或多个字符
name:t?m
name:tom*
通配符匹配执行效率低,且占用较多内存,不建议使用
如无特殊需求,不要将?/*放在最前面
- 8.正则表达式:
name:/[mb]oat/
- 9.模糊匹配 fuzzy query
name:roam~1
匹配与roam差一个character的词,比如foam roams等
- 10.近似度查询 proximity search
"fox quick"~5
以term为单位进行差异比较,比如"quick fox" "quick brown fox"都会被匹配
示例说明:
GET /myindex/_search?q=username:alfred way
{
"profile": "true"
}
#其中alfred为指定username字段查询,way为泛查询
如果想在指定字段中查询,可以改为如下语句:
GET /myindex/_search?q=username:"alfred way"
GET /myindex/_search?q=username:(alfred way)
GET /myindex/_search?q=username:(alfred +way) (包含alfred或者包含way)+被解析为空> > 格,需要改为如下形式
GET /myindex/_search?q=username:(alfred %2Bway)(必须包含way,可以有alfred)
userna:alfred AND way 和userna:(alfred AND way)的查询语法完全不同,前者包含一个泛查> 询
可以通过{"profile": "true"}查看查询语法。
Request Body Search
将查询语句通过http request body 发送到es,主要包含如下参数:
- query: 符合Query DSL语法的查询语句
- from,size
- timeout
- sort
- …
Query DSL
Query DSL
: 基于json定义的查询语言,主要包含如下两种类型:
- 字段类查询:如
term、match、range
等,只针对某一字段进行查询 - 复合查询:如
bool
查询等,包含一个或多个字段类查询或者复合查询语句
match查询示例:
GET my_index/_search
{
"query": {
"match": {
"username": "alfred way"
}
}
}
字段类型的查询
- 全文匹配:针对text类型字段进行全文检索,对语句先进行分词,如
match,match_phrase
等
match
:operator
参数,可选项为and和or;minimum_should_match
: 需要匹配的单词数
match_phrase
:词语查询
slop
参数:控制单词的间隔数(差异数)
query_string
:类似于url中的q参数查询
simple_query_string
:会忽略错误的查询语法,并且仅支持部分查询语法,不能使用AND,OR,NOT,要用+,|,-代替
- 单词匹配:不会进行分词处理,直接匹配倒排索引,如
term,terms,range
等
term;terms
:一次传入多个参数进行查询
range
:gt,gte,lt,lte
日期:gte:"1999-02-01"
计算:+1h -1d /d
(将时间舍入到天)
或者gte:"now-20y"
(也可以用具体的日期"2018-01-01"
,使用的时候用||
做隔离)
2018-01||+1M/d
复合查询
constant_score
:将内部查询结果的文档得分设定为1或者boost
的值
一般用于结合bool查询实现自定义得分bool
:一个或者多个bool字句组成filter
,只过滤符合条件的文档,不计算相关得分(对性能提升有用,做简单查询的时候,推荐使用filter
替代query
)must
,文档必须符合must
中的条件,会影响相关性得分must_not
,文档必须不符合must_not
中的所有条件should
,文档可以符合should
中的条件,会影响得分,一般两种形式:
- (1)只包含
should
,不包含must
:文档必须满足至少一个条件
minimum_should_match
:控制满足的个数或者百分比 - (2)同时包含
should
和must
:不必满足条件,如果满足,会有加分
- (1)只包含
- dis_max
- function_score
- boosting