创建Elasticsearch curl查询非null而不是空(“”)

时间:2013-02-07 06:45:44

标签: elasticsearch

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

这是mysql查询:

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

12 个答案:

答案 0 :(得分:60)

空值和空字符串都不会导致索引值,在这种情况下,您可以使用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"
            }
         }
      }
   }
}
'

答案 1 :(得分:23)

Missing Filter的“必填项”部分中包裹Bool Filter。它只返回字段存在的文档,如果将“null_value”属性设置为true,则显式为非null的值。

{
  "query":{
     "filtered":{
        "query":{
           "match_all":{}
        },
        "filter":{
            "bool":{
              "must":{},
              "should":{},
              "must_not":{
                 "missing":{
                    "field":"field1",
                    "existence":true,
                    "null_value":true
                 }
              }
           }
        }
     }
  }
}

答案 2 :(得分:18)

正如@luqmaan在评论中指出的那样,documentation表示过滤器exists 不会过滤掉空字符串,因为它们被视为非空值

所以添加到@ DrTech的答案,为了有效地过滤掉空值和空字符串值,你应该使用这样的东西:

{
    "query" : {
        "constant_score" : {
            "filter" : {
                "bool": {
                    "must": {"exists": {"field": "<your_field_name_here>"}},
                    "must_not": {"term": {"<your_field_name_here>": ""}}
                }
            }
        }
    }
}

答案 3 :(得分:17)

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

    GET /_search
    {
        "query" : {
            "regexp":{
                "<your_field_name_here>": ".+"
            }
        }
    }  

答案 4 :(得分:6)

您可以在缺失之上使用过滤器。

"query": {
  "filtered": {
     "query": {
        "match_all": {}
     },
     "filter": {
        "not": {
           "filter": {
              "missing": {
                 "field": "searchField"
              }
           }
        }
     }
  }
}

答案 5 :(得分:3)

您可以通过布尔查询以及must和must_not的组合来做到这一点:

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

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

答案 6 :(得分:1)

We are using Elasticsearch version 1.6 and I used this query from a co-worker to cover not null and not empty for a field:

{
  "query": {
    "filtered": {
      "query": {
        "match_all": {}
      },
      "filter": {
        "bool": {
          "must": [
            {
              "exists": {
                "field": "myfieldName"
              }
            },
            {
              "not": {
                "filter": {
                  "term": {
                    "myfieldName": ""
                  }
                }
              }
            }
          ]
        }
      }
    }
  }
}

答案 7 :(得分:1)

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

{
  "query": {
    "bool": {
      "filter": [
        {
          "exists": {
            "field": "field_1"
          }
        },
        {
          "exists": {
            "field": "field_2"
          }
        },
        {
          "exists": {
            "field": "field_n"
          }
        }
      ]
    }
  }
}

答案 8 :(得分:0)

在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": ""
        }
      }
    }
  }
}

请注意must_not组件中的.keyword

答案 9 :(得分:0)

Elastic search Get all record where condition not empty.

const searchQuery = {
      body: {
        query: {
          query_string: {
            default_field: '*.*',
            query: 'feildName: ?*',
          },
        },
      },
      index: 'IndexName'
    };

答案 10 :(得分:0)

您需要将bool查询与must / must_not一起存在

获取位置为空的地方

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

获取不为空的地方

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

答案 11 :(得分:-1)

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

bool must_not类似于“ NOT AND”,这意味着field!=“”,bool必须存在意味着其!= null。

如此有效地启用:其中field1!= null和field1!=“ =”

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

ElasticSearch版本:   “版本”:{     “ number”:“ 5.6.10”,     “ lucene_version”:“ 6.6.1”   }