搜索接口概述
来源:互联网 发布:幻城网络更新时间 编辑:程序博客网 时间:2024/04/24 13:01
原文地址:https://es.xiaoleilu.com/
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> 原有文本中高亮的片段
- 搜索接口概述
- 搜索概述
- 接口概述
- 接口概述
- C#接口-接口概述
- 文献搜索方法概述
- 文献搜索方法概述
- FAST搜索应用领域概述
- 电信行业搜索应用概述
- 电信行业搜索应用概述
- 文献搜索方法概述
- 分布式搜索Elasticsearch 概述
- 搜索技术概述
- 记忆化搜索概述
- 显卡输出接口概述
- 显卡输出接口概述
- JTAG接口概述
- Windows开发接口概述
- Struts拦截器-配置及简单应用示例-ssh项目
- 【LeetCode】查找数组系列
- jquery方法:text()、val()、html()区别
- 网页常见功能,超出宽度,省略号代替
- Angular开发(三)-关于属性绑定与事件绑定
- 搜索接口概述
- 《第一行代码》笔记——第1章 开始启程—你的第一行Android代码
- Deep Forest
- scrapy post request 和response方法
- 动态规划——数对之差的最大值
- Android 案例:商品展示
- this
- [bash]比较运算总结
- sleep()和wait()的区别