首页 > ELK > elasticsearch中SearchApi的详解
2019
07-16

elasticsearch中SearchApi的详解

搜索流程

当一个搜索请求被发送到某个节点时,这个节点就变成了协调节点。 这个节点的任务是广播查询请求到所有相关分片并将它们的响应整合成全局排序后的结果集合,这个结果集合会返回给客户端。多索引搜索恰好也是用相同的方式-只是会涉及到更多的分片。

查询阶段

客户端发送一个 search 请求到 Node 3 , Node 3 会创建一个大小为 from + size 的空优先队列。
Node 3 将查询请求转发到索引的每个主分片或副本分片中。每个分片在本地执行查询并添加结果到大小为 from + size 的本地有序优先队列中。
每个分片返回各自优先队列中所有文档的 ID 和排序值给协调节点,也就是 Node 3 ,它合并这些值到自己的优先队列中来产生一个全局排序后的结果列表。

取回阶段

协调节点辨别出哪些文档需要被取回并向相关的分片提交多个 GET 请求(每个分片创建一个 multi-get request)。例如,如果我们的查询指定了 { "from": 90, "size": 10 } ,最初的90个结果会被丢弃,只有从第91个开始的10个结果需要被取回。每个分片加载并丰富(元数据和高亮显示)文档,如果有需要的话,接着返回文档给协调节点。一旦所有的文档都被取回了,协调节点返回结果给客户端。

 注意:搜索一个索引有五个主分片和搜索五个索引各有一个分片准确来所说是等价的。


1.multi index/type

GET /_search                         //搜索所有的索引中所有的类型
GET /alibaba/_search                 //在alibaba索引中搜索所有的类型
GET /alibaba,kxtx/_search            //在alibaba和kxtx索引中中搜索所有的文档
GET /m*,k*/_search                   //在任何以m或者k开头的索引中搜索所有的类型 
GET /alibaba/employee/_search        //在alibaba索引中搜索employee类型
GET /gb,us/user,tweet/_search        //在gb和us索引中搜索user和tweet类型
GET /_all/user,tweet/_search         //在所有的索引中搜索user和tweet 类型

search结果解析

{
   "hits" : {                         
      "total" :       14,             //匹配到的文档总数
      "hits" : [                      //文档结果集
        {
          "_index":   "us",
          "_type":    "tweet",
          "_id":      "7",
          "_score":   1,               //它衡量了文档与查询的匹配程度,默认是按照_score降序排列的
          "_source": {                 //原始文档
             "date":    "2014-09-17",
             "name":    "John Smith",
             "tweet":   "The Query DSL is really powerful and flexible",
             "user_id": 2
          }
       }
      ],
      "max_score" :   1              //与查询所匹配文档的_score的最大值
   },
   "took" :           4,             //整个请求耗费了多少毫秒
   "_shards" : {                     //查询中参与分片的总数
      "failed" :      0,             //正常情况下我们不希望分片失败,但是分片失败是可能发生的(遭遇到一种灾难级别的故障:丢失了相同分片的原始数据和副本)
      "successful" :  10,
      "total" :       10
   },
   "timed_out" :      false          //查询是否超时,默认情况下,搜索请求不会超时    
}

_score 详解

相似度算法被定义为检索词频率(检索词在该字段出现的频率)/反向文档频率(检索词在索引中出现的频率),即TF/IDF和字段长度准则(长度越长,相关性越低)。 相关性得分由一个浮点数进行表示,通过_score 参数返回,默认排序是_score降序。

有时候精确匹配,相关性评分对你来说并没有意义,它默认会返回0。但如果评分为零对你造成了困扰,可以使用constant_score查询进行替代,它会返回恒定分数(默认为 1 )。

计算_score的花销巨大,通常仅用于排序;我们并不根据相关性排序,那它没有意义的。如果无论如何你都要计算_score,你可以将track_scores参数设置为true。

更多参考:https://www.elastic.co/guide/en/elasticsearch/reference/7.9/search-search.html

2.URI Search(q query string parameter)

“简易版”的查询字符串(query string)将所有参数通过查询字符串定义

GET /phpmianshi/user/_search?q=last_name:Smith  //精确 where last_name like '%Smith%'
GET /phpmianshi/_search?q=+name:trying +date:2014  //where name like '%trying%' or date like '%2014%'

"+" 前缀表示语句匹配条件必须被满足。类似的 "-" 前缀表示条件必须不被满足。所有条件如果没有 + 或 - 表示是可选的

参数说明

q

查询字符串,映射到query_string字段值(Query Dsl String Query

You can use the q parameter to run a query parameter search. Query parameter searches do not support the full Elasticsearch Query DSL but are handy for testing.


注意:

The q parameter overrides the query parameter in the request body. If both parameters are specified, documents matching the query request body parameter are not returned.

sort排序以执行,可以是fieldname的形式,也可以是fieldname:asc/fieldname:desc的形式
timeout

搜索超时,限定要在指定的时间值内执行的搜索请求,并在到期时将命中累积到该时间点。

timeout不是停止执行查询,它仅仅是告知正在协调的节点返回到目前为止收集的结果并且关闭连接,在后台,其他的分片可能仍在执行查询即使是结果已经被发送了。

默认为无超时。如果觉得麻烦,它支持全局超时配置

from

要返回的点击量的起始索引。默认值为0。

size要返回的命中数。默认值为10。
search_type查询的执行方式,可选值dfs_query_then_fetch or query_then_fetch ,默认: query_then_fetch,它有预查询阶段(从所有相关分片获取词频来计算全局词频)会破坏相关度,缺省值只在主分片上计算相关度

3.Request Body Search

搜索语言叫做结构化查询语句(DSL) ,以JSON格式在请求体中定义查询query。

GET /phpmianshi/_search
{
 "query": {
   "term": {
     "user.id": "kimchy"
   }
 }
}



本文》有 0 条评论

留下一个回复