elasticsearch(4) 轻量搜索

一 空搜索

搜索API的最基础的形式是没有指定任何查询的空搜索 ,它简单地返回集群中所有索引下的所有文档:

示例

GET 127.0.0.1:9200/_search

响应

{
  "took": 166,
  "timed_out": false,
  "_shards": {
    "total": 10,
    "successful": 10,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 5,
    "max_score": 1,
    "hits": [
      {
        "_index": "test",
        "_type": "test",
        "_id": "WOTj8GYBuXRyDW5PpvRN",
        "_score": 1,
        "_source": {
          "first_name": "John",
          "last_name": "Smith",
          "age": 25,
          "about": "I love to go rock climbing",
          "interests": [
            "sports",
            "music"
          ]
        }
      },
      {
        "_index": "test",
        "_type": "test",
        "_id": "4",
        "_score": 1,
        "_source": {
          "hello": "world",
          "author": "wuzhe"
        }
      },
      {
        "_index": "test",
        "_type": "test",
        "_id": "6",
        "_score": 1,
        "_source": {
          "test": "test10",
          "author": "wuzhe"
        }
      },
      {
        "_index": "megacorp",
        "_type": "employee",
        "_id": "1",
        "_score": 1,
        "_source": {
          "first_name": "John",
          "last_name": "Smith",
          "age": 25,
          "about": "I love to go rock climbing",
          "interests": [
            "sports",
            "music"
          ]
        }
      },
      {
        "_index": "test",
        "_type": "test",
        "_id": "3",
        "_score": 1,
        "_source": {
          "first_name": "John",
          "last_name": "Smith",
          "age": 25,
          "about": "I love to go rock climbing",
          "interests": [
            "sports",
            "music"
          ]
        }
      }
    ]
  }
}

我们可以看到响应中的hits段,total代表了es中总共查询到的文档个数,hits里的hits部分则是具体文档的内容,包括文档的index、type、id以及source。空搜索默认返回的是前10个文档的内容。

若想返回更多文档,Elasticsearch 接受 from 和 size 参数:

size 表示应该返回的结果数,默认是10

from 表示应该跳过的结果数, 默认是0

GET 127.0.0.1/_search?size=20&from=10

表示获取第11条到30条的文档

  • 需要注意的一点是:

理解为什么深度分页是有问题的,我们可以假设在一个有 5 个主分片的索引中搜索。 当我们请求结果的第一页(结果从 1 到 10 ),每一个分片产生前 10 的结果,并且返回给 协调节点,协调节点对 50 个结果排序得到全部结果的前 10 个。现在假设我们请求第 1000 页--结果从 10001 到 10010 。所有都以相同的方式工作除了每个分片不得不产生前10010个结果以外。 然后协调节点对全部 50050 个结果排序最后丢弃掉这些结果中的 50040 个结果。可以看到,在分布式系统中,对结果排序的成本随分页的深度成指数上升。这就是 web 搜索引擎对任何查询都不要返回超过 1000 个结果的原因。

took字段代表的这次搜索的响应时间。

shards 部分告诉我们在查询中参与分片的总数,以及这些分片成功了多少个失败了多少个。正常情况下我们不希望分片失败,但是分片失败是可能发生的。如果我们遭遇到一种灾难级别的故障,在这个故障中丢失了相同分片的原始数据和副本,那么对这个分片将没有可用副本来对搜索请求作出响应。假若这样,Elasticsearch 将报告这个分片是失败的,但是会继续返回剩余分片的结果。

timed_out字段告诉我们查询是否超时。默认情况下,搜索请求不会超时。但如果低响应时间比完成结果更重要,可以指定 timeout超时时间

例:

GET 127.0.0.1:9200/_search?timeout=10ms

这样的话,在搜索超时之前,ES会返回每个分片中已经查询到的结果,

在请求超时之前,Elasticsearch 将会返回已经成功从每个分片获取的结果。 但timeout 不是停止执行查询,它仅仅是告知正在协调的节点返回到目前为止收集的结果并且关闭连接。在后台,其他的分片可能仍在执行查询即使是结果已经被发送了。

二 指定索引以及类型

如果想在一个或多个特殊的索引并且在一个或者多个特殊的类型中进行搜索。我们可以通过在URL中指定特殊的索引和类型达到这种效果。

  • GET 127.0.0.1:9200/_search

在所有的索引中搜索所有的类型

  • GET 127.0.0.1:9200/test/_search

在 test索引下搜索所有的类型

  • GET 127.0.0.1:9200/test1,test2/_search

在 test1 和 test2 中搜索。

除了指定索引,指定类型的方式和指定索引是一样的

  • 127.0.0.1/9200/test/test/_search

在索引test,类型test下搜索所有文档

ES还提供了‘*’作为通配符

  • GET 127.0.0.1:9200/t*/_search

在所有以t开头的索引下搜索

  • GET 127.0.0.1:9200/*/test/_search

在所有索引下的test的类型下搜索

三 轻量搜索

ES提供两种形式的搜索API ,一种是轻量的:查询字符串版本,另一种则是更完整的请求体版本。

先来说一下轻量搜索:查询字符串版本,这种查询方式要求在查询字符串中传递所有的参数。这种方式非常适用于通过命令行做即席查询。

这种搜索方式的结构为

ip:port/_search?q=查询字符串

查询字符串的生成是对以下规则生成的字符串做一次urlEncode

1、若想要查询某个字段包含某个单词的所有文档

+name:xx

表示为查询name字段包含xx的所有文档

2、多个条件之间用空格分割

+name:xx +age:20

表示为查询name包含xx且age包含20的所有文档

3、+ 前缀表示必须与查询条件匹配, - 前缀表示一定不与查询条件匹配。没有 + 或者 - 的所有其他条件都是可选的,匹配的越多,文档就越相关。

+name:xx -age:>20

表示为name包含xx并且排除age>20的所有文档

4、对_all字段查询,,ES会取出一个文档所有字段的值拼接成一个大的字符串,作为 _all 字段进行索引

+(xx)

表示查询所有包含xx的文档

复杂查询示例

+name:(xx yy) +age:>20 +(football basketball)

表示 查询name属性为xx 或yy 且age属性>20 ,且所有文档内容包含football 或者basketball的文档

编码后的查询字符串为

%2Bname%3A%28xx+yy%29+%2Bage%3A%3E20+%2B%28football+basketball%29

查询请求为

GET 127.0.0.1:9200/_search?q=%2Bname%3A%28xx+yy%29+%2Bage%3A%3E20+%2B%28football+basketball%29

从中,我们可以看出轻量搜索可以通过简洁的查询字符串表达很复杂的查询。对于通过命令做一次性查询,或者是在开发阶段,都非常方便。

但是,这种精简让调试更加晦涩和困难。而且很脆弱,一些查询字符串中很小的语法错误,像 - , : , / 或者 " 不匹配等,将会返回错误而不是搜索结果。

最后,查询字符串搜索允许任何用户在索引的任意字段上执行可能较慢且重量级的查询,这可能会暴露隐私信息,甚至将集群拖垮。

所以结论是除非是非常信任用户,否则不推荐直接向用户暴露查询字符串功能。

原文地址:https://www.cnblogs.com/wuzhe1991/p/9950535.html

时间: 2025-01-15 22:56:29

elasticsearch(4) 轻量搜索的相关文章

OWIN轻量型框架介绍

OWIN轻量型框架介绍 阅读目录 引言 框架的特色 如何启动 各项功能 静态路由的3种写法 伪静态路由的支持 处理Form表单提交的文件 流式处理Post请求的数据 多种请求类型自动识别 响应处理 请求响应上下文 自定义默认处理函数 内置各种便捷函数 复合类型的请求处理 框架的扩展 静态内容的支持 跨域Post的支持 基础类型继承灵活处理 尾声 回到顶部 引言 什么是OWIN,我就不介绍了,请自行搜索,这里主要是介绍自行开发的OWIN框架的特点和用法.由于.NET的web框架都比较庞大,导致性能

比Newtonsoft.Json轻量快速简洁的实体JSON转换库YeaJur.Mapper

在使用MVC的时候,我们经常用到Newtonsoft.Json来进行实体和JSON 之间的转换,但是有时候,有些实体Newtonsoft.Json转换会出现异常.YeaJur.Mapper正是为了解决这些问题而来,并比Newtonsoft.Json轻量,转换速度快,使用简洁,测试结果如下 PK项 YeaJur.Mapper Newtonsoft.Json 版本 1.0 9.0.1 大小 6KB 514KB 实例(json格式) [ { "Products": [ { "Id&

编写轻量ajax组件01-对比webform平台上的各种实现方式

前言 Asp.net WebForm 和 Asp.net MVC(简称MVC) 都是基于Asp.net的web开发框架,两者有很大的区别,其中一个就是MVC更加注重http本质,而WebForm试图屏蔽http,为此提供了大量的服务器控件和ViewState机制,让开发人员可以像开发Windows Form应用程序一样,基于事件模型去编程.两者各有优缺点和适用情景,但MVC现在是许多Asp.net开发者的首选. WebForm是建立在Asp.net的基础上的,Asp.net提供了足够的扩展性,我

阿里云轻量应用服务器 搭建配置详解

好久没有更新博客了,说来也是惭愧没有养成记录经验的习惯. 有很多技术开发同学都想拥有自己的服务器用来搭建个人网站,或者展示作品,但是怕租上不会配置或者嫌配置繁琐难下决定. 废话不多说直接进入正题,前两天帮朋友配置一台阿里云的轻量应用服务器(注意不是云服务器ECS但是大同小异). 服务器规格 我配置的是1GB内存1核  20GB SSD系统盘 一年(最低配置算下来打折400多),一般个人建站或者拿来自己练手这个配置足够用了,如果公司用可以选择配置更高的. 1.地域选择 推荐大家选择 华东1(杭州)

Metricbeat 轻量型指标采集器

一.介绍 用于从系统和服务收集指标.从 CPU 到内存,从 Redis 到 Nginx,Metricbeat 能够以一种轻量型的方式,输送各种系统和服务统计数据. 1.系统级监控,更简洁(轻量型指标采集器) 将 Metricbeat 部署到您所有的 Linux.Windows 和 Mac 主机,并将它连接到 Elasticsearch 就大功告成啦:您可以获取系统级的 CPU 使用率.内存.文件系统.磁盘 IO 和网络 IO 统计数据,以及获得如同系统上 top 命令类似的各个进程的统计数据.

轻量的Memcached代理Twemproxy的部署

轻量的Memcached代理Twemproxy的部署 Twemproxy(又称为nutcracker)是一个轻量级的Redis和Memcached代理,主要用来减少对后端缓存服务器的连接数.由Twitter开源出来的缓存服务器集群管理工具,主要用来弥补Redis和Memcached对集群(cluster)管理指出的不足. Twemproxy是一个快速的单线程代理程序,支持Memcached ASCII协议和更新的Redis协议. Twemproxy最了不起的地方就在于它能在节点失败的时候卸载它,

轻量型ORM框架Dapper的使用

在真实的项目开发中,可能有些人比较喜欢写SQL语句,但是对于EF这种ORM框架比较排斥,那么轻量型的Dapper就是一个不错的选择,即让你写sql语句了,有进行了关系对象映射.其实对于EF吧,我说下我个人的见解,EF是相对来说比较重的ORM框架,它是讲究通用性的框架,而非单纯的实现某种需求的框架,不得不否认的说,EF的开发效率要比用单纯的ADO.NET写sql语句的效率高的不是一点半点,可能很多人会说EF的性能低等等,针对这种问题有时候是需要折中的来讲,从另一个方面来讲,你用了ADO.NET写s

推荐轻量友好的.NET测试断言工具Shoudly

Shoudly是一个轻量的断言(Assertion)框架,用于补充.NET框架下的测试工具.Shoudly将焦点放在当断言失败时如何简单精准的给出很好的错误信息. Shouldly在GitHub的开源地址:https://github.com/shouldly/shouldly Shouldly的官方文档:http://docs.shouldly-lib.net/ 为什么要Shoudly? 我们知道通常测试代码中一个断言是这样写的: Assert.That(contestant.Points,

一个轻量系统的诞生

经过几个月的业余时间,为一家公司设计了如下一套简单,轻量的内部管理系统.在这几个月中,基本牺牲了所有的业余时间,不乏晚上加班加点.一个人和工厂讨论需求,提出设计想法,和工厂人员确定这么“整”还是那么“整”,是否可满足具体要求. 然后再回到家进行Coding.... 做该项目的意义何在?其实市场上有很多XX ERP,XXX协同系统.这些系统功能可能很强大,强大到太强而不能用. 最重要的一点是,并不是适合具体公司的业务流程和业务内容. 如果你们公司买了一套系统有可能就是将你公司的管理调整到和要上的系