我正在使用SpringData Elasticsearch 3.2,并且有一个文档包含一个非必填字段,称为DueDate。用户可以根据DueDate字段(如果已填充)对文档进行排序。

一旦创建索引并创建没有DueDate的文档,就会出现一个异常,指出尝试列出文档时索引中没有DueDate字段。如果我创建索引并创建到期日期的文档,则列表文档将按预期工作。

有没有一种方法可以强制索引(最好通过Java注释)具有DueDate字段,即使该值为null或列出文档时也不会抛出异常?

最佳答案

  • 您需要在索引文档之前创建映射。如果映射中不存在该字段,您仍然可以为文档建立索引。
  • 在排序中使用脚本(其性能将低于选项1)。
  • {
      "query": {
        "match_all": {}
      },
      "sort" : {
            "_script" : {
                "type" : "number",
                "script" : {
                    "lang": "painless",
                    "source": "if(doc['dueDate'].size()!=0){doc['dueDate'].value.getMillis()}"
                },
                "order" : "desc"
            }
        }
    }
    

    if(doc ['dueDate']。size()!= 0)->检查字段是否存在。

    doc ['dueDate']。value.getMillis()-将日期转换为毫秒(数字)

    编辑1:
    GET index27/_search
    {
      "query": {
        "match_all": {}
      },
      "sort": [{
            "_script": {
                "type": "number",
                "script": {
                    "lang": "painless",
                    "inline": "if(doc['dueDate'].size()!=0) { return doc['dueDate'].value.getMillis();} else{  new Date().getTime();}"
                },
                "order": "asc"
            }
        }]
    }
    

    new Date()。getTime()将给出当前日期。如果您需要截止日期在最前面的文档,则使用它

    10-06 05:29
    查看更多