如何创建 Elasticsearch curl 查询以获取不为空且不为空的字段值(“”),
这是mysql查询:
select field1 from mytable where field1!=null and field1!="";
如何创建 Elasticsearch curl 查询以获取不为空且不为空的字段值(“”),
这是mysql查询:
select field1 from mytable where field1!=null and field1!="";
空值和空字符串都导致没有值被索引,在这种情况下您可以使用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"
}
}
}
}
}
'
正如@luqmaan 在评论中指出的那样,文档说过滤器exists
不会过滤掉空字符串,因为它们被认为是非空值。
因此,添加到@DrTech 的答案中,为了有效地过滤出 null 和空字符串值,您应该使用以下内容:
{
"query" : {
"constant_score" : {
"filter" : {
"bool": {
"must": {"exists": {"field": "<your_field_name_here>"}},
"must_not": {"term": {"<your_field_name_here>": ""}}
}
}
}
}
}
在 elasticsearch 5.6 上,我必须使用下面的命令来过滤掉空字符串:
GET /_search
{
"query" : {
"regexp":{
"<your_field_name_here>": ".+"
}
}
}
在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
}
}
}
}
}
}
}
您可以使用 bool 查询以及 must 和 must_not 的组合来做到这一点,如下所示:
GET index/_search
{
"query": {
"bool": {
"must": [
{"exists": {"field": "field1"}}
],
"must_not": [
{"term": {"field1": ""}}
]
}
}
}
我在 Kibana 中使用 Elasticsearch 5.6.5 对此进行了测试。
在 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": ""
}
}
}
}
}
注意.keyword
must_not 组件中的 。
您可以在缺少的基础上使用not过滤器。
"query": {
"filtered": {
"query": {
"match_all": {}
},
"filter": {
"not": {
"filter": {
"missing": {
"field": "searchField"
}
}
}
}
}
}
这是检查多个字段是否存在的查询示例:
{
"query": {
"bool": {
"filter": [
{
"exists": {
"field": "field_1"
}
},
{
"exists": {
"field": "field_2"
}
},
{
"exists": {
"field": "field_n"
}
}
]
}
}
}
您需要使用带有 must/must_not 和存在的 bool 查询
去哪里地方是空的
{
"query": {
"bool": {
"must_not": {
"exists": {
"field": "place"
}
}
}
}
}
去哪里地方不为空
{
"query": {
"bool": {
"must": {
"exists": {
"field": "place"
}
}
}
}
}
我们使用的是 Elasticsearch 1.6 版,我使用同事的这个查询来覆盖字段的非空和非空:
{
"query": {
"filtered": {
"query": {
"match_all": {}
},
"filter": {
"bool": {
"must": [
{
"exists": {
"field": "myfieldName"
}
},
{
"not": {
"filter": {
"term": {
"myfieldName": ""
}
}
}
}
]
}
}
}
}
}
您可以将 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"
}
ES 7.x
{
"_source": "field",
"query": {
"bool": {
"must": [
{
"exists": {
"field":"field"
}
}
],
"must_not": [
{
"term": {
"field.keyword": {
"value": ""
}
}
}
]
}
}
}
Elastic search Get all record where condition not empty.
const searchQuery = {
body: {
query: {
query_string: {
default_field: '*.*',
query: 'feildName: ?*',
},
},
},
index: 'IndexName'
};