From: Demian K. <dem...@vi...> - 2010-04-16 14:06:25
|
Thanks for catching this -- it does indeed look like a bug, and I have fixed it as of r2435. However, I believe the only fix that is needed is the addition of the missing parentheses when the $excludes array is put together at the end. The earlier section of the buildQuery method should not be changed -- it appears to be correct, just confusing due to the way the data structure is arranged. $params['group'] represents a single search group on the advanced search screen, not the entire search. Every "bool" element within the elements of the $params['group'] array will always have the same value, since there is only one boolean setting per group. Thus, you should only need to look at $params['group'][0]['bool'] in order to figure out how to handle the entire group. By moving the $excludes and $groups assignments within the "foreach ($params['group'] as $group)" loop, you will actually end up adding redundant terms to your search. I would recommend reverting your changes except for the fix to the NOT clause. Please let me know if you still see problems after doing that; this is somewhat dense code, so it's possible I'm misunderstanding something... but I'm pretty confident of my understanding at this point. - Demian From: Tuan Nguyen [mailto:tu...@yo...] Sent: Thursday, April 15, 2010 4:35 PM To: vuf...@li... Subject: [VuFind-Tech] advanced search Hello everyone, I'm not sure if this is a bug or not. I may have misunderstood the intention of the original code. My search is: Group 0: AllFields: dog NO Terms Group 1: AllFields: cat NO Terms The query I am expecting is NOT ((AllFields: dog) OR (AllFields: cat)) However,the query that got built was: "() NOT (AllFields:dog) OR (AllFields:cat)" See http://vufind.org/demo/Search/Results?join=AND&bool0[]=NOT&lookfor0[]=dog&type0[]=AllFields&lookfor0[]=&type0[]=AllFields&lookfor0[]=&type0[]=AllFields&bool1[]=NOT&lookfor1[]=cat&type1[]=AllFields&submit=Find&illustration=-1 Looking at the buildQuery method in sys/Solr.php, // Advanced Search if (isset($params['group'])) { $thisGroup = array(); // Process each search group foreach ($params['group'] as $group) { // Build this group individually as a basic search $thisGroup[] = $this->buildQuery(array($group), $noCapBools); } // Is this an exclusion (NOT) group or a normal group? if ($params['group'][0]['bool'] == 'NOT') { $excludes[] = join(" OR ", $thisGroup); } else { $groups[] = join(" ".$params['group'][0]['bool']." ", $thisGroup); } } It appears that the whole search is automatically a "NOT" search if the first group is a "NO Terms". I changed it to // Advanced Search if (isset($params['group'])) { $thisGroup = array(); // Process each search group foreach ($params['group'] as $group) { // Build this group individually as a basic search $thisGroup[] = $this->buildQuery(array($group)); // Is this an exclusion (NOT) group or a normal group? if ($group['bool'] == 'NOT') { $excludes[] = join(" OR ", $thisGroup); } else { $groups[] = join(" ".$group['bool']." ", $thisGroup); } } } Also, the NOT was not applied to the whole exclusion, but only to the first one // and concatenate exlucsion after that if (count($excludes) > 0) { $query .= " NOT (" . join(") OR (", $excludes) . ")"; } So I changed it to // and concatenate exlucsion after that if (count($excludes) > 0) { $query .= " NOT ((" . join(") OR (", $excludes) . "))"; } Now, this is giving me what I expected. http://www-dev.library.yorku.ca/find/Search/Results?join=AND&bool0[]=NOT&lookfor0[]=dog&type0[]=AllFields&bool1[]=NOT&lookfor1[]=cat&type1[]=AllFields |