找不到要在ElasticSearch上排序的字段映射


117

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

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

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


1
您的问题/答案解决了我的问题-谢谢。我对其进行了一些概括性编辑,如果不适合您,请随时进行回滚。
Paul Bellora

1
处理此问题的参考Elasticsearch Link
Ajeesh

Answers:


116

在深入研究之后,我找到了下面给出的解决方案。ignore_unmapped应该true在sort子句中显式设置为。

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

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


嗨,我遇到了同样的问题,我不知道这是如何工作的...缺少的属性和ignore_unmapped属性应该一起使用对吗?例如,如果我将missing设置为“ _last”,而ignore_unmapped设置为“ false”,则仍然有问题,但是我希望文档在所有情况下都位于结果中,即使它们没有属性也是如此。
c4k 2013年

我有这个问题,如果您的_type为空(即没有索引任何文档),则“ ignore_unmapped”不起作用。
reinaldoluckman 2015年

7
像新战略看起来是使用unmapped_type
lukmdo

2
直到今天,我的查询一直有效,而无需更新任何库等。但是今天,我开始遇到这个错误。我现在添加了"ignore_unmapped" : true,它又开始工作了,但是奇怪的是,幕后发生了什么!谁知道!无论如何,现在就可以使用。+1
BentCoder '16

1
有人可以澄清“丢失”和“未映射”之间的区别吗?对于某个字段,如果某些文档有该字段,而其他文档则没有,那么将该字段视为“丢失”还是“未映射”?“缺少”是否表示该字段在文档中,但相应的值为null?
Sher10ck

43

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


3

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

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

我在Rails + ElasticSearch + Tire中遇到此错误,因为sort列没有默认值,因此被作为null发送到ES。

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


2

我遇到了同样的问题(排序;会得到一些错误,但会得到一些结果),但是在我的情况下,我的搜索是在根目录下发出的(未指定索引),而我得到的错误是因为搜索/顺序也是寻找基巴纳指数。

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


我有同样的问题..但是当我指定ignore unmapped时,我在搜索根目录时根本不进行任何排序...如果我必须定义索引,这将限制我搜索的能力...我只是想要所有匹配结果要按字段排序(如果存在),并为不存在的字段填充默认值。编辑:
mgoetzke 2014年

2

Elasticsearch 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" }
    }
  ]
}


0

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

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

0

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

因此存在与字段关联的“文本”和“关键字”,因此,如果我们需要在查询中使用聚合,则通常需要关键字的字段值。

BEFORE

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

AFTER
"_source":{....}
"query" : {...}
"sort": [
{
  "added_on.keyword": {
    "order": "desc"
  }
}
]
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.