ElasticSearch查询字符串

简易搜索

search API有两种表单:一种是“简易版”的查询字符串(query string)将所有参数通过查询字符串定义,另一种版本使用JSON完整的表示请求体(request body),这种富搜索语言叫做结构化查询语句(DSL)

查询字符串搜索对于在命令行下运行点对点(ad hoc)查询特别有用。例如这个语句查询所有类型为tweet并在tweet字段中包含elasticsearch字符的文档:

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

下一个语句查找name字段中包含"john"tweet字段包含"mary"的结果。实际的查询只需要:

+name:john +tweet:mary

但是百分比编码(percent encoding)(译者注:就是url编码)需要将查询字符串参数变得更加神秘:

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

"+"前缀表示语句匹配条件必须被满足。类似的"-"前缀表示条件必须不被满足。所有条件如果没有+-表示是可选的——匹配越多,相关的文档就越多。

_all字段

返回包含"mary"字符的所有文档的简单搜索:

GET /_search?q=mary

在前一个例子中,我们搜索tweetname字段中包含某个字符的结果。然而,这个语句返回的结果在三个不同的字段中包含"mary"

  • 用户的名字是“Mary”
  • “Mary”发的六个推文
  • 针对“@mary”的一个推文

Elasticsearch是如何设法找到三个不同字段的结果的?

当你索引一个文档,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字段搜索。

更复杂的语句

下一个搜索推特的语句:

_all field

  • name字段包含"mary""john"
  • date晚于2014-09-10
  • _all字段包含"aggregations""geo"
+name:(mary john) +date:>2014-09-10 +(aggregations geo)

编码后的查询字符串变得不太容易阅读:

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

就像你上面看到的例子,简单(lite)查询字符串搜索惊人的强大。它的查询语法,会在《查询字符串语法》章节阐述。参考文档允许我们简洁明快的表示复杂的查询。这对于命令行下一次性查询或者开发模式下非常有用。

然而,你可以看到简洁带来了隐晦和调试困难。而且它很脆弱——查询字符串中一个细小的语法错误,像-:/"错位就会导致返回错误而不是结果。

最后,查询字符串搜索允许任意用户在索引中任何一个字段上运行潜在的慢查询语句,可能暴露私有信息甚至使你的集群瘫痪。

ps:因为这些原因,我们不建议直接暴露查询字符串搜索给用户,除非这些用户对于你的数据和集群可信。

取而代之的,生产环境我们一般依赖全功能的请求体搜索API,它能完成前面所有的事情,甚至更多。在了解它们之前,我们首先需要看看数据是如何在Elasticsearch中被索引的。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-05 20:42:39

ElasticSearch查询字符串的相关文章

[Elasticsearch] 多字段搜索 (一) - 多个及单个查询字符串

多字段搜索(Multifield Search) 本文翻译自官方指南的Multifield Search一章. 查询很少是只拥有一个match查询子句的查询.我们经常需要对一个或者多个字段使用相同或者不同的查询字符串进行搜索,这意味着我们需要将多个查询子句和它们得到的相关度分值以一种有意义的方式进行合并. 也许我们正在寻找一本名为战争与和平的书,它的作者是Leo Tolstoy.也许我们正在使用"最少应该匹配(Minimum Should Match)"来搜索ES中的文档.另外我们也可

[Elasticsearch] 多字段搜索 (一) - 多个及单个查询字符串 <译>

多字段搜索(Multifield Search) 本文翻译自官方指南的Multifield Search一章. 查询很少是只拥有一个match查询子句的查询.我们经常需要对一个或者多个字段使用相同或者不同的查询字符串进行搜索,这意味着我们需要将多个查询子句和它们得到的相关度分值以一种有意义的方式进行合并. 也许我们正在寻找一本名为战争与和平的书,它的作者是Leo Tolstoy.也许我们正在使用"最少应该匹配(Minimum Should Match)"来搜索ES中的文档.另外我们也可

Func<T,T>应用之Elasticsearch查询语句构造器的开发

前言 之前项目中做Elasticsearch相关开发的时候,虽然借助了第三方的组件PlainElastic.Net,但是由于当时不熟悉用法,而选择了自己拼接查询语句.例如: string queryGroup = "{\"query\": {\"match\": { \"roomid\": \"FRIEND_12686_10035\" }}}"; //关键字查询 string queryKeyWord =

ElasticSearch查询 第四篇:匹配查询(Match)

匹配(Match)查询属于全文(Fulltext)查询,不同于词条查询,ElasticSearch引擎在处理全文搜索时,首先分析(analyze)查询字符串,然后根据分词构建查询,最终返回查询结果.匹配查询共有三种类型,分别是布尔(boolean).短语(phrase)和短语前缀(phrase_prefix),默认的匹配查询是布尔类型,这意味着,ElasticSearch引擎首先分析查询字符串,根据分析器对其进行分词,例如,对于以下match查询: "query":{ "ma

(转)Elasticsearch查询规则------match和term

es种有两种查询模式,一种是像传递URL参数一样去传递查询语句,被称为简单搜索或查询字符串(query string)搜索,比如 GET /megacorp/employee/_search //查询全部员工 GET /megacorp/employee/_search?q=last_name:Smith //查询last_name为Smith的员工 另外一种是通过DSL语句来进行查询,被称为DSL查询(Query DSL),DSL是Elasticsearch提供的一种丰富且灵活的查询语言,该语

Elasticsearch入门教程(五):Elasticsearch查询(一)

原文:Elasticsearch入门教程(五):Elasticsearch查询(一) 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/vbirdbest/article/details/79228852 // 准备数据 PUT /shop/goods/1 { "name": "2017新款女装冬季外套ulzzang棉袄中长款棉衣韩版百搭棉服面包服", &quo

Elasticsearch入门教程(六):Elasticsearch查询(二)

原文:Elasticsearch入门教程(六):Elasticsearch查询(二) 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/vbirdbest/article/details/79237950 地理坐标点geo-point 地理坐标点:是指地球表面可以用经纬度描述的一个点. 地理坐标点可以用来计算两个坐标间的距离,还可以判断一个坐标是否在一个区域中,或在聚合中. 地理坐标点不能被

Elasticsearch查询期间的即时搜索(Query-time Search-as-you-type)

现在让我们来看看前缀匹配能够如何帮助全文搜索.用户已经习惯于在完成输入之前就看到搜索结果了 - 这被称为即时搜索(Instant Search, 或者Search-as-you-type).这不仅让用户能够在更短的时间内看到搜索结果,也能够引导他们得到真实存在于我们的索引中的结果. 比如,如果用户输入了johnnie walker bl,我们会在用户输入完成前显示Johnnie Walker Black Label和Johnnie Walker Blue Label相关的结果. 和往常一样,有多

MVC 解决方案: 页面在 IE 浏览器发送中文查询字符串时乱码

今天参照 MvcMusicStore 的教程开始学习 MVC. 在 Browse 页面中我尝试以中文发送查询字符串, 结果得到乱码. 遇到问题我就查资料, 结果查到很多方法, 最主流的方法是往 Web.Config 里加入 <globalization requestEncoding="gbk" responseEncoding="gbk" culture="zh-CN" fileEncoding="gbk" />