ES学习之搜索API(二)

基础搜索

搜索API允许您执行搜索查询并取回与查询匹配的搜索匹配。可以使用简单的查询字符串作为参数使用
请求主体来提供
查询。

示例:

GET /sfeicuss/_search?service=wangzha.query

多种类型搜索

GET /sfeicuss/testlog,testservicelog/_search?service=wangzha.query

多索引搜索:

GET /sfeicuss,ees/testlog/_search?service=wangzha.query

_all 占位符搜索所有可用索引中的所有内容:

GET /_all/testlog/_search?service=wangzha.query

URL快速搜索

通过提供请求参数,可以纯粹使用URI执行搜索请求。在使用此模式执行搜索时,并非所有搜索选项都显示,但对于快速“卷曲测试”可能非常方便。

GET Twitter / tweet / _search?q =service:wangzha.query

URI中允许的参数是:

q
查询字符串(映射到query_string查询,请参阅 查询字符串查询以获取更多详细信息)。

df
在查询中未定义字段前缀时使用的默认字段。

analyzer
分析查询字符串时要使用的分析器名称。

analyze_wildcard
是否应该分析通配符和前缀查询。默认为false

batched_reduce_size
一次在协调节点上应该减少的分片结果的数量。如果请求中的潜在分片数量可能很大,则应将此值用作保护机制以减少每个搜索请求的内存开销。

default_operator
要使用的默认运算符可以是ANDOR。默认为OR

lenient
如果设置为true,则会导致基于格式的失败(如向数字字段提供文本)被忽略。默认为false

explain
对于每个命中,包含如何计算命中得分的解释。

_source
设置为false禁用检索_source字段。您也可以使用_source_include&获取部分文档_source_exclude(请参阅请求主体 文档以获取更多详细信息)

stored_fields
选择性存储的文件字段为每个命中返回,逗号分隔。没有指定任何值将导致没有字段返回。

sort
排序以执行。可以是fieldName,或者是 fieldName:asc的形式fieldName:descfieldName可以是文档中的实际字段,也可以是_score根据分数表示排序的特殊名称。可以有几个sort参数(顺序很重要)。

track_scores
排序时,设置为true仍然可以跟踪分数并将它们作为每次击中的一部分返回。

timeout
搜索超时,限制在指定时间值内执行的搜索请求,并在到期时积累至该点的保留时间。默认没有超时。

terminate_after
为每个分片收集的文档的最大数量,一旦达到该数量,查询执行将提前终止。如果设置,则响应将有一个布尔型字段terminated_early来指示查询执行是否实际已经terminate_early。缺省为no terminate_after

from
从命中的索引开始返回。默认为0。

size
要返回的点击次数。默认为10。

search_type
要执行的搜索操作的类型。可以是 dfs_query_then_fetchquery_then_fetch。默认为query_then_fetch。有关可以执行的不同搜索类型的更多详细信息,请参阅 搜索类型。

搜索请求体

GET sfeicuss/servicelog/_search
{
  "query":{
    "term": {
      "service": "wangzha.company"
    }
  }
}

部分返回结果:

{
  "took": 88,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 5,
    "max_score": 0.2876821,
    "hits": [
      {
        "_index": "sfeicuss",
        "_type": "servicelog",
        "_id": "5",
        "_score": 0.2876821,
        "_source": {
          "id": "1",
          "service": "wangzha.company",
          "appCode": "cms",
          "source": "yidong",
          "serviceResponseCode": "00004",
          "bizResponseCode": "0",
          "requestTime": "",
          "responseTime": ""
        }
      },

timeout
搜索超时,限制在指定时间值内执行的搜索请求,并在到期时积累至该点的保留时间。默认没有超时。请参阅时间单位编辑。

from
从特定偏移量检索匹配。默认为0

size
要返回的点击次数。默认为10。如果您不关心是否获得一些点击率,而只是关于匹配和/或聚合的数量,则将值设置为0有助于提升性能。

search_type
要执行的搜索操作的类型。可以是 dfs_query_then_fetchquery_then_fetch。默认为query_then_fetch

request_cache
设置为truefalse启用或禁用请求的搜索结果,其中的缓存size为0,即聚合和建议(无排名靠前返回)。

terminate_after
为每个分片收集的文档的最大数量,一旦达到该数量,查询执行将提前终止。如果设置,则响应将有一个布尔型字段terminated_early来指示查询执行是否实际已经terminate_early。缺省为no terminate_after

batched_reduce_size
一次在协调节点上应该减少的分片结果的数量。如果请求中的潜在分片数量可能很大,则应将此值用作保护机制以减少每个搜索请求的内存开销。

注意:
1、search_typerequest_cache必须作为查询字符串参数传递。搜索请求的其余部分应该在主体内传递。主体内容也可以作为名为REST的参数传递source。

2、HTTP GETHTTP POST都可以用于执行搜索正文。由于并非所有客户端都支持GET,因此POST也是允许的。

快速检索任何匹配的文档:

如果我们只想知道是否有与特定查询匹配的文档,我们可以将其size设置0为表示我们对搜索结果不感兴趣。此外,我们可以设置terminate_after1 指示只要找到第一个匹配文档(每个分片)就可以终止查询执行。

GET / _search?q=message:elasticsearch&size=0&terminate_after=1

响应结果:

{
  "took": 3,
  "timed_out": false,
  "terminated_early": true,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped" : 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 0.0,
    "hits": []
  }
}

响应将不包含任何命中,因为size被设置为0。在 hits.total将或者等于0,这表明没有匹配的文档,或者大于0这意味着至少有一样多的文档匹配查询时,它被提前终止。此外,如果查询被提前终止,该terminated_early标志将被设置为true响应中。

一些查询的示例:

分页查询:结果分页可以通过使用from和size 参数来完成。该from参数定义了您想要获取的第一个结果的偏移量。该size参数允许您配置要返回的最大命中数量。

GET /_search
{
    "from" : 0,"size" : 10,
    "query" : {
        "term" : { "user" : "kimchy" }
    }
}

注意:from+ size不能超过index.max_result_window 默认为10000 的索引设置。

排序:允许在特定字段上添加一个或多个排序。每种排序都可以颠倒。排序是在每个字段级别上定义的,具有特殊字段名称用于_score按分数排序,并按_doc索引顺序排序。

假设以下索引映射:

PUT /my_index
{
    "mappings": {
        "my_type": {
            "properties": {
                "post_date": { "type": "date" },
                "user": {
                    "type": "keyword"
                },
                "name": {
                    "type": "keyword"
                },
                "age": { "type": "integer" }
            }
        }
    }
}
GET /my_index/my_type/_search
{
    "sort" : [
        { "post_date" : {"order" : "asc"}},
        "user",
        { "name" : "desc" },
        { "age" : "desc" },
        "_score"
    ],
    "query" : {
        "term" : { "user" : "kimchy" }
    }
}

_doc除了最有效的排序顺序之外,没有真正的用例。所以如果你不关心文件返回的顺序,那么你应该排序_doc。这在滚动时特别有用。

排序顺序:该顺序默认为desc在排序时;按_score排序时,默认asc排序。

Elasticsearch支持按数组多值字段进行排序。该mode选项控制选择何种数组值来对它所属的文档进行排序。该mode选项可以具有以下值:
min:选择最低值。
max:选择最高的价值。
sum:使用所有值的总和作为排序值。仅适用于基于数字的数组字段。
avg:使用所有值的平均值作为排序值。仅适用于基于数字的数组字段。
median:使用所有值的中值作为排序值。仅适用于基于数字的数组字段。

排序示例一:
字段价格每个文档有多个价格。在这种情况下,结果匹配将根据每份文件的平均价格按价格上升进行排序。

PUT /my_index/my_type/1?refresh
{
   "product": "chocolate",
   "price": [20, 4]
}

POST /_search
{
   "query" : {
      "term" : { "product" : "chocolate" }
   },
   "sort" : [
      {"price" : {"order" : "asc", "mode" : "avg"}}
   ]
}

嵌套对象排序Elasticsearch还支持通过一个或多个嵌套对象内的字段进行排序。通过嵌套字段支持进行排序在已有的排序选项之上具有以下参数:
nested_path:定义要排序的嵌套对象。实际的排序字段必须是此嵌套对象内的直接字段。当按嵌套字段排序时,该字段是强制性的。
nested_filter:一个过滤器,嵌套路径中的内部对象应该匹配,以便通过排序来考虑其字段值。常见的情况是在嵌套的过滤器或查询中重复查询/过滤器。默认情况下,no nested_filter是活动的。

排序示例二:
在下面的例子中offer是一个nested类型的字段,nested_path待指定的需要; 否则,elasticsearch不知道需要捕获什么嵌套级别的排序值。

POST /_search
{
   "query" : {
      "term" : { "product" : "chocolate" }
   },
   "sort" : [
       {
          "offer.price" : {
             "mode" :  "avg",
             "order" : "asc",
             "nested_path" : "offer",
             "nested_filter" : {
                "term" : { "offer.color" : "blue" }
             }
          }
       }
    ]
}

missing参数指定如何其缺少字段文档应被视为:该missing值可以被设置为_last_first或自定义的值(将被用于缺少文档作为排序值)。默认是_last。下面示例:

GET /_search
{
    "sort" : [
        { "price" : {"missing" : "_last"} }
    ],
    "query" : {
        "term" : { "product" : "chocolate" }
    }
}

默认情况下,如果没有与字段关联的映射,搜索请求将失败。该unmapped_type选项允许忽略没有映射并且不能按照它们排序的字段。该参数的值用于确定要发出的排序值。这是一个如何使用它的例子:

GET /_search
{
    "sort" : [
        { "price" : {"unmapped_type" : "long"} }
    ],
    "query" : {
        "term" : { "product" : "chocolate" }
    }
}

如果查询的任何索引都没有映射price ,那么Elasticsearch将处理它,就好像存在类型映射一样, long此索引中的所有文档都没有该字段的值。

允许基于自定义脚本进行排序,这里是一个例子:

GET /_search
{
    "query" : {
        "term" : { "user" : "kimchy" }
    },
    "sort" : {
        "_script" : {
            "type" : "number",
            "script" : {
                "lang": "painless",
                "source": "doc['field_name'].value * params.factor",
                "params" : {
                    "factor" : 1.1
                }
            },
            "order" : "asc"
        }
    }
}

追踪分数:在字段上排序时,不计算分数。通过设置 track_scorestrue,分数仍将被计算和跟踪。示例:

GET /_search
{
    "track_scores": true,
    "sort" : [
        { "post_date" : {"order" : "desc"} },
        { "name" : "desc" },
        { "age" : "desc" }
    ],
    "query" : {
        "term" : { "user" : "kimchy" }
    }
}

注意:
排序时,相关的排序字段值将加载到内存中。这意味着每个分片应该有足够的内存来容纳它们。对于基于字符串的类型,不应分析/标记字段。对于数字类型,如果可能的话,建议将类型显式设置为更窄的类型(如short,integer和 float)。

总结,排序模式有如下:

  • 基于数组或多个字段排序
  • 嵌套排序
  • 缺少值排序
  • 忽略未映射字段排序
  • 基于地理位置的排序
  • 基于脚本的排序
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值