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

jil*_*esh 5 php search elasticsearch elastic-stack elk

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

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

           "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"] ]
            ],
Run Code Online (Sandbox Code Playgroud)

但得到以下错误:

[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.
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮助我忽略该字段不可用的索引或任何其他解决此问题的方法?

Ami*_*wal 15

正如聊天中所讨论的,该问题的发生是由于 @jilesh

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

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

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

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

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

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

{
  "properties": {
    "order": { 
      "type":     "text",
      "fielddata": true
    }
  }
} 
Run Code Online (Sandbox Code Playgroud)