[英]No mapping found for field in order to sort on in ElasticSearch
如果发现某些文档不包含排序条件中使用的字段,则 Elasticsearch 在解析查询时会抛出SearchParseException
。
SearchParseException:解析失败 [未找到 [price] 的映射以进行排序]
即使有些文件缺少price
字段,我如何才能成功搜索这些文件?
对于那些寻找两者的例子
ignore_unmapped
和unmapped_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.