136

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

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

我怎样才能成功地搜索这些文档,即使有些缺少该price字段?

4

9 回答 9

127

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

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

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

于 2013-06-11T19:13:40.220 回答
55

对于那些寻找两者示例的人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 类型的映射一样,该索引中的所有文档都没有该字段的值。

于 2015-06-15T21:16:35.033 回答
4

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

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

Rails+ElasticSearch+Tire 出现此错误,因为排序列没有默认值,因此被作为空值发送到 ES。

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

于 2015-03-29T08:17:14.827 回答
4

如果您使用的是 es 6.7

试试这个

sort : ["title.keyword:desc"]
于 2019-05-16T13:22:53.123 回答
2

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

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

于 2014-01-03T17:40:25.257 回答
2

弹性搜索 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" }
    }
  ]
}
于 2018-09-09T02:40:46.483 回答
2

如果原始答案对您不起作用,让我尝试提供帮助。对于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

于 2020-11-04T14:13:03.210 回答
0

您还可以使用给您一些灵活性的脚本:

"sort" : {
    "_script" : {
        "type" : "number",
        "script" : {
            "lang": "painless",
            "source": "return !doc['price'].empty ? doc['price'].value : 0"
        },
        "order" : "desc"
    }
}
于 2019-07-04T12:08:31.700 回答
0

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

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

BEFORE

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

AFTER
"_source":{....}
"query" : {...}
"sort": [
{
  "added_on.keyword": {
    "order": "desc"
  }
}
]
于 2020-05-27T11:07:22.327 回答