首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

索引上的Elasticsearch排序设置产生奇怪的结果

基础概念

Elasticsearch 是一个基于 Lucene 的分布式搜索和分析引擎,它提供了全文搜索、结构化搜索和分析等功能。索引(Index)是 Elasticsearch 中存储数据的地方,类似于关系数据库中的表。排序(Sorting)是指按照特定字段的值对搜索结果进行排序的过程。

相关优势

  1. 高性能:Elasticsearch 能够快速地进行全文搜索和复杂查询。
  2. 分布式:数据可以分布在多个节点上,提供高可用性和可扩展性。
  3. 灵活性:支持多种数据类型和复杂的查询语法。
  4. 实时性:数据更新后,搜索结果可以立即反映出来。

类型

Elasticsearch 支持多种排序方式:

  1. 字段排序:按照某个字段的值进行排序。
  2. 脚本排序:使用自定义的脚本来计算排序值。
  3. 多字段排序:按照多个字段的值进行排序。
  4. 地理空间排序:按照地理位置进行排序。

应用场景

Elasticsearch 排序广泛应用于各种场景,如:

  • 搜索引擎:按照相关性、时间等对搜索结果进行排序。
  • 日志分析:按照时间、严重性等对日志进行排序。
  • 电商网站:按照价格、评分等对商品进行排序。

可能遇到的问题及原因

奇怪的排序结果

原因

  1. 字段类型不匹配:排序字段的数据类型与实际数据不匹配。
  2. 分词器问题:文本字段的分词器设置不当,导致排序结果不符合预期。
  3. 脚本错误:自定义排序脚本存在错误。
  4. 数据不一致:索引中的数据存在不一致性,影响排序结果。

解决方法

  1. 检查字段类型: 确保排序字段的数据类型与实际数据一致。例如,如果字段是数值类型,确保数据也是数值类型。
  2. 检查字段类型: 确保排序字段的数据类型与实际数据一致。例如,如果字段是数值类型,确保数据也是数值类型。
  3. 调整分词器: 如果排序字段是文本类型,确保使用合适的分词器。例如,对于中文文本,可以使用 ik_max_word 分词器。
  4. 调整分词器: 如果排序字段是文本类型,确保使用合适的分词器。例如,对于中文文本,可以使用 ik_max_word 分词器。
  5. 检查脚本排序: 如果使用自定义脚本进行排序,确保脚本没有错误。例如,使用 Painless 脚本语言:
  6. 检查脚本排序: 如果使用自定义脚本进行排序,确保脚本没有错误。例如,使用 Painless 脚本语言:
  7. 数据一致性: 确保索引中的数据一致,避免数据不一致导致的排序问题。可以通过重新索引或数据清洗来解决。

示例代码

假设有一个商品索引 products,包含 nameprice 字段,我们希望按照价格进行排序:

代码语言:txt
复制
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "price": {
        "order": "asc"
      }
    }
  ]
}

参考链接

通过以上步骤,您应该能够解决 Elasticsearch 排序设置产生奇怪结果的问题。如果问题仍然存在,建议查看 Elasticsearch 的日志文件,以获取更多详细的错误信息。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Elasticsearch聚合学习之五:排序结果不准问题分析

https://blog.csdn.net/boling_cavalry/article/details/90319399 Elasticsearch索引如果有多个分片,那么在聚合排序后取...TopN时,返回结果可能是不准,今天我们就通过实战来研究分析此问题,并验证解决方法; 环境信息 以下是本次实战环境信息,请确保您Elasticsearch可以正常运行: 操作系统:Ubuntu...聚合学习之二:区间聚合》; 《Elasticsearch聚合学习之三:范围限定》; 《Elasticsearch聚合学习之四:结果排序》; 《Elasticsearch聚合学习之五:排序结果不准问题分析...,然后将每个分片前17名放在一起再次聚合,再排序,将排序前5条记录作为结果返回; 为什么用每个分片前17名?...5,于是ES返回Top5与真实数据Top5就不一样了,这就是Elasticsearch聚合后排序不准原因。

2.8K30

触类旁通Elasticsearch:优化

多条搜索和多条获取 多条搜索(multisearch)和条获取(multiget)所带来好处和批量相似,节省花费在网络延迟上时间。...translog设置是具体到索引上,控制了触动flush规模(flush_threshold_size)。...所有这些选项是具体到索引上,而且和事务日志刷新设置一样,可以在运行时修改这些设置,例如,下面的代码将segments_per_tier设置成5,会导致更多合并,将最大分段规模降低到1GB,并将线程数降低到...scan搜索类型总是按照结果在索引中被发现顺序来返回它们,而忽略了排序条件。如果同时需要深度分页和排序,可以为普通搜索请求增加scroll参数。向滚动ID发送GET请求,将获得下一页结果。..." } } }' 从性能角度而言,将scroll加入普通搜索比使用scan搜索类型更耗资源,原因是当结果排序时候,需要在内存中保留更多信息。

1.1K30
  • Elasticsearch 6.x版本全文检索学习之数据建模

    4、Elasticsearch数据建模中Mapping字段相关设置。   答:a、enabled,值包含true、false。仅存储,不做搜索或者聚合分析。     ...需要检索index设置true,否则设置为false。     第三步、是否需要排序和聚合分析。doc_values,是否启动doc_values,用于排序和聚合分析。     ...7、Mapping字段属性设定流程,是否需要检索。   答:a、完全不需要检索,排序,聚合分析字段。enabled设置为false。     ...Comments默认是Objetc Array类型,存储结果类型是对应字段在一个括号里面。 ? 使用nested object解决查询结果不符合要求现象。 ?...答:a、_update_by_query在现有索引上重建。     b、_reindex在其他索引上重建。 ? ?

    93820

    ElasticSearch Scroll游标搜索

    在搜索初始化完成后,搜索不会看到之后发生在索引上更改。通过保留旧数据文件来实现这一点,以便可以保留其在开始搜索时索引视图。...深分页代价主要花费在结果数据全局排序上,如果我们禁用排序,那么我们可以花费较少代价就能返回所有的文档。为此,我们按 _doc 排序。...这样 Elasticsearch 只是从仍然还有结果数据需要返回每个分片返回下一批结果。...超时设置是非常重要,因为保持游标查询窗口打开需要消耗资源,我们希望在不再需要时释放它们。设置这个超时能够让 Elasticsearch 在稍后空闲时候自动释放这部分资源。...并且根据_doc进行排序; 这个查询返回结果包括一个 _scroll_id 字段,它是一个Base-64编码长字符串。

    2.3K30

    Elasticsearch数据搜索原理

    查询计划描述了如何在倒排索引上执行查询,包括哪些词项需要查询、如何组合词项查询结果等。 执行查询:有了查询计划后,Elasticsearch 就可以在倒排索引上执行查询了。...这个过程主要包括以下步骤: 排序Elasticsearch 会根据每个文档和查询相关性,对候选结果集进行排序。...分页:如果查询请求中指定了分页参数,Elasticsearch 会根据这些参数,从排序结果集中提取出一个页面的结果。 返回结果:最后,Elasticsearch 会将查询结果返回给用户。...相关性评分作用主要体现在以下几个方面: 排序:在返回查询结果时,Elasticsearch 会根据相关性评分对结果进行排序。评分越高文档,被认为与查询条件匹配程度越高,因此会被排在更前面。...因此,对于不需要排序或聚合字段,你可以在映射中将 doc_values 设置为 false,以节省磁盘空间。

    44720

    2022 最新 Elasticsearch 面试题

    1、elasticsearch 了解多少,说说你们公司 es 集群架构, 引数据大小,分片有多少,以及一些调优手段 。...3、 第 2) 步骤结果发送到协调节点, 协调节点产生一个全局排序列表。 fetch 阶段目的 : 取数据。 路由节点获取所有文档, 返回给客户端。...旧版本文档依然能匹配查询, 但是会在结果中被过滤掉。 14、详细描述一下 Elasticsearch 搜索过程。...3、每 个分片返回各自优先队列中 所有文档 ID 和排序值 给协调节点 ,它 合并 这些值到自己优先队列中来产生一个全局排序结果列表。...* 15、在 Elasticsearch 中,是怎么根据一个词找到对应倒排

    13310

    Elasticsearch性能优化实战指南

    作者:铭毅天下 背景 在当今世界,各行各业每天都有海量数据产生,为了从这些海量数据中获取想要分析结果,需要对数据进行提取、转换,存储,维护,管理和分析。...可以将多个索引放入别名中,并且对该别名进行搜索会使查询就像在单个索引上一样。 当然,需要保持好平衡。注意思考:将多少数据写入别名?别名上写入太多小索引会对性能产生负面影响。...1.3、Index Sorting 注意:索引排序机制是6.X版本才有的特性。 在Elasticsearch中创建新索引时,可以配置每个分片中分段排序方式。...默认情况下,Lucene不会应用任何排序。 index.sort.* 定义应使用哪些字段对每个Segment内文档进行排序。...这迫使Elasticsearch每秒创建一个分段。实际业务中,应该根据使用情况增加刷新间隔,举例:增加到30秒。 这样之后,30s产生一个大段,较每秒刷新大大减少未来段合并压力。

    89320

    Elasticsearch性能优化实战指南

    0、背景 在当今世界,各行各业每天都有海量数据产生,为了从这些海量数据中获取想要分析结果,需要对数据进行提取、转换,存储,维护,管理和分析。...可以将多个索引放入别名中,并且对该别名进行搜索会使查询就像在单个索引上一样。 当然,需要保持好平衡。注意思考:将多少数据写入别名?别名上写入太多小索引会对性能产生负面影响。...在Elasticsearch中创建新索引时,可以配置每个分片中分段排序方式。 默认情况下,Lucene不会应用任何排序。....* 定义应使用哪些字段对每个Segment内文档进行排序。...这迫使Elasticsearch每秒创建一个分段。实际业务中,应该根据使用情况增加刷新间隔,举例:增加到30秒。 这样之后,30s产生一个大段,较每秒刷新大大减少未来段合并压力。

    1.8K20

    Elasticsearch:使用游标查询scroll 实现深度分页

    使用 from and size 深度分页,是非常低效,因为排序结果必须从每个分片上取出并重新排序最后返回 10 条。这个过程需要对每个请求页重复。...游标查询允许我们先做查询初始化,然后再批量地拉取结果。这有点儿像传统数据库中 cursor 。 游标查询会取某个时间点快照数据。查询初始化之后索引上任何变化会被它忽略。...它通过保存旧数据文件来实现这个特性,结果就像保留初始化时索引视图一样。 深度分页代价根源是结果集全局排序,如果去掉全局排序特性的话,查询结果成本就会很低。...游标查询默认用字段 _doc 来排序。这个指令让 Elasticsearch 仅仅从还有结果分片返回下一批结果。...设置这个超时能够让 Elasticsearch 在稍后空闲时候自动释放这部分资源。

    5.6K30

    ElasticSearch 搭建自己搜索和分析引擎

    :对原始文档进行分词后用这些词去建立倒排索引,在线上检索时,再将用户查询词进行分词,用分词结果去拉取多个倒排索引拉链结果、归并、相关性排序等,得到最终结果。...,直接在ES去算其实感觉有些奇怪)。...然而这样是有问题:当在多个ES索引上聚合时,ES不会把所有索引结果放在一起聚合TopN,而是单独在每个索引求得TopN后,再放在一起聚合。这是个使用时要注意小坑。...这样导致结果是,直接在多个索引上聚合出TopN,并不是真正TopN(比如3个月中,每个月都是不是Top 1,但三个月加起来就是Top了 1。局部最优不等于全局最优)。...从结果中,我们大概推断出了ES统计聚合运算做法:先把所有符合过滤条件数据全部检索出来,然后在内存中进行排序和聚合运算。也就是说,符合条件数据量级越大,聚合运算越慢。

    6.4K00

    Elasticsearch聚合后分页深入详解

    可概括如下: 1)性能角度——聚合分页会在大量记录中产生性能问题。 2)正确性角度——聚合文档计数不准确。 所以奇怪事情可能会发生,如第二页第一项具有比第一页最后一个元素更高计数。...2、Elasticsearch要实现聚合后分页,该怎么办? 方案:需要展示满足条件全部数据条数,即需要全量聚合,且按照某规则排序。 记住,如果数据基数大(十万、百万甚至千万级),这必然会很慢。...ES5.X/6.X版本设置为2147483647 , 它等于2^31-1, 是32位操作系统中最大符号型整型常量; ES1.X 2.X版本设置为0。...步骤2:将聚合结果存入内存中,可以考虑list或map存储。 这里存入list_id是基于某种规则排序,如:基于插入时间。 步骤3:内存内分页,基于list中存储值结合偏移值进行筛选。...6、小结 待聚合大小size取值越大,结果就越精确,而且计算最终结果代价也越高; 耗时主要体现在: 第一:分片级别巨大优先级队列管理成本; 第二:集群节点和客户端之间数据传输成本。

    6.9K121

    ElasticSearch搭建自己搜索和分析引擎

    :对原始文档进行分词后用这些词去建立倒排索引,在线上检索时,再将用户查询词进行分词,用分词结果去拉取多个倒排索引拉链结果、归并、相关性排序等,得到最终结果。...,直接在ES去算其实感觉有些奇怪)。...然而这样是有问题:当在多个ES索引上聚合时,ES不会把所有索引结果放在一起聚合TopN,而是单独在每个索引求得TopN后,再放在一起聚合。这是个使用时要注意小坑。...这样导致结果是,直接在多个索引上聚合出TopN,并不是真正TopN(比如3个月中,每个月都是不是Top 1,但三个月加起来就是Top了 1。局部最优不等于全局最优)。...从结果中,我们大概推断出了ES统计聚合运算做法:先把所有符合过滤条件数据全部检索出来,然后在内存中进行排序和聚合运算。也就是说,符合条件数据量级越大,聚合运算越慢。

    1.4K41

    ElasticSearch可扩展开源弹性搜索解决方案

    一、ElasticSearch集群入门 A.什么是ElasticSearch 1.概念: 索引(index):是ElasticSearch存放数据地方 文档(document):是ElasticSearch...:查询得到与给定内容相似的所有文档,基于模糊串,并选择其产生最好区分词项 10.fuzzy_like_this_field:与fuzzy_like_this类似,区别在于只作用在单个字段,不支持fields...,允许我们严格控制赋予被查询或过滤器匹配每个文档分值 4.indices:需要在多个索引上执行一个查询时非常有用 5.custom_filters_score:允许我们封装一个查询和若干个过滤器 6....custom_boost_factor:允许我们封装另外一个查询,并将该查询返回文档分值乘以一个指定因子 7.custom_score:通过script为另一个查询定制分值 F.数据排序 1."...:false 2.空间索引:geo_point 四、搜索优化 1.boost权值影响排序结果 2.同义词过滤器synonym 3.跨度查询:span_term、span_first、span_near、

    1.5K30

    ElasticSearch:实现高效数据搜索与分析利器!项目中如何应用落地,让我带你实操指南。

    如果业务主表数据量过于庞大,MySQL 不得已做了分库分表方案的话,那会对 MySQL 查询产生进一步影响。...缺点:排名不准确(每个分片计算后分值进行排序),同时各个 shard 返回结果数量之和可能是用户要求 size n 倍。...在每一个分片上查询符合要求数据,并根据全局 Term 和 Document 频率信息计算相关性得分构建一个优先级队列存储查询结果(包含分页、排序,等等),把查询结果 metadata 返回给查询节点...以及 filter 条件只产生两种结果:符合与不符合,后者被过滤掉。 即:精确查询,是非过滤,可缓存,性能高。 Query 检索细化关注点 **是否包含,**确定文档是否应该成为结果一部分。...(2)状态字段 status 是否设置为 “published”? 为什么 filter 比 query 更快? 因为,经常使用过滤器将被 ES 自动缓存,以提高性能。

    66321

    黑眼圈大神程序员用5000字带你通透读懂Elasticsearch注意事项

    如 果 想 修 改 字 段 映 射 , 首 先 需 要 新 建 一 个 引 , 然 后 使 用Elasticsearchreindex功能将旧索引复制到新索引中。...Elasticsearch一个Shard(Elasticsearch分片具体介绍可参考官方文 档 ) 就 是 一 个 Lucene Index ( 引 ) , 每 一 个 Lucene Index...,归并收到所有结果集并进行全局排序。...比如有5个分片,需要查询排序序号从10000到10010(from=10000,size=10)结果,每个分片到底返回多少数据给协调节点计算呢?不是10条,是10010条。...举一个例子,查询结果按照订单总金额分页,上一页最后一个订单总金额total_amount是10,那么下一页查询示例代码如下: 这个search_after里值,就是上次查询结果排序字段结果值。

    53000

    Elasticsearch:如何轻松安全地对实时 Elasticsearch 索引 reindex 你数据

    现在假设你想要以需要重新(reindex)引该索引所有数据方式更新其映射:通常,当你想要更改现有字段数据类型(例如从keyword 到 integer)时,会发生这种情况。...好,现在你拥有的选项将取决于你首先如何设置索引。...你需要一个 index template如果你没有自己创建索引,Elasticsearch 能够创建索引,这意味着如果你尝试索引 foo 索引中某些数据,Elasticsearch 将创建它(如果它尚不存在...通过这样做,它使用称为动态映射功能为这个新索引创建默认映射。这就是你需要索引模板原因! 此功能允许你定义 Elasticsearch 自动创建索引将获得所有属性,包括其设置和映射。...我们可以在我们引上利用 index.default_pipeline 设置,这将允许我们应用管道,即使原始索引请求没有提到它。

    9310

    干货 | Elasticsearch通用优化建议

    4、建议2:避免使用大文件 鉴于默认http.max_context_length设置为100MB,Elasticsearch将拒绝索引任何大于该文档文档。...您可能决定增加该特定设置,但Lucene仍然有大约2GB限制。 即使不考虑硬性指标限制,大型文档通常也不实用。...请注意,即使稀疏性最显着影响是存储要求,它也会对索引速度和搜索速度产生影响,因为没有字段文档这些字节仍需要在索引时写入并在搜索时花费时间。 在索引中包含少数稀疏字段是完全没问题。...请注意,不应轻易做出这个决定,因为这些参数不能在实时索引上更改,因此如果您意识到需要norms或doc_values,则必须重新reindex索引。...2)创建索引时候,Mapping设计非常重要,各个字段细分设计一方面决定了存储,另一方面:不同字段类型设计会对性能产生非常重要影响。

    1.2K20

    黑眼圈大神程序员用5000字带你通透读懂Elasticsearch注意事项

    如 果 想 修 改 字 段 映 射 , 首 先 需 要 新 建 一 个 引 , 然 后 使 用Elasticsearchreindex功能将旧索引复制到新索引中。...Elasticsearch一个Shard(Elasticsearch分片具体介绍可参考官方文 档 ) 就 是 一 个 Lucene Index ( 引 ) , 每 一 个 Lucene Index...,归并收到所有结果集并进行全局排序。...比如有5个分片,需要查询排序序号从10000到10010(from=10000,size=10)结果,每个分片到底返回多少数据给协调节点计算呢?不是10条,是10010条。...举一个例子,查询结果按照订单总金额分页,上一页最后一个订单总金额total_amount是10,那么下一页查询示例代码如下: 这个search_after里值,就是上次查询结果排序字段结果值。

    50430

    Elasticsearch从入门到放弃:瞎说Mapping

    index:标记这个字段是否能被搜索,默认是 true search_analyzer:被搜索时所使用分词器,默认使用 setting 中设置分词器 fielddata:字段是否允许在内存中进行排序...因为 keyword 类型可以支持排序、聚合,并且只能支持精确查询。...例如,我们可以对一个字符串字段设置为text类型,用于全文检索,同时可以利用fields设置为keyword类型,用于排序和聚合。...需要注意是,无论是具体字段中还是整个 mapping enabled 属性都不可以被修改,因为一旦设置为 false,Elasticsearch 就不会对字段进行索引了,也不会校验数据合法性,如果产生了脏数据以后再设置为...Dynamic template dynamic template 允许我们自定义 mapping ,并应用到具体索引上

    94920

    滴滴ElasticSearch最佳实践

    3.3 不建议查询命中过多数据 ES 每次查询都会返回该次查询全部命中结果,这会导致需要命中全部数据,有些情况下还要对这些数据进行打分排序,造成整体性能缓慢。...3.5 不建议在大容量索引上进行复杂查询 目前有些索引容量特别大,甚至超过了千亿条记录,在这样引上查询时,需要特别注意查询复杂程度,过滤条件命中数据很多时,会查询特别慢,甚至超过默认超时时间,...大容量索引查询请注意查询语句优化,选择最合理查询方式,主要原则是尽量缩小查询范围,进行快速数据裁剪 3.6 查询语句建议选择合适排序方式,默认建议按_doc排序 ES 默认按照 score 排序...如果对排序没有依赖用户,可以使用按内部 _doc 顺序排序,可以避免打分环节。...即单个 shard 查询超过timeout 时间,则直接返回该时间段内查询结果。这时候结果可能是不完整,用户需要关心查询是否触发了timeout。

    1.5K10
    领券