首页 > 其他分享 >elasticsearch中SearchApi的详解

elasticsearch中SearchApi的详解

时间:2022-12-26 15:04:02浏览次数:55  
标签:search SearchApi GET 查询 索引 详解 elasticsearch 分片 query

 ​

搜索流程

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

查询阶段

客户端发送一个 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。

 

 

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"
   }
 }
}

  

标签:search,SearchApi,GET,查询,索引,详解,elasticsearch,分片,query
From: https://blog.51cto.com/u_6353447/5968975

相关文章

  • 浏览器大文件上传详解及实例代码
    ​ 4GB以上超大文件上传和断点续传服务器的实现随着视频网站和大数据应用的普及,特别是高清视频和4K视频应用的到来,超大文件上传已经成为了日常的基础应用需求。但是在......
  • 001 MATLAB-plotyy-函数详解
    plot1定义plot()——matlab中二维画图的函数,函数返回值是各个线条的句柄。2调用格式2.1plot(y)当y为向量时,是以y的分量为纵坐标,以元素序号为横坐标,用直线依次连接......
  • WebUploader大文件上传详解及实例代码
    ​ javaweb上传文件上传文件的jsp中的部分上传文件同样可以使用form表单向后端发请求,也可以使用ajax向后端发请求    1.通过form表单向后端发送请求     ......
  • Pytorch 动态图, Autograd, grad_fn详解
    Pytorch动态图Autogradgrad_fn详解Autogradrequire_grad具有传递性,会将其结果也引入计算图中requires_grad iscontagious.Itmeansthatwhena Tensor iscre......
  • STL中map用法详解
    Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处......
  • IOCP详解
    IOCP(I/OCompletionPort,I/O完成端口)是性能最好的一种I/O模型。它是应用程序使用线程池处理异步I/O请求的一种机制。在处理多个并发的异步I/O请求时,以往的模型都是在接收请......
  • HTML5大文件上传详解及实例代码
    ​ 对于大文件的处理,无论是用户端还是服务端,如果一次性进行读取发送、接收都是不可取,很容易导致内存问题。所以对于大文件上传,采用切块分段上传,从上传的效率来看,利用多......
  • Android.mk 文件语法详解
    0.Android.mk简介:Android.mk文件用来告知NDKBuild系统关于Source的信息。Android.mk将是GNUMakefile的一部分,且将被BuildSystem解析一次或多次。所以,请尽量少的在A......
  • X264编码流程详解
    对H.264编码标准一直停留在理解原理的基础上,对于一个实际投入使用的编码器是如何构建起来一直感觉很神秘,于是决定在理解理论的基础上潜心于编码器实现框架。关于开源的H264......
  • FFmpeg缩放swscale详解
    缩放:      利用ffmpeg进行图像数据格式的转换以及图片的缩放应用中,主要用到了swscale.h文件中的三个函数,分别是:structSwsContext*sws_getContext(int......