首页 > 代码库 > 精简版搜索(search lite)

精简版搜索(search lite)

ES有两种格式的search api:

“lite”——query string版本,这个版本期望所有的参数在请求中指定并传递

full request body版本期望得到一个JSON请求体,并且使用一个名为DSL的丰富的搜索语言

 

query string搜索对在使用命令行的即席查询(ad hoc queries)是很有用的。例如要查询type是tweet并且字段“tweet”包含"elasticsearch"单词的document:

GET /_all/tweet/_search?q=tweet:elasticsearch

下一个查询是从name字段中查出“john”和在tweet字段中查出“mary”:

+name:john +tweet:mary

查询字符串是需要对查询语句进行%编码的,经过编码的查询要比真是的查询语句看起来更隐秘:

GET /_search?q=%2Bname%3Ajohn+%2Btweet%3Amary

“+”前缀表示必须匹配要查询的条件。类似的“-”前缀必须不能匹配要查询的条件。没有“+”或“-”的都是可选项,越是匹配,搜索得到的document越是相关。

 

_all 字段

下面这个简单的查询返回了所有包含“mary”的document:

GET /_search?q=mary

以前的例子中,我们在tweet或这name字段中查询”mary“,然而这次,结果是从三个不同的field中得到的:

  • a user whose name is "Mary"
  • six tweets by "Mary"
  • one tweet directed at "@mary"

ES是怎么从三个不同的字段中找到结果的呢?

当我们index一个document的时候,ES把每个field的值合并成一个大的字符串,这个大的字符串被放入到指定的_all字段中。例如,当我们index下面这个document:

{
   
"tweet":    "However did I manage before Elasticsearch?",
   
"date":     "2014-09-14",
   
"name":     "Mary Jones",
   
"user_id":  1
}

这就好象我们另外添加了一个_all的field,其值是:

"However did I manage before Elasticsearch? 2014-09-14 Mary Jones 1"

除非你在搜索的时候指定filed的名称,否则默认搜索的就是这个_all的field。

当你入门一个新的引用的时候,这个_all就是一个很有用的特点,如果你指定一个field而不是_all你就能对检索的结果获得更多的控制权。当你不再需要_all的时候,你可以让其失效,就像Metadata: _all field在介绍的一样。

 

更复杂的查询

下面的搜索查询是针对tweets的:

  • where the name field contains "mary" or "john"
  • and where the date is greater than 2014-09-10
  • and which contain either of the words "aggregations" or "geo" in the _all field
+name:(mary john)+date:>2014-09-10+(aggregations geo)

编码后的查询语句如下:

?q=%2Bname%3A(mary+john)+%2Bdate%3A%3E2014-09-10+%2B(aggregations+geo)

从上面的案例中可以看出,简单的query string功能强大的令人惊讶,他的语法在有详细的介绍,使我们能够简洁地表达比较复杂的查询。这使的ES非常适合在命令行或者开发过程中进行查询。

然而,你也看到了,这种简介也使他变得神秘和难以调试。并且,这个结构也是很脆弱的,一个简单的语法错误,比如-,:,/或者“ 都将导致错误而无法返回结果。

最后,query string 允许任何用户对你的index的任何field进行潜在的慢重查询,这个会暴露你的私人信息,甚至将导致你的集群瘫痪。给予这个原因,不推荐直接query string暴露给你的用户。

相反,在生产中,我们通常依赖于全功能的request body 这个搜索API,他能做上面所有的功能,但不仅仅这些。在我们学习这些之前,我们要先看一下我们的数据在ES中是怎么存储的。

 

原文:http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/search-lite.html