2009-10-07 28 views
15

Tôi đã có hai bộ chỉ mục tìm kiếm. TestIndex (được sử dụng trong môi trường thử nghiệm của chúng tôi) và ProdIndex (được sử dụng trong môi trường SẢN XUẤT). Truy vấn tìm kiếm Lucene: + ngày: [20090410184806 TO 20091007184806] hoạt động tốt cho chỉ mục thử nghiệm nhưng cung cấp thông báo lỗi này cho chỉ mục Prod.Trợ giúp cần tìm ra lý do cho maxClauseCount được đặt thành 1024 lỗi

"maxClauseCount được thiết lập 1024"

Nếu tôi thực hiện sau dòng ngay trước khi thực hiện truy vấn tìm kiếm, sau đó tôi không nhận được lỗi này. BooleanQuery.SetMaxClauseCount (Int16.MaxValue); searcher.Search (myQuery, collector);

Tôi có thiếu thứ gì đó ở đây không? Tại sao không nhận được lỗi này trong chỉ mục thử nghiệm? Lược đồ cho hai chỉ mục giống nhau. Chúng chỉ khác nhau về số lượng hồ sơ/dữ liệu.PROD index có số lượng hồ sơ cao hơn (khoảng 1300) so với thử nghiệm (khoảng 950).

Cảm ơn bạn đã đọc.

+0

chk http://wiki.apache.org/lucene-java/LuceneFAQ#Why_am_I_getting_a_TooManyClauses_exception.3F – Narayan

Trả lời

11

Truy vấn phạm vi cơ bản được chuyển thành truy vấn boolean với một mệnh đề cho mọi giá trị có thể, HOẶC cùng nhau.

Ví dụ, truy vấn + giá: [10-13] được tranformed để truy vấn boolean

+(price:10 price:11 price:12 price:13) 

giả định tất cả các giá trị 10-13 tồn tại trong chỉ mục.

Tôi giả sử, tất cả giá trị 1300 của bạn nằm trong phạm vi bạn đã đưa ra. Vì vậy, truy vấn boolean có 1300 mệnh đề, cao hơn giá trị mặc định là 1024. Trong chỉ mục thử nghiệm, giới hạn 1024 không đạt được vì chỉ có 950 giá trị.

+0

Cảm ơn Shashikant vì câu trả lời của bạn.Đó là giải pháp để giải quyết vấn đề này? BooleanQuery.SetMaxClauseCount (Int16.MaxValue); được cho là một cuộc gọi rất đắt tiền. Cảm ơn. –

+1

Nhược điểm là hiệu suất truy vấn bị suy giảm với số lượng dấu thời gian duy nhất. Nhưng, nó không phải là xấu. Bạn có thể dùng thử và kiểm tra xem liệu sự hoàn hảo có được chấp nhận hay không. Bạn nên chủ yếu là tốt. Lucene 2.9 (Java) đã cải thiện đáng kể các truy vấn phạm vi. Tôi không chắc chắn khi nào điều này sẽ được chuyển sang phiên bản .Net. Trong khi đó, có các thủ thuật khác mà bạn có thể sử dụng cho các truy vấn ngày. Thông thường, nó liên quan đến việc chia nhỏ ngày thành năm, tháng và ngày.Điều này cần rất nhiều công việc để dịch truy vấn người dùng sang định dạng lucene cơ bản. Hãy thử tìm kiếm "truy vấn ngày lucene" để nhận ý tưởng thú vị. –

+0

Trong thời gian chờ đợi, bạn có thể thiết kế trường ngày của mình khác nhau - bạn có thể hạn chế trường ngày này trong một năm không? (do đó hạn chế nó với giá trị 365)? Hoặc chia dữ liệu thành năm, tháng và ngày và sử dụng truy vấn phức tạp hơn? Tôi biết điều này là không phù hợp, nhưng nó có thể hoạt động. –

12

Tôi đã gặp vấn đề tương tự. Giải pháp của tôi là bắt BooleanQuery.TooManyClauses và tự động tăng maxClauseCount.

Dưới đây là một số mã tương tự với những gì tôi có trong quá trình sản xuất.

Good Luck, Randy


    private static Hits searchIndex(Searcher searcher, Query query) 
     throws IOException 
    { 
     boolean retry = true; 
     while (retry) 
     { 
      try 
      { 
       retry = false; 
       Hits myHits = searcher.search(query); 
       return myHits; 
      } 
      catch (BooleanQuery.TooManyClauses e) 
      { 
       // Double the number of boolean queries allowed. 
       // The default is in org.apache.lucene.search.BooleanQuery and is 1024. 
       String defaultQueries = Integer.toString(BooleanQuery.getMaxClauseCount()); 
       int oldQueries = Integer.parseInt(System.getProperty("org.apache.lucene.maxClauseCount", defaultQueries)); 
       int newQueries = oldQueries * 2; 
       log.error("Too many hits for query: " + oldQueries + ". Increasing to " + newQueries, e); 
       System.setProperty("org.apache.lucene.maxClauseCount", Integer.toString(newQueries)); 
       BooleanQuery.setMaxClauseCount(newQueries); 
       retry = true; 
      } 
     } 
    } 
+0

Đây là một giải pháp tốt, nhưng tại sao không đếm các mệnh đề trước đó và đặt nó một cách chính xác thay vì sau khi bắt ngoại lệ? Điều này có ảnh hưởng đến hiệu suất nếu một lượng lớn dữ liệu được xử lý không? – trillions

+1

Nanshi, lý do là vì nó * không thể * được tính toán. Không có cách nào để tìm ra bao nhiêu mục được bao gồm trong phạm vi cho đến * sau * bạn làm một truy vấn, nhưng sau đó truy vấn đó được chuyển thành một truy vấn Boolean, nơi ngoại lệ được ném. –

+0

Cảm ơn Randy! Tôi có một trường hợp khác biệt mà tôi xây dựng các truy vấn Boolean bản thân mình, vì vậy tôi đã có thể đếm nó trước khi chạy một tìm kiếm. – trillions

1

tôi đã cùng một vấn đề này trong C# mã chạy với hệ thống quản lý nội dung web Sitecore. Tôi đã sử dụng câu trả lời của Randy ở trên, nhưng không thể sử dụng chức năng System get và set property. Thay vào đó tôi lấy số đếm hiện tại, tăng lên và đặt lại. Làm việc tuyệt vời!

catch (BooleanQuery.TooManyClauses e) 
{ 
    // Increment the number of boolean queries allowed. 
    // The default is 1024. 
    var currMaxClause = BooleanQuery.GetMaxClauseCount(); 
    var newMaxClause = currMaxClause + 1024; 
    BooleanQuery.SetMaxClauseCount(newMaxClause); 
    retry = true; 
} 
0

Chỉ cần đặt, BooleanQuery.setMaxClauseCount(Integer.MAX_VALUE); và thế là xong.

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