在ES中,text类型的字段,保存时会分词,查询时也会分词后进行查询。而keyword类型字段保存和查询时都不会分词。
URI Search
在URL中使用查询参数。
参数
- q:指定查询语句,使用Query String Syntax;
- df:默认字段,不指定时,会对所有字段进行查询;
- Sort排序 / from 和 Size 用于分页;
- Profile 可以查看查询时如何执行。
Query String Syntax
- 指定字段
# 查询title字段包含2021的数据,使用的是 TermQuery(title字段是text类型)
GET /movies/_search?q=2012&df=title
# 另一种写法
GET /movies/_search?q=title:2021
# 带上sort等参数
GET /movies/_search?q=2012&df=title&sort=year:desc&from=0&size=10&timeout=1s
- 泛查询
# 查询所有字段包含或等于2021的数据,使用的是 DisjunctionMaxQuery
GET /movies/_search?q=2012
- Term vs Phrase
# 查询title字段中包含Beautiful 和 Mind的数据,使用的是 PhraseQuery,Phrase查询,还要求前后顺序保持一致
GET /movies/_search?q=title:"Beautiful Mind"
# 查询title字段包含Beautiful 或其他字段包含 Mind的数据,使用TermQuery(对title字段)和DisjunctionMaxQuery (对所有字段)
GET /movies/_search?q=title:Beautiful Mind
- 分组与引号
TermQuery 使用括号括起来;
PhraseQuery 使用引号括起来。
# 查询title字段包含Beautiful 或Mind 的数据,使用的是 TermQuery
GET /movies/_search?q=title:(Beautiful Mind)
- 布尔操作
两个TermQuery在一起,默认是or的关系,其他关系操作符:
AND / OR / NOT - 分组
+表示 msut
-表示 must_not
# 查询title中包含了Beautiful 和Mind 的数据,使用的是BooleanQuery
GET /movies/_search?q=title:(Beautiful AND Mind)
# 查询title中包含了Beautiful 但不包含Mind 的数据,使用的是BooleanQuery
GET /movies/_search?q=title:(Beautiful NOT Mind)
# 等价于上一句
GET /movies/_search?q=title:(+Beautiful -Mind)
# 查询title包含了Mind和可能包含Beautiful 的数据,使用的是BooleanQuery
GET /movies/_search?q=title:(Beautiful %2BMind)
- 范围查询
区间表示:[]闭区间,{}开区间
# 查询year字段大于1980的数据,使用的是IndexOrDocValuesQuery
GET /movies/_search?q=year:>=1980
# 查询 year字段大于2010小于2018的数据,使用的是IndexOrDocValuesQuery
GET /movies/_search?q=year:[2010 TO 2018]
- 通配符查询(通配符查询效率低,占用内存大,不建议使用)
? 代表1个字符,* 代表0个或多个字符
# 查询title字段中有b开头的term的数据,使用的是MultiTermQueryConstantScoreWrapper
GET /movies/_search?q=title:b*
- 模糊匹配 & 近似匹配
# 查询title字段中类似beautifl(有一个字符的误差)的数据,使用的是BoostQuery
GET /movies/_search?q=title:beautifl~1
# 查询title字段中有类似Lord Rings的短语,中间可以有小于2个间隔,使用的是PhraseQuery
GET /movies/_search?q=title:"Lord Rings"~2
Request Body Search
使用Elasticsearch提供的,基于JSON格式的更加完备的Query Domain Specific Language(DSL)。
- 分页:from,size
- 排序:sort:[{"字段名" : "desc"}]
- _source filtering
如果_source没有存储,那就只返回匹配的文档的元数据;
_source支持使用通配符:_source["name*"]。 - 脚本字段:
使用painless脚本,计算出一个结果作为字段。
# order_date字段和hello拼接作为一个新字段
GET kibana_sample_data_ecommerce/_search
{
"script_fields": {
"new_field": {
"script": {
"lang": "painless",
"source": "doc['order_date'].value+'hello'"
}
}
},
"query": {
"match_all": {}
}
}
- 使用Match
# operator为and表示两个term是and的关系,默认为or的关系
POST movies/_search
{
"query": {
"match": {
"title": {
"query": "last christmas",
"operator": "and"
}
}
}
}
- 短语搜索 - Match Phrase
# slop表示短语之间可以有多少个位置
POST movies/_search
{
"query": {
"match_phrase": {
"title":{
"query": "one love",
"slop": 1
}
}
}
}
Query String
类似于URI查询
# 检索内容中可以有操作符,例如AND 、OR
POST 索引名/_search
{
"query" : {
"query_string" : {
"default field" : "字段名",
"query" : "检索内容"
}
}
}
Simple Query String
- 类似于Query String,但会忽略错误的语法,同时只支持部分查询语法;
- 不支持 AND OR NOT,会当做字符串处理;
- Term 之间默认关系是OR,可以指定Operator。
POST 索引名/_search
{
"query" : {
"simple_query_string" : {
"fields" : ["字段名"],
"query" : "检索内容",
"default_operator" : "AND"
}
}
}
网友评论