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

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

Вот запрос mysql:

select field1 from mytable where field1!=null and field1!="";
42
все Упругие вопросы должны иметь версию Elastic, которую вы используете. Это обязательно, потому что даже в младших версиях так много изменений
добавлено автор Henley Chiu, источник

7 ответы

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

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"
            }
         }
      }
   }
}
'
55
добавлено
@DrTech Считаете ли вы, что можете помочь мне с stackoverflow.com/questions/33630013/… , если это возможно?
добавлено автор BentCoder, источник
обратите внимание на удобный однострочный формат curl -XGET ' 127.0.0.1: ? 9200/тест/тест/_search д = _exists_: поле1 & # 39 ;
добавлено автор Rene Wooller, источник
Нет необходимости обертывать фильтр запросом.
добавлено автор WhatIsHeDoing, источник
Это не фильтрует пустые строки. Пустая строка - это ненулевое значение. - elastic.co/guide/en/elasticsearch/reference/current/…
добавлено автор Luqmaan, источник
просто оберните несколько фильтров exist в фильтр и elasticsearch.org/guide/reference/query-dsl/and-filter.html
добавлено автор DrTech, источник
Это работает для меня для фильтрации значений пустого поля.
добавлено автор masterchief, источник
привет, просто хочу знать, как я могу сделать для mutiple поля. :)
добавлено автор uttam palkar, источник
Привет, DrTech, он отлично работает, спасибо, много.
добавлено автор uttam palkar, источник

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

{
  "query":{
     "filtered":{
        "query":{
           "match_all":{}
        },
        "filter":{
            "bool":{
              "must":{},
              "should":{},
              "must_not":{
                 "missing":{
                    "field":"field1",
                    "existence":true,
                    "null_value":true
                 }
              }
           }
        }
     }
  }
}
20
добавлено
@Zach Считаете ли вы, что можете помочь мне с stackoverflow.com/questions/33630013/… , если это возможно?
добавлено автор BentCoder, источник
этот подход работал для меня в версии 1.0.3, но больше не работает в версии 1.5
добавлено автор phirschybar, источник
Ура! Вы только что закончили около четырех часов страданий. Благодаря :)
добавлено автор simonmorley, источник
Хурр ... забыл об фильтре Exists. Используйте решение DrTech, мой - менее элегантный способ сделать то же самое.
добавлено автор Zach, источник
это было очень полезно и хорошо работало как секундомер, потому что выходы не находятся в версии elasticsearch, которую мы использовали. Спасибо @zach
добавлено автор rubyisbeautiful, источник

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

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

{
    "query" : {
        "constant_score" : {
            "filter" : {
                "bool": {
                    "must": {"exists": {"field": ""}},
                    "must_not": {"term": {"": ""}}
                }
            }
        }
    }
}
13
добавлено

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

    GET /_search
    {
        "query" : {
            "regexp":{
                "": ".+"
            }
        }
    }  
8
добавлено
regex не является лучшим с точки зрения производительности. проверьте stackoverflow.com/вопросы/25561981/& hellip;
добавлено автор danvasiloiu, источник
к сожалению, это единственное решение, которое я нашел ... очень странно, нет простого запроса сказать field = '' ...
добавлено автор danvasiloiu, источник

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

"query": {
  "filtered": {
     "query": {
        "match_all": {}
     },
     "filter": {
        "not": {
           "filter": {
              "missing": {
                 "field": "searchField"
              }
           }
        }
     }
  }
}
5
добавлено
Мне удалось получить отсутствующий запрос, но я продолжал использовать «exists» в массиве, чтобы узнать, могу ли я найти значение типа «не нуль», и он не работал. Это было правильным решением для меня. Благодаря!
добавлено автор James Drinkard, источник

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

{
  "query": {
    "filtered": {
      "query": {
        "match_all": {}
      },
      "filter": {
        "bool": {
          "must": [
            {
              "exists": {
                "field": "myfieldName"
              }
            },
            {
              "not": {
                "filter": {
                  "term": {
                    "myfieldName": ""
                  }
                }
              }
            }
          ]
        }
      }
    }
  }
}
1
добавлено
Thx много вы спасли мой день
добавлено автор Igor Beaufils, источник

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

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

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

1
добавлено