没有找到字段的映射以便在 ElasticSearch 中进行排序

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

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

如何成功地搜索这些文档,即使有些文档缺少 price字段?

111247 次浏览

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

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

如需更多信息,请查看 Elasticsearch 参考资料:

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

愚蠢的错误,但也许这个能帮到其他人。

显然,ElasticSearch 不会对空值进行排序。我假设它将把 null 看作是在开始或结束(就像 SQL 排序一样) ,但我相信它也会触发这个错误。

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

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

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

对于那些寻找 ignore_unmapped和 请参阅 我的回答

请注意,现在不推荐使用“忽略 _ 取消映射”,而支持使用“取消映射 _ 类型”,这是作为 # 7039的一部分完成的

来自文档: 在1.4.0之前,有一个忽略未映射的布尔参数,它没有足够的信息来决定要发出的排序值,也不适用于交叉索引搜索。它仍然受到支持,但是鼓励用户转而迁移到新的 unmap _ type。

默认情况下,如果没有与字段关联的映射,则搜索请求将失败。Unmap _ type 选项允许忽略没有映射的字段,并且不按这些字段进行排序。此参数的值用于确定要发出的排序值。下面是如何使用它的一个例子:

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

如果被查询的索引中没有 price 的映射,那么 Elasticsearch 会像处理 long 类型的映射一样处理它,索引中的所有文档都没有这个字段的值。

弹性搜索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" }
}
]
}

如果你正在使用 es6.7

试试这个

sort : ["title.keyword:desc"]

你也可以使用脚本,它可以给你一些灵活性:

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

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

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

BEFORE


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


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

如果原来的答案对你不起作用,让我来帮你。 对于 ES 6. x,请尝试下面的代码,不推荐忽略 _ unmap。

"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