2015-02-17 16 views
7

Truy vấn dưới đây là những gì tôi muốn xây dựng bằng cách sử dụng elasticsearch-dsl-py, nhưng tôi không biết làm thế nào để làm điều đó.Làm cách nào để tạo bộ lọc "HOẶC" bằng elasticsearch-dsl-py?

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" 
        } 
        } 
       ] 
       } 
      } 
      ] 
     } 
     } 
    } 
    } 
} 

Sử dụng elasticsearch-dsl-py, đây là gần như tôi có thể nhận được, nhưng nó không giống nhau. '|' toán tử sẽ chuyển thành mệnh đề 'nên', thay vì 'OR'.

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() 

Trả lời

9

Giải pháp:

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")] 
    ) 

nào biến thành:

{ 
    "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":{ 

      } 
     } 
     } 
    } 
} 

Hy vọng rằng điều này có thể được bao gồm trong tài liệu elasticsearch-dsl-py trong tương lai.

+1

Giải pháp này đã lỗi thời. F không tồn tại nữa và cú pháp để lọc thay đổi. – Michael

2

Với Elasticsearch 2.x (và elasticsearch-dsl> 2.x) bạn không thể áp dụng bộ lọc như trong nhận xét của @ theslow1 nữa. Thay vào đó bạn phải xây dựng bộ lọc của bạn bằng cách kết hợp Q s:

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]) 

Các search.query('bool', filter=[combinedQ]) áp dụng Q-tiêu chí như bộ lọc như mô tả trong elasticsearch-dsl documentation.

+0

Cách sử dụng chức năng kết hợp SF, điểm số. – devanathan

+0

SF của tôi sẽ hoạt động dựa trên kích thước đầu vào đã cho. Tôi sẽ sử dụng vòng lặp for để tạo các hàm. – devanathan

Các vấn đề liên quan