2015-02-17 14 views
7

Aşağıdaki sorgu, elasticsearch-dsl-py kullanarak oluşturmak istediğim şeydir, ancak nasıl yapılacağını bilmiyorum. elasticsearch-dsl-py kullanarakelasticsearch-dsl-py? Yi kullanarak nasıl bir "OR" filtresi oluştururum?

GET /my_index/_search 
{ 
    "query": { 
    "filtered": { 
     "filter": { 
     "bool": { 
      "must": [ 
      { 
       "term": { 
       "status": "published" 
       } 
      }, 
      { 
       "or": { 
       "filters": [ 
        { 
        "range": { 
         "start_publication": { 
         "lte": "2015-02-17T03:45:00.245012+00:00" 
         } 
        } 
        }, 
        { 
        "missing": { 
         "field": "start_publication" 
        } 
        } 
       ] 
       } 
      }, 
      { 
       "or":{ 
       "filters": [ 
        { 
        "range": { 
         "end_publication": { 
         "gte": "2015-02-17T03:45:00.245012+00:00" 
         } 
        } 
        }, 
        { 
        "missing": { 
         "field": "end_publication" 
        } 
        } 
       ] 
       } 
      } 
      ] 
     } 
     } 
    } 
    } 
} 

, bu alabilirim olduğunca yakın, ama aynı değildir. '|' Operatör, 'OR' yerine 'should' cümlelerine dönüşür.

client = Elasticsearch() 
    now = timezone.now() 

    s = Search(using=client, 
       index="my_index" 
     ).filter(
      "term", status=PUBLISHED 
     ).filter(
      F("range", start_publication={"lte": now},) | 
      F("missing", field="start_publication") 
     ).filter(
      F("range", end_publication={"gte": now},) | 
      F("missing", field="end_publication") 
     ) 
    response = s.execute() 

cevap

9

Çözüm: Umarım bu gelecekte elasticsearch-dsl-py belgelerinde dahil edilebilir

{ 
    "query":{ 
     "filtered":{ 
     "filter":{ 
      "bool":{ 
       "must":[ 
        { 
        "term":{ 
         "status":"published" 
        } 
        }, 
        { 
        "or":{ 
         "filters":[ 
          { 
           "range":{ 
           "start_publication":{ 
            "lte":"2015-02-17T03:45:00.245012+00:00" 
           } 
           } 
          }, 
          { 
           "missing":{ 
           "field":"start_publication" 
           } 
          } 
         ] 
        } 
        }, 
        { 
        "or":{ 
         "filters":[ 
          { 
           "range":{ 
           "end_publication":{ 
            "gte":"2015-02-17T03:45:00.245012+00:00" 
           } 
           } 
          }, 
          { 
           "missing":{ 
           "field":"end_publication" 
           } 
          } 
         ] 
        } 
        } 
       ] 
      } 
     }, 
     "query":{ 
      "match_all":{ 

      } 
     } 
     } 
    } 
} 

: dönüşür

s = Search(using=client, 
      index="my_index" 
    ).filter(
     "term", status=PUBLISHED 
    ).filter(
     "or", [F("range", start_publication={"lte": now},), 
       F("missing", field="start_publication")] 
    ).filter(
     "or", [F("range", end_publication={"gte": now},), 
       F("missing", field="end_publication")] 
    ) 

.

+1

Bu çözüm güncel değil. F artık mevcut değil ve filtreleme sözdizimi değişti. – Michael

2

Elasticsearch 2.x (ve elasticsearch-dsl> 2.x) ile @ theslow1'in yorumunda olduğu gibi filtreleri uygulayamazsınız. Bunun yerine Q s birleştirerek filtre oluşturmak için vardır: elasticsearch-dsl documentation tarif edildiği gibi

search = Search(using=esclient, index="myIndex") 
firstFilter = Q("match", color='blue') & Q("match", status='published') 
secondFilter = Q("match", color='yellow') & Q("match", author='John Doe') 
combinedFilter = firstFilter | secondFilter 
search.query('bool', filter=[combinedFilter]) 

search.query('bool', filter=[combinedQ]) filtre olarak S-unsurları uygular.

+0

Kombine SF, skor işlevi nasıl kullanılır. – devanathan

+0

SF'm, verilen girdinin büyüklüğüne göre dinamik olacak. Fonksiyonları oluşturmak için for döngüsünü kullanacağım. – devanathan

İlgili konular