Подтвердить что ты не робот

Создайте запрос curl elasticsearch для не нулевого, а не пустого ("")

Как я могу создать запрос elalsearch curl для получения значения поля, которое не является нулевым, а не пустым (""),

Вот запрос mysql:

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

Ответ 1

Значение null и пустая строка не приводят к индексированию значения, и в этом случае вы можете использовать фильтр 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"
            }
         }
      }
   }
}
'

Ответ 2

Оберните Missing Filter в разделе Must-Not Bool Фильтр. Он будет возвращать документы только там, где это поле существует, и если для свойства null_value установлено значение true, значения явно не равны null.

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

Ответ 3

Как отметил в комментариях @luqmaan, в документации говорится, что фильтр exists , не отфильтровывает пустые строки, поскольку они считаются ненулевыми значениями.

Поэтому, добавляя к ответу @DrTech, чтобы эффективно фильтровать нулевые и пустые значения строки, вы должны использовать что-то вроде этого:

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

Ответ 4

На elasticsearch 5.6, я должен использовать команду ниже, чтобы отфильтровать пустую строку:

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

Ответ 5

Вы можете использовать не фильтр поверх отсутствующих.

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

Ответ 6

Вы можете сделать это с помощью запроса bool и комбинации must и must_not следующим образом:

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

Я проверил это с Elasticsearch 5.6.5 в Кибане.

Ответ 7

Мы используем Elasticsearch версии 1.6, и я использовал этот запрос у сотрудника, чтобы он не был пустым и не пустым для поля:

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

Ответ 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": ""
        }
      }
    }
  }
}

Обратите внимание на .keyword в компоненте must_not.

Ответ 9

Вы можете использовать запрос комбинации 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"},