2012-05-07 2 views
0

Я строю запрос apacheolr в своем модуле Drupal программным образом и имел успех с некоторыми аспектами, но я все еще борюсь с другими.Apacheolr query - фильтр по тексту в полях

До сих пор я был в состоянии построить запрос, который может осуществлять поиск определенного текста и ограничить результаты, основанные на условиях, фильтруется с помощью следующего кода:

$subquery_region->addFilter('tid', $term->tid); 
$query->addFilterSubQuery($subquery_region, 'OR', 'AND'); 

То, что я хотел бы достичь следующего - это возможность сузить поиск дальше, добавив фильтр для поиска определенного текста в определенном поле в узле. Кто-нибудь мог это сделать.

Я исследовал в Интернете, и перепробовали множество различных способов, таких как добавление фильтра непосредственно к основному поисковому запросу

$query->addParam('fl', 'ss_my_field'); 
$query->addFilter("ss_my_field", "field_substring_to_search_for"); 

Как и нарушения, что из в подзапрос, чтобы добавить в основной поиск запрос

$subquery_test = apachesolr_drupal_query("Test"); 
$subquery_test->addParam('fl', 'ss_my_field'); 
$subquery_test->addFilter("ss_my_field", "field_substring_to_search_for"); 
$query->addFilterSubQuery($subquery_test, 'OR', 'AND'); 

Но никто из них не работает. Они возвращают пустой набор, хотя я знаю, что подстрока существует в поле, которое я добавляю в качестве фильтра, и оно было проиндексировано. Я проверил через модуль views apacheorl, что индекс поиска был заполнен этим полем и может видеть, что подстрока существует.

Есть ли что-то не так с моим синтаксисом или тем, как я строю запрос?

Если вы знаете, как добавлять фильтры для поиска текста в определенных полях, пожалуйста, поделитесь! Это может быть даже не сделано с помощью функции addFilter, но это все, что я пытался до сих пор. Спасибо!

ответ

3

Сначала вам нужно создать индекс для этого конкретного поля.

function hook_apachesolr_update_index(&$document, $node) { 
    $document->ss_your_field_name = $node->your_field_name; 
} 

где ss_ * - это шаблон.
ss_ * -> Строка
is_ * -> Integer
im_ * -> Integer, многозначные

После этого вы должны
1. удалить индекс - админ/Настройки/apachesolr/индекс
2 . Переиндексировать содержание
3. запустить хрон
4. Проверьте фильтр, который вы создали - админ/отчеты/apachesolr/индекс

Затем, вы можете добавить фильтры

$query->addFilter("ss_your_field_name", "value"); 

Надеюсь, это вам поможет.

+0

Рам, большое вам спасибо за помощь. Первая часть работала красиво, и теперь я вижу, что мои поля добавляются в индекс. Однако добавление их с помощью функции addFilter(), как описано, ничего не возвращает. Любые другие идеи по формату. Я редактирую свой вопрос, чтобы включить все, что я пробовал до сих пор, что не сработало ... –

0
function hook_apachesolr_modify_query(&$query, &$params, $caller){ 
    $subquery = apachesolr_drupal_query(); 
    $subquery->add_filter("ss_my_field", "field_substring_to_search_for"); 
    $query->add_subquery($subquery, "AND"); 
} 
+0

Спасибо, Рам. Это именно то, что я делал, за исключением моего кода в моем вопросе, является версия этих функций Drupal 7.Это все еще не 100% работает для меня, но я + первый ваш ответ, потому что это определенно приближает меня. Еще раз спасибо! –

Смежные вопросы