Posted by Rolf van de Krol on October 8, 2009 at 10:25am
I try to query Apache Solr to generate some search results.
<?php
$results = apachesolr_search_execute('some keywords','tid:1','','my/base/path',0,'mymodule');
?>this works perfectly well. The problems arise when i try to do this:
<?php
$results = apachesolr_search_execute('some keywords','tid:1 (tid:2 OR tid:3)','','my/base/path',0,'mymodule');
?>Somewhere I probably missed something, but to me, this should mean: give me all the nodes matching:
- some keywords
- assigned to term with tid = 1
- assigned to term with tid = 2 or assigned to term with tid = 3
It doesn't work like this. My question is: how does it work? It it possible to query solr with this? And if yes: how?
Thanks in advance for your help.
Comments
this doesn't work either
I'm trying to solve something similar, I thought this would work, but does not, nor does char encoding the plus (&43;)
<?php$results = apachesolr_search_execute('some keywords','tid:1 tid:[2+OR+3]','','my/base/path',0,'mymodule');
?>
would require some extra work
After some more digging, found that solr is capable of searching with a param like fq=(tid:2+OR+tid:3), but at present, the Solr_Base_Query class doesn't like a filter passed in like that. It only allows range queries through, otherwise it wraps it in quotes. It also wants to set the filter like name:value, but we want to set it like (name:value+OR+name:value) ... a solution that would require some extra work.
From the Solr_Base_Query (in the apachesolr mod directory)
<?php/**
* Takes an array $field and combines the #name and #value in a way
* suitable for use in a Solr query.
*/
public function make_filter(array $filter) {
// If the field value has spaces, or : in it, wrap it in double quotes.
// unless it is a range query.
if (preg_match('/[ :]/', $filter['#value']) && !isset($filter['#start']) && !preg_match('/[\[\{]\S+ TO \S+[\]\}]/', $filter['#value'])) {
$filter['#value'] = '"'. $filter['#value']. '"';
}
$prefix = empty($filter['#exclude']) ? '' : '-';
return $prefix . $filter['#name'] . ':' . $filter['#value'];
}
?>
See the apachesolr_nodeacess
See the apachesolr_nodeacess module under the contrib/ dir for its construction of an OR fq parameter.
$query->add_subquery($subquery, 'OR');---
Work: Acquia
It seems it makes the query
It seems it makes the query tid:1 OR tid:2
But how to implement tid:3 (tid:1 OR tid:2)?
These do not work:
$query1 = apachesolr_drupal_query();
$query1->add_filter("tid", 20);
$query2 = apachesolr_drupal_query();
$query2->add_filter("tid", 21);
$query1->add_subquery($query2, 'OR');
$query->add_subquery($query1, 'AND');