检查Elasticsearch文档中是否存在字段的最佳方法

时间:2015-10-05 13:00:27

标签: elasticsearch field document exists

可能是一个非常愚蠢的问题,检查elasticsearch中的文档字段是否存在的最佳方法是什么?我在文档中找不到任何内容。

例如,如果此文档没有字段/密钥"价格"我不想回到结果中。

  

{      "更新":" 2015/09/17 11:27:27",       "名称":"眼影",       "格式":" 1.5克/0.05盎司",      }

我能做什么?

由于

5 个答案:

答案 0 :(得分:40)

您可以将exists filterbool/must filter结合使用,如下所示:

{
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "must": [
            {
              "exists": {
                "field": "price"
              }
            },
            ...     <-- your other constraints, if any
          ]
        }
      }
    }
  }
}

已弃用(自ES5开始)您还可以将missing filterbool/must_not filter结合使用

{
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "must_not": [
            {
              "missing": {
                "field": "price"
              }
            }
          ]
        }
      }
    }
  }
}

答案 1 :(得分:11)

exists过滤器已被ES 2.1中的exists 查询取代,但其工作方式相同。此外,删除了丢失的过滤器,并且不推荐使用丢失的查询。

要获取具有特定字段的所有文档,

"bool": {
    "must": {
        "exists": {
            "field": "my_field"
        }
    }
}

要获取所有没有特定字段的文档,请将其与此must_not一起使用

"bool": {
    "must_not": {
        "exists": {
            "field": "my_field"
        }
    }
}

弹性文档:https://www.elastic.co/guide/en/elasticsearch/reference/2.3/query-dsl-missing-query.html

答案 2 :(得分:9)

您可以使用存在过滤器:

{
  "query": {
    "filtered": {
      "filter": {
        "exists": {
          "field": "status"
        }
      },
      "query": {
        "match_all": {}
      }
    }
  }
}

此致 阿兰

答案 3 :(得分:7)

你可以直接做

{
    "query": {
        "exists": {
            "field": "fieldName"
        }
    }
}

如果你想添加一些比赛,那么你可以去

{
    "query": {
        "bool": {
            "must": [{
                "match": {
                    "fieldName": "value"
                }
            },
            {
                "exists": {
                    "field": "fieldName"
                }
            }]
        }
    }
}

https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-exists-query.html

答案 4 :(得分:1)

public class SentMessage
{
    public string MessageFrom { get; set; }
    public string MessageTo { get; set; }
    public string Message { get; set; }
}

// Post a new message
[Route("Conversation/AddTo")]
[HttpPost]
public IHttpActionResult AddToConversation(SentMessage message)
{
    if (message is null)
    {
        return NotFound();
    }

    return Ok("Message Sent");
}

来源:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-exists-query.html