查询字符串搜索对于在命令行下运行点对点(ad hoc)查询特别有用。例如这个语句查询所有类型为tweet
并在tweet
字段中包含elasticsearch
字符的文档:
下一个语句查找name
字段中包含"john"
和tweet
字段包含"mary"
的结果。实际的查询只需要:
但是百分比编码(percent encoding)(译者注:就是url编码)需要将查询字符串参数变得更加神秘:
"+"
前缀表示语句匹配条件必须被满足。类似的"-"
前缀表示条件必须不被满足。所有条件如果没有+
或表示是可选的——匹配越多,相关的文档就越多。
返回包含"mary"
字符的所有文档的简单搜索:
GET /_search?q=mary
- 用户的名字是“Mary”
- “Mary”发的六个推文
- 针对“”的一个推文
Elasticsearch是如何设法找到三个不同字段的结果的?
当你索引一个文档,Elasticsearch把所有字符串字段值连接起来放在一个大字符串中,它被索引为一个特殊的字段_all
。例如,当索引这个文档:
这好比我们增加了一个叫做_all
的额外字段值:
若没有指定字段,查询字符串搜索(即q=xxx)使用_all
字段搜索。
_all
field
name
字段包含"mary"
或"john"
date
晚于2014-09-10
_all
字段包含"aggregations"
或"geo"
编码后的查询字符串变得不太容易阅读:
?q=%2Bname%3A(mary+john)+%2Bdate%3A%3E2014-09-10+%2B(aggregations+geo)
就像你上面看到的例子,简单(lite)查询字符串搜索惊人的强大。它的查询语法,会在《查询字符串语法》章节阐述。参考文档允许我们简洁明快的表示复杂的查询。这对于命令行下一次性查询或者开发模式下非常有用。
然而,你可以看到简洁带来了隐晦和调试困难。而且它很脆弱——查询字符串中一个细小的语法错误,像-
、:
、或"
错位就会导致返回错误而不是结果。
最后,查询字符串搜索允许任意用户在索引中任何一个字段上运行潜在的慢查询语句,可能暴露私有信息甚至使你的集群瘫痪。
取而代之的,生产环境我们一般依赖全功能的请求体搜索API,它能完成前面所有的事情,甚至更多。在了解它们之前,我们首先需要看看数据是如何在Elasticsearch中被索引的。