90

如何创建 Elasticsearch curl 查询以获取不为空且不为空的字段值(“”),

这是mysql查询:

select field1 from mytable where field1!=null and field1!="";
4

13 回答 13

88

空值和空字符串都导致没有值被索引,在这种情况下您可以使用exists过滤器

curl -XGET 'http://127.0.0.1:9200/test/test/_search?pretty=1'  -d '
{
   "query" : {
      "constant_score" : {
         "filter" : {
            "exists" : {
               "field" : "myfield"
            }
         }
      }
   }
}
'

title或与(例如)字段上的全文搜索结合使用:

curl -XGET 'http://127.0.0.1:9200/test/test/_search?pretty=1'  -d '
{
   "query" : {
      "filtered" : {
         "filter" : {
            "exists" : {
               "field" : "myfield"
            }
         },
         "query" : {
            "match" : {
               "title" : "search keywords"
            }
         }
      }
   }
}
'
于 2013-02-07T10:23:47.903 回答
38

正如@luqmaan 在评论中指出的那样,文档说过滤器exists 不会过滤掉空字符串,因为它们被认为是非空值

因此,添加到@DrTech 的答案中,为了有效地过滤出 null 和空字符串值,您应该使用以下内容:

{
    "query" : {
        "constant_score" : {
            "filter" : {
                "bool": {
                    "must": {"exists": {"field": "<your_field_name_here>"}},
                    "must_not": {"term": {"<your_field_name_here>": ""}}
                }
            }
        }
    }
}
于 2015-07-30T18:55:08.310 回答
34

在 elasticsearch 5.6 上,我必须使用下面的命令来过滤掉空字符串:

    GET /_search
    {
        "query" : {
            "regexp":{
                "<your_field_name_here>": ".+"
            }
        }
    }  
于 2018-01-22T15:34:31.493 回答
31

在Bool 过滤器的 Must-Not 部分包裹一个缺失的过滤器。它只会返回存在该字段的文档,并且如果您将“null_value”属性设置为 true,则值明确不为空。

{
  "query":{
     "filtered":{
        "query":{
           "match_all":{}
        },
        "filter":{
            "bool":{
              "must":{},
              "should":{},
              "must_not":{
                 "missing":{
                    "field":"field1",
                    "existence":true,
                    "null_value":true
                 }
              }
           }
        }
     }
  }
}
于 2013-02-07T10:10:53.280 回答
9

您可以使用 bool 查询以及 must 和 must_not 的组合来做到这一点,如下所示:

GET index/_search
{
    "query": {
        "bool": {
            "must": [
                {"exists": {"field": "field1"}}
            ],
            "must_not": [
                {"term": {"field1": ""}}
            ]
        }
    }
}

我在 Kibana 中使用 Elasticsearch 5.6.5 对此进行了测试。

于 2018-06-25T09:42:39.323 回答
8

在 5.6.5 中对我有用的唯一解决方案是 bigstone1998 的正则表达式答案。出于性能原因,我不希望使用正则表达式搜索。我相信其他解决方案不起作用的原因是因为将分析标准字段,因此没有空字符串令牌可以否定。存在查询本身也无济于事,因为空字符串被认为是非空的。

如果您无法更改索引,则正则表达式方法可能是您唯一的选择,但如果您可以更改索引,则添加关键字子字段将解决问题。

在索引的映射中:

"myfield": {
    "type": "text",
    "fields": {
        "keyword": {
            "ignore_above": 256,
            "type": "keyword"
        }
    }
}

然后你可以简单地使用查询:

{
  "query": {
    "bool": {
      "must": {
        "exists": {
          "field": "myfield"
        }
      },
      "must_not": {
        "term": {
          "myfield.keyword": ""
        }
      }
    }
  }
}

注意.keywordmust_not 组件中的 。

于 2018-12-06T23:00:11.707 回答
6

您可以在缺少的基础上使用not过滤器。

"query": {
  "filtered": {
     "query": {
        "match_all": {}
     },
     "filter": {
        "not": {
           "filter": {
              "missing": {
                 "field": "searchField"
              }
           }
        }
     }
  }
}
于 2015-04-10T11:49:48.750 回答
5

这是检查多个字段是否存在的查询示例:

{
  "query": {
    "bool": {
      "filter": [
        {
          "exists": {
            "field": "field_1"
          }
        },
        {
          "exists": {
            "field": "field_2"
          }
        },
        {
          "exists": {
            "field": "field_n"
          }
        }
      ]
    }
  }
}
于 2020-11-08T07:29:27.497 回答
2

您需要使用带有 must/must_not 和存在的 bool 查询

去哪里地方是空的

{
  "query": {
    "bool": {
      "must_not": {
        "exists": {
          "field": "place"
        }
      }
    }
  }
}

去哪里地方不为空

{
  "query": {
    "bool": {
      "must": {
        "exists": {
          "field": "place"
        }
      }
    }
  }
}
于 2020-09-29T13:11:00.730 回答
1

我们使用的是 Elasticsearch 1.6 版,我使用同事的这个查询来覆盖字段的非空和非空:

{
  "query": {
    "filtered": {
      "query": {
        "match_all": {}
      },
      "filter": {
        "bool": {
          "must": [
            {
              "exists": {
                "field": "myfieldName"
              }
            },
            {
              "not": {
                "filter": {
                  "term": {
                    "myfieldName": ""
                  }
                }
              }
            }
          ]
        }
      }
    }
  }
}
于 2016-02-03T03:49:07.197 回答
1

您可以将 bool 组合查询与 must/must_not 结合使用,它可以提供出色的性能并返回字段不为空且不为空的所有记录。

bool must_not 类似于“NOT AND”,表示字段!=“”,bool 必须存在表示其!= null。

如此有效地启用:where field1!=null and field1!=""

GET  IndexName/IndexType/_search
{
    "query": {
        "bool": {
            "must": [{
                "bool": {
                    "must_not": [{
                        "term": { "YourFieldName": ""}
                    }]
                }
            }, {
                "bool": {
                    "must": [{
                      "exists" : { "field" : "YourFieldName" }
                    }]
                }
            }]
        }   
    }
}

弹性搜索版本:

  "version": {
    "number": "5.6.10",
    "lucene_version": "6.6.1"
  }
于 2018-09-07T17:39:45.790 回答
0

ES 7.x

{
  "_source": "field", 
  "query": {
    "bool": {
      "must": [
        {
          "exists": {
            "field":"field"
          }
        }
      ],
      "must_not": [
        {
          "term": {
            "field.keyword": {
              "value": ""
            }
          }
        }
      ]
    }
  }
}
于 2022-01-12T08:10:49.200 回答
0
Elastic search Get all record where condition not empty.

const searchQuery = {
      body: {
        query: {
          query_string: {
            default_field: '*.*',
            query: 'feildName: ?*',
          },
        },
      },
      index: 'IndexName'
    };
于 2019-04-24T10:32:31.890 回答