繁体   English   中英

未找到字段的映射以在 ElasticSearch 中进行排序

[英]No mapping found for field in order to sort on in ElasticSearch

如果发现某些文档不包含排序条件中使用的字段,则 Elasticsearch 在解析查询时会抛出SearchParseException

SearchParseException:解析失败 [未找到 [price] 的映射以进行排序]

即使有些文件缺少price字段,我如何才能成功搜索这些文件?

在挖掘更多之后,我找到了如下给出的解决方案。 ignore_unmapped应该在 sort 子句中显式设置为true

"sort" : [
       { "rating": {"order" : "desc" , "ignore_unmapped" : true} },
       { "price": {"order" : "asc" , "missing" : "_last" , "ignore_unmapped" : true} }
]

有关更多信息,请查看 Elasticsearch 参考资料:

对于那些寻找两者的例子ignore_unmappedunmapped_type请看这里我的反应

请注意,“ignore_unmapped”现在已被弃用,取而代之的是“unmapped_type”。 这是作为#7039 的一部分完成的

来自文档:在 1.4.0 之前有 ignore_unmapped 布尔参数,它没有足够的信息来决定要发出的排序值,并且不适用于跨索引搜索。 它仍然受支持,但鼓励用户迁移到新的 unmapped_type。

默认情况下,如果没有与字段关联的映射,搜索请求将失败。 unmapped_type 选项允许忽略没有映射的字段并且不按它们排序。 此参数的值用于确定要发出的排序值。 以下是如何使用它的示例:

{
    "sort" : [
        { "price" : {"unmapped_type" : "long"} },
    ],
    "query" : {
        "term" : { "user" : "kimchy" }
    }
}

如果查询的任何索引没有价格映射,那么 Elasticsearch 将处理它,就好像存在 long 类型的映射一样,此索引中的所有文档都没有该字段的值。

显然 ElasticSearch 不会对空值进行排序。 我假设它会将 null 视为在开始或结束(与 SQL 排序一样),但我相信它也会触发此错误。

因此,如果您看到此错误,您可能需要确保 sort 属性在发送到 ElasticSearch 时具有默认值。

我在使用 Rails+ElasticSearch+Tire 时遇到了这个错误,因为排序列没有默认值,所以被发送到 ES 作为空值。

此问题表明正在处理空值,但这不是我的经验。 无论如何都是值得一试的。

如果您使用的是 es 6.7

试试这个

sort : ["title.keyword:desc"]

我遇到了同样的问题(有点;会得到一些错误,但会得到一些结果),但在我的情况下,我的搜索是在根处发出的(没有指定索引),我得到的错误是因为搜索/顺序也是寻找 Kibana 索引。

愚蠢的错误,但也许这会帮助到这里的其他人。

弹性搜索 6.4

只需在 Kibana 中指定索引即可

 GET /_search { "query": { "exists": { "field": "document_id" } }, "sort": [ { "document_id": { "order": "asc" }, "created_at": { "order": "desc" } } ] }

GET /document-index/contact/_search  (here)
{

  "query": {
    "exists": {
      "field": "document_id"
    }
  },
  "sort": [
    {
      "document_id": { "order": "asc"  },
      "created_at":  { "order": "desc" }
    }
  ]
}

在原始答案对您不起作用的情况下,让我尝试提供帮助。 对于ES 6.x,请尝试以下代码,不推荐使用 ignore_unmapped。

"sort" : [
       { "rating": {"order" : "desc" , "unmapped_type" : "long"} },
       { "price": {"order" : "asc" , "missing" : "_last" , "unmapped_type" : "long"} }
]

您可以在以下位置找到有关排序的更多信息:

https://www.elastic.co/guide/en/elasticsearch/reference/6.8/search-request-sort.html

您还可以使用脚本来为您提供一些灵活性:

"sort" : {
    "_script" : {
        "type" : "number",
        "script" : {
            "lang": "painless",
            "source": "return !doc['price'].empty ? doc['price'].value : 0"
        },
        "order" : "desc"
    }
}

当我们使用下面的代码时,其中added_on是日期,会发生什么! 属性文本被分析,这意味着它在存储时被分解成不同的词,并允许对字段中的一个或多个词进行自由文本搜索

所以有与字段相关联的“文本”和“关键字”,所以如果我们需要在查询中使用聚合,我们通常需要字段值关键字。

BEFORE

"_source":{....}
"query" : {...}
"sort": [
{
  "added_on": {
    "order": "desc"
  }
}
]

AFTER
"_source":{....}
"query" : {...}
"sort": [
{
  "added_on.keyword": {
    "order": "desc"
  }
}
]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM