Elasticsearch之请求体查询(request body search)。
2017-09-16 16:22
736 查看
请求体查询(request body search)
简单查询语句(lite)是一种有效的命令行adhoc查询。但是,如果你想要善用搜索,你必须使用请求体查询(request body search) API。之所以这么称呼,是因为大多数的参数以JSON格式所容纳而非查询字符串。请求体查询(以下简称查询),并不仅仅用于处理查询,而且还可以高亮返回结果中的片段,并且给出帮助你的用户找寻最好结果的相关数据建议。
空查询
我们以最简单的search API开始,空查询将会返回索引中所有的文档。GET /_search
{}
同字符串查询一样,你可以查询一个,多个或_all索引(indices)或类型(types):
GET /index_2014*/type1,typ2/_search
{}
你可以使用from及size参数进行分页:
GET /_search
{
"from" : 30,
"size" : 10
}
携带内容的GET请求?
任何一种语言(特别是js)的HTTP库都不允许GET请求中携带交互数据。事实上,有些用户很惊讶GET请求中居然会允许携带交互数据。
真实情况是,http://tools.ietf.org/html/rfc7231#page-24[RFC 7231], 一份规定HTTP语义及内容的RFC中并未规定 GET 请求中允许携带交互数据! 所以,有些HTTP服务允许这种行为,而另一些(特别是缓存代理),则不允许这种行为。
Elasticsearch的作者们倾向于使用GET提交查询请求,因为他们觉得这个词相比POST来说,能更好的描述这种行为。然而,因为携带交互数据的GET请求并不被广泛支持,所以search API同样支持POST请求,类似于这样:
POST /_search
{
"from" : 30,
"size" : 10
}
这个原理同样应用于其他携带交互数据的GET API请求中。
相对于神秘的查询字符串方法,请求体查询允许我们使用结构化查询Query DSL(Query Domain Specific Language)
结构化查询(Query DSL)
结构化查询是一种灵活的,多表现形式的查询语言。Elasticsearch在一个简单的JSON接口中用结构化查询来展现Lucene绝大多数能力。你应当在你的产品中采用这种方式进行查询。它使得你的查询更加灵活,精准,易于阅读并且易于debug。使用结构化查询,你需要传递query参数:
GET /_search
{
"query" : YOUR_QUERY_HERE
}
空查询- {} -在功能上等同于使用match_all查询子句,正如其名字一样,匹配所有的文档:
GET /_search
{
"query" : {
"match_all" : {}
}
}
查询子句
一个查询子句一般使用这种结构:{
QUERY_NAME : {
ARGUMENT : VALUE,
ARGUMENT : VALUE, ...
}
}
或指向一个指定的字段:
{
QUERY_NAME : {
FIELD_NAME : {
ARGUMENT : VALUE,
ARGUMENT : VALUE, ...
}
}
}
例如,你可以使用match查询子句用来找寻在tweet字段中找寻包含elasticsearch的成员:
{
"match" : {
"tweet" : "elasticsearch"
}
}
完整的查询请求会是这样:
GET /_search
{
"query" : {
"match" : {
"tweet" : "elasticsearch"
}
}
}
合并多子句
查询子句就像是搭积木一样,可以合并简单的子句为一个复杂的查询语句,比如:简单子句(leaf clauses)(比如match子句)用以在将查询字符串与一个字段(或多字段)进行比较。
复合子句(compound)用以合并其他的子句。例如,bool子句允许你合并其他的合法子句,无论是must,must_not还是should:
复合子句能够合并任意其他查询子句,包括其他的复合子句。这就意味着复合子句可以相互嵌套,从而实现非常复杂的逻辑。
以下实例查询在inbox中或未标记spam的邮件中找出包含“business opportunity”的星标(starred)邮件:
相关文章推荐
- Delphi编写天气预报查询小程序(IXMLHttpRequest版)
- 使用Volley StringRequest Get的方式进行发票查询操作
- 提交查询时,报错显示"从客户端检测到有潜在危险的Request.Form 值"(.Net Framework1.1)的解决
- 2.3 参数化JDBC Request TestStep的SQL查询
- Jmeter将JDBC Request查询结果作为下一个接口参数方法
- 集线程池应用、多次HttpWebRequest请求,自动切换账号等等的移动信息查询软件
- 'dojo/request/xhr'读取配置文件 以及 同步查询
- springmvc源码阅读笔记 --Object handler和request请求路径查询lookupPath
- 工作记录,request、分页,查询
- Java_调用HttpRequest访问淘宝开发API查询IP信息
- Solr查询语言 JSON Request API
- C#中实现zip协议,通过WebRequest查询zip文件内容。统一访问接口
- 转jmeter 性能测试 JDBC Request (查询数据库获取数据库数据) 的使用
- 在ASP.NET中重写URL 方法一:使用Request.PathInfo 参数而不是查询字符串
- 【已解决】MyBatis查询数据报错 Request processing failed; nested exception is org.mybatis.spring.MyBatisSyst
- Fix协议介绍21-party信息查询(PartyEntitlementsRequest )
- Jquery如何序列化form表单数据为JSON对象 C# ADO.NET中设置Like模糊查询的参数 从客户端出现小于等于公式符号引发检测到有潜在危险的Request.Form 值 jquery调用iframe里面的方法 Js根据Ip地址自动判断是哪个城市 【我们一起写框架】MVVM的WPF框架(三)—数据控件 设计模式之简单工厂模式(C#语言描述)
- aspx页面状态管理(查询字符串Request与Application)
- jmeter: JDBC Request (查询数据库获取数据库数据) 的使用
- [JSP&JDBC]MVC模型查询学生表实例(servlet+javabean+jsp)/sendRedirect/getRequestDispatcher