2013-07-30 47 views
7

Tôi đang cố gắng lọc trường _id (chỉ mục không được bật) trong elasticsearch theo dải ô. Có thể không? Nếu vậy, làm thế nào nó có thể được thực hiện? Tôi đã đọc trong tài liệu elasticsearch rằng chúng tôi có thể sử dụng 'id' để truy vấn bằng _id và nhập, nhưng tôi không thể xem nó có thể được thực hiện như thế nào với bộ lọc dải ô. (Tôi không muốn kích hoạt chỉ mục trên _id).Phạm vi lọc _id trong elasticsearch

{ 
    "from": 0, 
    "size": 20, 
    "query": { 
    "match_all": {} 
    }, 
    "filter": { 
     "range": { 
      "_id": { 
      "gt": "51f7b6b7710c42b136027581" 
      } 
     } 
    }, 
    "sort": { 
    "pubdate": { 
     "order": "desc" 
    } 
    } 
} 
+2

Tôi nghĩ rằng đây không thể được thực hiện. Tôi có một cảm giác '_id' được băm để tra cứu nhanh, một khi bạn băm một cái gì đó bạn mất tất cả ý nghĩa của" giá trị "của nó. Bạn cần lưu trữ id trong tài liệu. – ramseykhalaf

+0

Bạn có chắc chắn về ramsey lưu trữ không? Bạn phải lập chỉ mục id (trường hợp này không phải là trường hợp theo mặc định) vì truy vấn phạm vi khớp với các tài liệu có các trường có các cụm từ trong phạm vi được xác định. – ThomasC

+0

Bạn có thể lập chỉ mục các tài liệu của bạn với một _id (số nguyên) được chỉ định thay vì _id mặc định do đàn hồi cung cấp không? –

Trả lời

1

Có thể hơi muộn, nhưng tôi cố gắng trả lời và có thể câu trả lời vẫn hữu ích cho bạn.
Nhìn những ý kiến ​​làm cho đồng nghiệp, tôi nghĩ rằng hai ý tưởng chính có thể được trích xuất:

  1. id Generated by Elasticsearch không thể được sử dụng để lọc hoặc thực hiện bất kỳ hoạt động khác hơn là GET o tìm kiếm id.
  2. Index tùy chỉnh giá trị uid được đoán (và đó là cách tôi muốn cố gắng để giải quyết vấn đề)

Vì vậy, tôi đã mã hóa một ví dụ để kiểm tra xem giải pháp 2 là có thể. bộ phận chủ chốt là những:

#cluster node to query 
es = Elasticsearch(['localhost:9200',]) 
records = [ 
    #some custom data 
] 
for idx,r in enumerate(records): 
    _index_config = dict(index_config) 
    #set Elasticsearch uid 
    _index_config['_id'] = idx 
    #replicate in a document field to be able to filter for 
    r['id'] = idx 
    kwargs['body'].append({'index' : _index_config}) 
    kwargs['body'].append(r) 

_ = es.bulk(**kwargs) 

Một khi bạn đã lập chỉ mục các lĩnh vực id, bạn có thể lọc theo nó như bạn muốn. range lọc là một trong số họ

elasticsearch_query = { 
    "query": { 
     "filtered": { 
      "filter": { 
       "range": { 
        "id": { 
         "gte" : 3, 
         "lt" : 5 
        } 
       } 
      } 
     } 
    } 
} 

Bạn có thể thấy một ví dụ làm việc trong this notebook