1. search api
-
在url中使用查询参数
-
request body search
-
使用es提供的,基于json格式的更加完备的 query domain specific language (dsl)
-
2. 指定查询的索引
3. 返回response
- uri search - 通过uri query实现搜索
GET /movies/_search?q=2012&df=title&sort=year:desc&from=0&size=10&timeout=1s {"profile":true}
-
q 指定查询语句,使用query string syntax
-
df 默认字段,不指定时,会对所有字段进行查询,或者 q=title:2012
-
sort 排序
-
form、size 用于分页
-
profile 可以查看查询是如何被执行的
5. query string syntax
-
指定字段 vs 泛查询
- q=title:2012 / q=2012
-
term vs phrase
-
beautiful mind 等效于 beautiful or mind,q=title(beautiful mind),不加()则mind则是泛查询
-
“beautiful mind” 等效于 beautiful and mind。 phrase 查询,还要求前后顺序保持一致, q=title:"beautiful mind"
-
-
分组与引导
-
title:(beautiful and mind)
-
title=“beautiful mind”
-
-
布尔操作
-
AND / OR / NOT 或者 && // || / !
-
必须大写
-
title:(beautiful NOT mind) ,包含beautiful 但是不包含 mind
-
-
分组
-
“+” 表示 must ,在uri中使用%2B来表示+号
-
“-” 表示 must not
-
title:(+beautiful - mind)
-
-
范围查询
-
区间表示:[]闭区间,{}开区间
-
year:{2010 TO 2018}
-
year:[* TO 2018]
-
-
算数符号
-
year:>2010
-
year:(>2010 && <=2018)
-
year:(+>2010 +<=2018)
-
-
通配符查询(效率低,占用内存大,不建议使用,特别是放在最前面)
-
?代表1个字符,*代表0或者多个字符
-
title:mi?d
-
title:bea* 均不是phrase查询
-
-
正则表达
- title:[bt]oy
-
模糊查询与近似查询
-
title:befutifl~1
-
title:"lord rings"~2(~2代表的是lord 与 rings之间的距离是2)
-
6. request body查询
-
sort 排序
-
最好在“数字型”与“日期型”字段进行排序
-
因为对于多值类型或分析过的字段排序,系统会选一个值,无法得知该值
-
_search {"sort":[{"order_date":"desc"}]}
-
-
_source 只查询出我们想要的字段
-
如果_source没有存储,那就只能返回匹配的文档的元数据
-
_source支持使用通配符 _source["name*","desc*"]
-
_search {"_source":["order_date","name"]}
-
-
脚本字段,新增一个字段,自定义值
-
_serach {"script_fields":{"new_field":{"script":{"lang":"painless","source":"doc['order_date'].vaule+'_hello'"}}}}
-
比如订单中对汇率进行脚本计算后排序
-
-
match query
-
_search {"query":{"match":{"comment":"last christmas"}}} 默认是last or christmas
-
_search {"query":{"match":{"comment":"last christmas","operator":"AND"}}},指的是last and christmas
-
-
match phrash
- _search {"query":{"match_phrase":{"comment":{"query":"song last christmas","slop":1}}}}, 使用match_phrase 查询,这些词是要顺序出现的,slop 1 代表中间可以有1个词的间距
7. query string 类似url query
- post users/_search {"query":{"query_string":{"default_field":["name","about"],"query":"ruan AND yiming"}}} AND 在查询中是“与”的意思
8. simple query string
-
post users/_search {"query":{"simple_query_string":{"query":"ruan -yiming","fields":["name"],"default_operator":"AND"}}}
-
类似 query string,但是会忽略错误的语法,同时只支持部分查询语法
-
不支持AND OR NOT,会当做字符串处理,term之间默认关系是OR,可以指定operator
-
-
支持部分逻辑
-
+代替AND
-
|代替OR
-
-代替NOT
-
9. 结构化数据
-
结构化搜索是对结构化数据的搜索
- 日期、布尔类型和数字都是结构化的
-
文本也可以是结构化的。
-
如彩色笔有离散的颜色集合:红(red)、绿(green)、蓝(blue)
-
一个博客可能被标记了标签,例如,分布式(distributed)和搜索(search)
-
-
如果不需要算分,可以通过Constant Score,将查询转为Filtering
-
使用Exist查询处理非空NULL值,