2015-05-13 5 views
6

Chcę sprawdzić dokumenty, które mają media_url == '' || media_url == null. Mam zapytanie:ElasticSearch: Jak napisać zapytanie, gdzie pole łańcuchowe ma wartość zerową lub jest puste?

{ 
    "engagements": [ 
     "blah" 
    ], 
    "query": { 
     "from": 0, 
     "size": 2, 
     "sort": [ 
      { 
       "bookmarked": { 
        "order": "desc" 
       } 
      }, 
      { 
       "created_at": { 
        "order": "desc" 
       } 
      } 
     ], 
     "facets": {}, 
     "query": { 
      "filtered": { 
       "query": { 
        "match_all": {} 
       }, 
       "filter": { 
        "bool": { 
         "must": [ 
          { 
           "term": { 
            "car_id": "78778" 
           } 
          }, 
          { 
           "range": { 
            "created_at": { 
             "gte": "2015-04-12T04:00:00.000Z", 
             "lte": "2015-05-13T03:59:59.999Z" 
            } 
           } 
          }, 
          { 
           "term": { 
            "media_url": "" 
           } 
          } 
         ], 
         "should": [ 
          { 
           "term": { 
            "bookmarked": false 
           } 
          } 
         ] 
        } 
       } 
      } 
     }, 
     "aggregations": { 
      "word_frequencies": { 
       "terms": { 
        "field": "text", 
        "size": 150 
       } 
      } 
     }, 
     "highlight": { 
      "fields": { 
       "text": { 
        "fragment_size": 1500 
       } 
      } 
     } 
    }, 
    "api": "_search" 
} 

Jednakże, jeśli robię to, co robię powyżej, wówczas nie zostaną zwrócone rekordy, które są ustawione na null. Co mam zrobić, aby zwrócić rekordy z wartością '' lub wartością null jako wartością media_url?

Odpowiedz

4

Być może możesz spróbować użyć filtra "lub". http://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-or-filter.html

{ 
    "or": [ 
    { 
     "term": { 
     "media_url": "" 
     } 
    }, 
    { 
     "term": { 
     "media_url": null 
     } 
    } 
    ] 
} 

Edycja: Oto pełna query (niesprawdzone ponieważ nie mam przykładowy dokument/indeks szablon)

{ 
    "engagements": [ 
     "blah" 
    ], 
    "query": { 
     "from": 0, 
     "size": 2, 
     "sort": [ 
     { 
      "bookmarked": { 
       "order": "desc" 
      } 
     }, 
     { 
      "created_at": { 
       "order": "desc" 
      } 
     } 
     ], 
     "facets": {}, 
     "query": { 
     "filtered": { 
      "query": { 
       "match_all": {} 
      }, 
      "filter": { 
       "bool": { 
        "must": [ 
        { 
         "term": { 
          "car_id": "78778" 
         } 
        }, 
        { 
         "range": { 
          "created_at": { 
           "gte": "2015-04-12T04:00:00.000Z", 
           "lte": "2015-05-13T03:59:59.999Z" 
          } 
         } 
        }, 
        { 
         "or": [ 
          { 
           "term": { 
           "media_url": "" 
           } 
          }, 
          { 
           "term": { 
           "media_url": null 
           } 
          } 
         ] 
        } 
        ], 
        "should": [ 
        { 
         "term": { 
          "bookmarked": false 
         } 
        } 
        ] 
       } 
      } 
     } 
     }, 
     "aggregations": { 
     "word_frequencies": { 
      "terms": { 
       "field": "text", 
       "size": 150 
      } 
     } 
     }, 
     "highlight": { 
     "fields": { 
      "text": { 
       "fragment_size": 1500 
      } 
     } 
     } 
    }, 
    "api": "_search" 
} 
+0

Witam gdzie dokładnie umieściłbym to w moim ciągu zapytania? – Edmund

+0

Zaktualizowałem moją odpowiedź, daj mi znać, jak to działa, lub zaktualizuj swoje pytanie, przykładowy dokument i mapowanie. – phuc77

+0

Poprawną odpowiedzią było użycie 'missing: {" field ":" media_url "}' zamiast '" media_url ": null', ale nadal będzie akceptować twoją odpowiedź, ponieważ jest prawie poprawna! Dzięki!! – Edmund

3

Można użyć missing filter dbać o zerowej wartości lub pola samego siebie brakuje. Możesz połączyć to samo z pustym hasłem, aby osiągnąć to, co chcesz.

{ 
    "or": [ 
    { 
     "term": { 
     "media_url": "" 
     } 
    }, 
    { 
     "missing": { 
     "field": "media_url" 
     } 
    } 
    ] 
} 

Użyj wyżej zamiast pojedynczego zapytania termin dla „media_url” w klauzuli moszczu swojej Boolean filtra.

+0

Yeh to działało dzięki! – Edmund

+1

Brakujący filtr, erm, zaginął od 5.smiesza – doctorlove

+0

@doctorlove dzięki za wskazanie. Możemy użyć kwerendy istnieje w klauzuli "must_not" dla tego samego efektu –