Sorting 未找到字段的映射以便在ElasticSearch中进行排序
如果发现某些文档不包含排序条件中使用的字段,则Elasticsearch在解析查询时抛出一个Sorting 未找到字段的映射以便在ElasticSearch中进行排序,sorting,mapping,
elasticsearch,Sorting,Mapping,
elasticsearch,如果发现某些文档不包含排序条件中使用的字段,则Elasticsearch在解析查询时抛出一个SearchParseException SearchParseException:解析失败[未找到[price]的映射以便进行排序] 我如何才能成功地搜索这些文档,即使有些文档缺少price字段?在进一步挖掘之后,我找到了如下所示的解决方案ignore\u unmapped应显式设置为true "sort" : [ { "rating": {"order" : "desc" , "igno
SearchParseException
SearchParseException:解析失败[未找到[price]的映射以便进行排序]
我如何才能成功地搜索这些文档,即使有些文档缺少
price
字段?在进一步挖掘之后,我找到了如下所示的解决方案<在sort子句中,code>ignore\u unmapped应显式设置为true
"sort" : [
{ "rating": {"order" : "desc" , "ignore_unmapped" : true} },
{ "price": {"order" : "asc" , "missing" : "_last" , "ignore_unmapped" : true} }
]
有关更多信息,请参阅Elasticsearch参考资料:
愚蠢的错误,但这可能会帮助其他人结束在这里。显然ElasticSearch不会对空值进行排序。我假设它会将null视为在开始或结束处(与SQL排序一样),但我相信它也会触发此错误 因此,如果您看到此错误,您可能需要确保sort属性在发送到ElasticSearch时具有默认值 我在Rails+ElasticSearch+Tire中遇到了这个错误,因为排序列没有默认值,所以被作为null发送到ES 表示正在处理空值,但这不是我的经验。无论如何,这是值得一试的 对于那些正在寻找
忽略_未映射
和
未映射\u类型
请参见
请注意,“忽略未映射的类型”现在被弃用,取而代之的是“未映射的类型”。这是作为工作的一部分进行的
在1.4.0之前,存在ignore_unmapped布尔参数,该参数没有足够的信息来决定要发出的排序值,并且不适用于交叉索引搜索。它仍然受支持,但鼓励用户迁移到新的未映射类型
默认情况下,如果没有与字段关联的映射,则搜索请求将失败。unmapped_type选项允许忽略没有映射的字段,并且不按它们排序。此参数的值用于确定要发出的排序值。以下是如何使用它的示例:
{
"sort" : [
{ "price" : {"unmapped_type" : "long"} },
],
"query" : {
"term" : { "user" : "kimchy" }
}
}
如果查询的任何索引没有价格映射,则Elasticsearch将像处理long类型的映射一样处理它,该索引中的所有文档对此字段没有任何值。Elasticsearch 6.4
只需在Kibana中指定索引即可
以前
GET/\u搜索
{
“查询”:{
“存在”:{
“字段”:“文档id”
}
},
“排序”:[
{
“文件id”:{“订单”:“asc”},
“创建于”:{“顺序”:“描述”}
}
]
}
如果您使用的是es 6.7
试试这个
sort : ["title.keyword:desc"]
您还可以使用脚本,它为您提供了一些灵活性:
"sort" : {
"_script" : {
"type" : "number",
"script" : {
"lang": "painless",
"source": "return !doc['price'].empty ? doc['price'].value : 0"
},
"order" : "desc"
}
}
当我们使用下面的代码时,其中添加了日期,会发生什么 因此有“文本”和“关键字”与字段相关联,因此如果我们需要在查询中使用聚合,我们通常需要关键字中的字段值
BEFORE
"_source":{....}
"query" : {...}
"sort": [
{
"added_on": {
"order": "desc"
}
}
]
AFTER
"_source":{....}
"query" : {...}
"sort": [
{
"added_on.keyword": {
"order": "desc"
}
}
]
如果原来的答案不适合你,让我来帮你。 对于ES 6.x请尝试下面的代码,不推荐使用“忽略未映射”
"sort" : [
{ "rating": {"order" : "desc" , "unmapped_type" : "long"} },
{ "price": {"order" : "asc" , "missing" : "_last" , "unmapped_type" : "long"} }
]
有关排序的更多信息,请访问:
您的问题/答案解决了我的问题-谢谢。我编辑了一些概括,如果这不适合你,请随意回滚。处理此问题的参考嗨,我有相同的问题,我不明白这是如何工作的。。。缺少的属性和忽略未映射的属性应该一起工作,对吗?例如,如果我将missing设置为“\u last”并将ignore\u unmapped设置为“false”,我仍然存在问题,但我希望文档在所有情况下都出现在结果中,即使它们没有属性。我有这个问题,如果您的_类型为空(即没有任何文档索引),则“ignore\u unmapped”不起作用看起来新的策略是使用我的查询直到今天一直有效,没有更新任何库等。但是今天我开始出现同样的错误。我现在添加了
“ignore_unmapping”:true
,它又开始工作了,但奇怪的是,幕后发生了什么!谁知道呢!不管怎样,它现在起作用了+1有人能澄清“缺失”和“未映射”之间的区别吗?对于某个字段,如果某些文档具有该字段,而其他文档没有,则该字段是否被视为“缺少”或“未映射”?“缺失”是否意味着该字段在文档中,但相应的值为空?我也有同样的问题。。但是当我指定ignoreunmapped时,我在搜索根时根本不会得到任何排序。。。如果我必须定义索引,这将限制搜索我的能力。。。我只想让所有匹配的结果按字段排序(如果存在),并为那些不存在的字段使用默认值。。编辑:它帮助了我-弹性7.3