1.简易搜索
search API有两种表单:一种是“简易版”的查询字符串(query string)将所有参数通过查询字符串定义,另一种版本使用JSON完整的表示请求体(request body),这种富搜索语言叫做结构化查询语句(DSL)
查询字符串搜索对于在命令行下运行点对点(ad hoc)查询特别有用。例如这个语句查询所有类型为tweet并在tweet字段中包含elasticsearch字符的文档:
下一个语句查找name字段中包含"john"和tweet字段包含"mary"的结果。实际的查询只需要:
2._all字段
返回包含"mary"字符的所有文档的简单搜索:
在前一个例子中,我们搜索tweet或name字段中包含某个字符的结果。然而,这个语句返回的结果在三个不同的字段中包含"mary":
a.用户的名字是“Mary”
b.“Mary”发的六个推文
c.针对“@mary”的一个推文
Elasticsearch是如何设法找到三个不同字段的结果的?
当你索引一个文档,Elasticsearch把所有字符串字段值连接起来放在一个大字符串中,它被索引为一个特殊的字段_all。例如,当索引这个文档:
这好比我们增加了一个叫做_all的额外字段值:
若没有指定字段,查询字符串搜索(即q=xxx)使用_all字段搜索。
3.更复杂的语句
如:name字段包含"mary"或"john";date晚于2014-09-10;_all字段包含"aggregations"或"geo"。
编码后的查询字符串变得不太容易阅读:
简单(lite)查询字符串搜索惊人的强大。然而,简洁带来了隐晦和调试困难。而且它很脆弱——查询字符串中一个细小的语法错误,像-、:、/或"错位就会导致返回错误而不是结果。
最后,查询字符串搜索允许任意用户在索引中任何一个字段上运行潜在的慢查询语句,可能暴露私有信息甚至使你的集群瘫痪。