搜索接口概述

来源:互联网 发布:幻城网络更新时间 编辑:程序博客网 时间:2024/04/24 13:01

原文地址:https://es.xiaoleilu.com/

节点 说明 对应数据库 _index 文档存储的地方 数据库 _type 文档代表的对象的类 数据表 _id 文档的唯一标识 表中每一列数据

API

检索文档

GET /_index/_type/_id

响应:

{  "_index" :   "索引名",  "_type" :    "类型名",  "_id" :      "文档唯一标识",  "_version" : 1,  "found" :    true,  "_source" :  {    // 这里是检索的数据详情  }}

简单检索

GET /_index/_type/_search

应内容的hits数组中包含了我们所有的三个文档。默认情况下搜索会返回前10个结果。

{   "took":      6,   "timed_out": false,   "_shards": { ... },   "hits": {      "total":      3,      "max_score":  1,      "hits": [         {            "_index":         "索引名",            "_type":          "类型名",            "_id":            "文档唯一标识",            "_score":         1,            "_source": {               // 这里是检索的数据详情            }         },         ...      ]   }}

hits:
响应中最重要的部分是hits,它包含了total字段来表示匹配到的文档总数,hits数组还包含了匹配到的前10条数据。
hits数组中的每个结果都包含_index、_type和文档的_id字段,被加入到_source字段中这意味着在搜索结果中我们将可以直接使用全部文档。这不像其他搜索引擎只返回文档ID,需要你单独去获取文档。
每个节点都有一个_score字段,这是相关性得分(relevance score),它衡量了文档与查询的匹配程度。默认的,返回的结果中关联性最大的文档排在首位;这意味着,它是按照_score降序排列的。这种情况下,我们没有指定任何查询,所以所有文档的相关性是一样的,因此所有结果的_score都是取得一个中间值1
max_score指的是所有文档匹配查询中_score的最大值。

took:
took告诉我们整个搜索请求花费的毫秒数。

shards:
_shards节点告诉我们参与查询的分片数(total字段),有多少是成功的(successful字段),有多少的是失败的(failed字段)。通常我们不希望分片失败,不过这个有可能发生。如果我们遭受一些重大的故障导致主分片和复制分片都故障,那这个分片的数据将无法响应给搜索请求。这种情况下,Elasticsearch将报告分片failed,但仍将继续返回剩余分片上的结果。

timeout:
time_out值告诉我们查询超时与否。一般的,搜索请求不会超时。如果响应速度比完整的结果更重要,你可以定义timeout参数为10或者10ms(10毫秒),或者1s(1秒)

GET /_search?timeout=10ms

GET /_index/_type/_search?q=field:value

我们在请求中依旧使用_search关键字,然后将查询语句传递给参数q=。

{   ...   "hits": {      "total":      2,      "max_score":  0.30685282,      "hits": [         {            ...            "_source": {               //这里是检索的数据详情            }         },         {            ...            "_source": {               //这里是检索的数据详情            }         }      ]   }}

使用DSL语句查询

DSL(Domain Specific Language特定领域语言)以JSON请求体的形式出现。

GET /_index/_type/_search{    "query" : {        "match" : {            "field" : "value"        }    }}

这会返回与之前查询相同的结果。你可以看到有些东西改变了,我们不再使用查询字符串(query string)做为参数,而是使用请求体代替。这个请求体使用JSON表示,其中使用了match语句(查询类型之一)。

更复杂的搜索

我们让搜索稍微再变的复杂一些。我们想要找到姓名为“test”,但是我们只想得到年龄大于30岁。我们的语句将添加过滤器(filter),它使得我们高效率的执行一个结构化搜索:

GET /megacorp/employee/_search{    "query" : {        "filtered" : {            "filter" : {                "range" : {                    "age" : { "gt" : 30 } <1>                }            },            "query" : {                "match" : {                    "name" : "test" <2>                }            }        }    }}
  • <1> 这部分查询属于区间过滤器(range filter),它用于查找所有年龄大于30岁的数据——gt为”greater than”的缩写。
  • <2> 这部分查询与之前的match语句(query)一致。

全文搜索

到目前为止搜索都很简单:搜索特定的名字,通过年龄筛选。让我们尝试一种更高级的搜索,全文搜索——一种传统数据库很难实现的功能。

GET /_index/_type/_search{    "query" : {        "match" : {            "field" : "value"        }    }}

你可以看到我们使用了之前的match查询,从key字段中搜索”value”

{   ...   "hits": {      "total":      2,      "max_score":  0.16273327,      "hits": [          {            ...            "_score":         0.16273327, <1>            "_source": {               // 检索的具体数据            }         },{            ...            "_score":         0.016878016, <2>            "_source": {               // 检索的具体数据            }         }      ]   }}
  • <1><2> 结果相关性评分。

默认情况下,Elasticsearch根据结果相关性评分来对结果集进行排序,所谓的「结果相关性评分」就是文档与查询条件的匹配程度。

短语搜索

目前我们可以在字段中搜索单独的一个词,这挺好的,但是有时候你想要确切的匹配若干个单词或者短语(phrases)。例如我们想要查询同时包含”value1”和”value2”(并且是相邻的)的记录。

要做到这个,我们只要将match查询变更为match_phrase查询即可:

GET /_index/_type/_search{    "query" : {        "match_phrase" : {            "field" : "value1 value2"        }    }}

高亮我们的搜索

很多应用喜欢从每个搜索结果中高亮(highlight)匹配到的关键字,这样用户可以知道为什么这些文档和查询相匹配。在Elasticsearch中高亮片段是非常容易的。

让我们在之前的语句上增加highlight参数:

GET /_index/_type/_search{    "query" : {        "match_phrase" : {            "field" : "value1 value2"        }    },    "highlight": {        "fields" : {            "field" : {}        }    }}

当我们运行这个语句时,会命中与之前相同的结果,但是在返回结果中会有一个新的部分叫做highlight,这里包含了来自field字段中的文本,并且用来标识匹配到的单词。

{   ...   "hits": {      "total":      1,      "max_score":  0.23013961,      "hits": [         {            ...            "_score":         0.23013961,            "_source": {               // 其他属性               "field":"I love to go value1 value2"            },            "highlight": {               "field": [                  "I love to go <em>value1</em> <em>value2</em>" <1>               ]            }         }      ]   }}
  • <1> 原有文本中高亮的片段
0 0