有两种形式的 搜索 API:
本文主要讲解这种轻量的搜索。
查询字符串搜索非常适用于通过命令行做即席查询。例如,查询在 tweet 类型中 tweet 字段包含 elasticsearch 单词的所有文档:
GET /_all/tweet/_search?q=tweet:elasticsearch
下一个查询在 name 字段中包含 john 并且在 tweet 字段中包含 mary 的文档。实际的查询就是这样
+name:john +tweet:mary
但是查询字符串参数所需要的URL编码实际上更加难懂:
(开发者应该很容易理解,+,:等符号,在浏览器地址栏输入后,一回车,自动会被编码为这种字符)
GET /_search?q=%2Bname%3Ajohn+%2Btweet%3Amary
注意上面的查询方式,返回结果,会按照匹配从高到低排序,当参数值中含有中文时,部分版本可能会报错。
这个简单搜索返回包含 mary 的所有文档:
GET /_search?q=mary
如果有多个地方含有mary,比如:
当索引一个文档的时候,Elasticsearch 取出所有字段的值拼接成一个大的字符串,作为 _all 字段进行索引。例如,当索引这个文档时:
{
"tweet": "However did I manage before Elasticsearch?",
"date": "2014-09-14",
"name": "Mary Jones",
"user_id": 1
}
这就好似增加了一个名叫 _all 的额外字段:
"However did I manage before Elasticsearch? 2014-09-14 Mary Jones 1"
除非设置特定字段,否则查询字符串就使用 _all 字段进行搜索。
下面的查询针对tweents类型,并使用以下的条件:
+name:(mary john) +date:>2014-09-10 +(aggregations geo)
查询字符串在做了适当的编码后,可读性很差:
?q=%2Bname%3A(mary+john)+%2Bdate%3A%3E2014-09-10+%2B(aggregations+geo)
这种轻量级查询还是很高效的,但是容易出现语法错误,在实际生产中,还是推荐请求体查询。