2010-08-24 36 views
6

Thực hiện tìm kiếm với Apachesolr, tôi muốn thêm một vài bộ lọc trong hook_apachesolr_prepare_query (& $ truy vấn). Điều này làm việc tốt, ngoại trừ tôi muốn các bộ lọc để mở rộng tìm kiếm ('OR'), thay vì thu hẹp nó ('AND').Cách sử dụng nhiều bộ lọc để mở rộng tìm kiếm trong các truy vấn Apachesolr

Ví dụ, nếu tôi có 4 nút loại: A và 3 loại: B khớp với tìm kiếm, để lọc theo loại: A và loại: B sẽ trả về 7 nút (loại: A VÀ nút loại : B), thay vì 0 loại: A cũng thuộc loại: B.

tôi thấy một gợi ý để thực hiện điều này bằng cách sử dụng mô hình nodeaccess

foreach ($filters as $filter) { 
    $subquery = apachesolr_drupal_query(); 
    if (!empty($subquery)) { 
    $subquery->add_filter('type', $filter); 
    $query->add_subquery($subquery); 
    } 
} 

nhưng điều này dường như không làm việc. (Nó không trả lại bất kỳ kết quả nào).

sau đó tôi đã cố gắng (như tôi có một số lượng hạn chế của các loại nút) không bao gồm các loại mà tôi không muốn:

$excludes = array('A', 'B', 'C'); 
$excludes = array_diff($excludes, $filters); 
$exclude = implode('&', $excludes); 
$query->add_filter('type', $exclude, TRUE); 

Phương pháp này của khâu chúng lại với nhau không hoạt động (các '&' được thoát) nhưng cũng không thêm chúng dưới dạng truy vấn phụ, tương tự như cách ở trên.

Bất kỳ đề xuất nào về cách thực hiện việc này?

+0

Tôi cũng đang tìm kiếm – qasimzee

+0

này Dường như bạn có câu trả lời ở đây: http://drupal.org/node/892280 phải không? Có lẽ bạn nên tự mình trả lời. – morja

Trả lời

2

Với Drupal7 và apacheSolr API cuối cùng, bạn có thể làm OR bộ lọc bằng cách làm này:

function my_module_apachesolr_query_alter($query) { 
    // first, create a subQuery filter to store others 
    // and specify there is a "OR" condition 
    $filter = new SolrFilterSubQuery('OR'); 

    // next, add all filters on bundle you want, each as 
    // a new subQuery filter, always with "OR" condition 
    // and add it to the primary filter 
    $a = new SolrFilterSubQuery('OR'); 
    $a->addFilter('bundle', 'A'); 
    $filter->addFilterSubQuery($a); 

    $b = new SolrFilterSubQuery('OR'); 
    $b->addFilter('bundle', 'B'); 
    $filter->addFilterSubQuery($b); 

    $c = new SolrFilterSubQuery('OR'); 
    $c->addFilter('bundle', 'C'); 
    $filter->addFilterSubQuery($c); 

    // finally, add the primary subQuery filter as 
    // subquery of the current query 
    $query->addFilterSubQuery($filter); 

}

Và truy vấn tìm kiếm của bạn về loại A HOẶC gõ B HOẶC loại C (tất cả kết quả trong mỗi loại). Bạn có thể kết hợp OR/AND bằng cách thay đổi tham số của instriation SolrFilterSubQuery.

Đặc biệt cảm ơn trang này và nó của tác giả: http://fr.ench.info/blog/2012/04/03/Add-Filters-ApacheSOLR.html

0

Tôi đã từng chơi với SOLR nhiều nhưng tôi đã quen với Drupal và Zend Lucene (hoặc Drupal Lucene API).

Tôi khuyên bạn nên lọc kết quả dựa trên loại nội dung (vì mỗi nút có loại nội dung được lưu trữ trong đối tượng).

Ý tưởng thứ hai là thay đổi toán tử cơ bản. Tôi không chắc chắn làm thế nào nó được thực hiện trong Solr nhưng tôi Zend Lucene

Zend_Search_Lucene_Search_QueryParser :: setDefaultOperator ($ điều hành) và Zend_Search_Lucene_Search_QueryParser :: getDefaultOperator() phương pháp, tương ứng.

Tài liệu có thể được tìm thấy trong Zend Lucene Docs. Hoặc cho SOLR Solr Docs.

Tôi hy vọng có vấn đề của bạn đúng.

Hy vọng nó giúp :-)

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