教程
关于 入门 为了搜索,你懂的 安装Elasticsearch 与Elasticsearch交互 面向文档 开始第一步 检索文档 分析 教程小结 分布式的特性 下一步 集群内部工作方式 空集群 集群健康 添加索引 增加故障转移 横向扩展 继续扩展 应对故障 数据吞吐 什么是文档? 索引一个文档 检索文档 检查文档是否存在 更新整个文档 创建一个新文档 删除文档 处理冲突 文档局部更新 检索多个文档 更省时的批量操作 结语 分布式文档存储 路由文档到分片 主分片和复制分片如何交互 新建、索引和删除文档 检索文档 局部更新文档 多文档模式 为什么是奇怪的格式? 搜索——基本的工具 空搜索 多索引和多类别 分页 简易搜索 映射和分析 映射及分析 确切值(Exact values) vs. 全文文本(Full text) 倒排索引 分析和分析器 映射 复合核心字段类型 结构化查询 请求体查询 结构化查询 Query DSL 查询与过滤 最重要的查询过滤语句 查询与过滤条件的合并 验证查询 结语 排序 相关性排序 多值字段字符串排序 相关性简介 数据字段 分布式搜索的执行方式 查询阶段 取回阶段 搜索选项 扫描和滚屏 索引管理 创建索引 索引设置 配置分析器 自定义分析器 类型和映射 根对象 元数据:_source 字段 元数据:_all 字段 文档 ID 动态映射 自定义动态索引 默认映射 重新索引数据 索引别名和零停机时间 入门 使文本可以被搜索 动态索引 近实时搜索 持久化变更 合并段 结构化搜索 查找准确值 组合过滤 查询多个准确值 包含,而不是相等 范围 处理 Null 值 关于缓存 过滤顺序 地理坐标点 地理坐标点 通过地理坐标点过滤 地理坐标盒模型过滤器 地理距离过滤器 缓存地理位置过滤器 减少内存占用 按距离排序 Geohashes Geohashes Geohashes 映射 geohash单元过滤器 地理位置聚合 地理位置聚合 按距离聚合 geohash单元聚合器 范围(边界)聚合器 地理形状 地理形状 映射地理形状 索引地理形状 查询地理形状 在查询中使用已索引的形状 地理形状的过滤与缓存 嵌套 嵌套-对象 嵌套-映射 嵌套-查询 嵌套排序 嵌套-集合

发布于 2016-02-29 14:31:07 | 692 次阅读 | 评论: 0 | 来源: 网络整理

相关性排序

默认情况下,结果集会按照相关性进行排序 -- 相关性越高,排名越靠前。 这一章我们会讲述相关性是什么以及它是如何计算的。 在此之前,我们先看一下sort参数的使用方法。

排序方式

为了使结果可以按照相关性进行排序,我们需要一个相关性的值。在ElasticSearch的查询结果中, 相关性分值会用_score字段来给出一个浮点型的数值,所以默认情况下,结果集以_score进行倒序排列。

有时,即便如此,你还是没有一个有意义的相关性分值。比如,以下语句返回所有tweets中 user_id 是否 包含值 1

GET /_search
{
    "query" : {
        "filtered" : {
            "filter" : {
                "term" : {
                    "user_id" : 1
                }
            }
        }
    }
}

过滤语句与 _score 没有关系,但是有隐含的查询条件 match_all 为所有的文档的 _score 设值为 1。 也就相当于所有的文档相关性是相同的。

字段值排序

下面例子中,对结果集按照时间排序,这也是最常见的情形,将最新的文档排列靠前。 我们使用 sort 参数进行排序:

GET /_search
{
    "query" : {
        "filtered" : {
            "filter" : { "term" : { "user_id" : 1 }}
        }
    },
    "sort": { "date": { "order": "desc" }}
}

你会发现这里有两个不同点:

"hits" : {
    "total" :           6,
    "max_score" :       null, <1>
    "hits" : [ {
        "_index" :      "us",
        "_type" :       "tweet",
        "_id" :         "14",
        "_score" :      null, <1>
        "_source" :     {
             "date":    "2014-09-24",
             ...
        },
        "sort" :        [ 1411516800000 ] <2>
    },
    ...
}

`_score` 字段没有经过计算,因为它没有用作排序。 `date` 字段被转为毫秒当作排序依据。 首先,在每个结果中增加了一个 `sort` 字段,它所包含的值是用来排序的。 在这个例子当中 `date` 字段在内部被转为毫秒,即长整型数字`1411516800000`等同于日期字符串 `2014-09-24 00:00:00 UTC`。 其次就是 `_score` 和 `max_score` 字段都为 `null`。计算 `_score` 是比较消耗性能的, 而且通常主要用作排序 -- 我们不是用相关性进行排序的时候,就不需要统计其相关性。 如果你想强制计算其相关性,可以设置`track_scores`为 `true`。 ## 默认排序 **** 作为缩写,你可以只指定要排序的字段名称: ```Javascript "sort": "number_of_children" ``` 字段值默认以顺序排列,而 `_score` 默认以倒序排列。 **** ## 多级排序 如果我们想要合并一个查询语句,并且展示所有匹配的结果集使用第一排序是`date`,第二排序是 `_score`: ```Javascript GET /_search { "query" : { "filtered" : { "query": { "match": { "tweet": "manage text search" }}, "filter" : { "term" : { "user_id" : 2 }} } }, "sort": [ { "date": { "order": "desc" }}, { "_score": { "order": "desc" }} ] } ``` 排序是很重要的。结果集会先用第一排序字段来排序,当用用作第一字段排序的值相同的时候, 然后再用第二字段对第一排序值相同的文档进行排序,以此类推。 多级排序不需要包含 `_score` -- 你可以使用几个不同的字段,如位置距离或者自定义数值。 ## 字符串参数排序 **** 字符查询也支持自定义排序,在查询字符串使用`sort`参数就可以: ```Javascript GET /_search?sort=date:desc&sort=_score&q=search ``` **** ## 为多值字段排序 在为一个字段的多个值进行排序的时候, 其实这些值本来是没有固定的排序的-- 一个拥有多值的字段就是一个集合, 你准备以哪一个作为排序依据呢? 对于数字和日期,你可以从多个值中取出一个来进行排序,你可以使用`min`, `max`, `avg` 或 `sum`这些模式。 比说你可以在 `dates` 字段中用最早的日期来进行排序: ```Javascript "sort": { "dates": { "order": "asc", "mode": "min" } } ```

最新网友评论  共有(0)条评论 发布评论 返回顶部

Copyright © 2007-2017 PHPERZ.COM All Rights Reserved   冀ICP备14009818号  版权声明  广告服务