Elasticsearch - 想要在特定字段可用或不可用的所有索引中按字段排序,如果不可用则避免它

新手上路,请多包涵

目前,根据评分获取结果,但我想做的是我想要一个基于 评分 + 字段状态的结果,值为 true/false。

如果值为真,则需要导致优先级,但 状态字段可能不存在 于所有索引中。

            "query" => [
                  'bool' => [
                     'filter' => $filter,
                     'must' => [
                     "multi_match" => [
                        'query' => "$string",
                        "type" => "cross_fields",
                        'fields' => ['field1','field2','field3'],
                        "minimum_should_match" => "80%"
                         ]
                    ]
                  ]
            ],
            "sort" => [
                    "_score",
                    [ "status" => ["order" => "desc","unmapped_type" => "boolean"] ]
            ],

但出现以下错误:

 [type] => illegal_argument_exception
[reason] => Text fields are not optimised for operations that require per-document field data like aggregations and sorting, so these operations are disabled by default. Please use a keyword field instead. Alternatively, set fielddata=true on [status] in order to load field data by uninverting the inverted index. Note that this can use significant memory.

有人帮我忽略该字段不可用的索引或解决此问题的任何其他解决方案吗?

原文由 jilesh 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 406
2 个回答

正如聊天中所讨论的那样,这个问题是由于@jilesh而发生的

忘记删除旧的索引映射,只更新正在发生的数据。

当您通过正确的设置遇到以下错误时,以下答案是相关的

文本字段未针对需要每个文档字段数据的操作(如聚合和排序)进行优化,因此默认情况下禁用这些操作。请改用关键字字段。或者,在 [status] 上设置 fielddata=true 以通过反转倒排索引来加载字段数据。请注意,这可能会占用大量内存。

在这种情况下,如果您想消除错误,请启用字段上的字段数据,但要注意它可能会导致性能问题。

在官方网站上阅读更多关于现场数据的信息

您可以在映射中的 order 字段中启用它,如图所示。

 {
  "properties": {
    "order": {
      "type":     "text",
      "fielddata": true
    }
  }
}

原文由 Amit 发布,翻译遵循 CC BY-SA 4.0 许可协议

就我而言,我必须使用可聚合的 {fieldname}.keyword 字段。下面是一个使用 Nest .NET 的示例。

 .Sort(s => s
    .Ascending(f => f.Field1.Suffix("keyword"))
    .Ascending(f => f.Field2.Suffix("keyword"))
    .Ascending(f => f.Field3.Suffix("keyword")))

原文由 Bertm13 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏