The following test script was written to test what I found as a possible
bug in query parser
#!/usr/bin/perl
use strict;
use Search::Xapian qw/:standard/;
my $QueryParser = new Search::Xapian::QueryParser();
$QueryParser->set_default_op(OP_AND);
$QueryParser->set_stemmer(new Search::Xapian::Stem("english"));
$QueryParser->set_stemming_strategy(STEM_SOME);
print "this script is to test the LoveHate feature. Notice that when
phrases are not surrounded by brackets, the -notallowed translates
to a regular AND search rather than a AND_NOT as it should be\n\n";
print "right: ".$QueryParser->parse_query(qq{testing search
-notallowed},(FLAG_BOOLEAN | FLAG_PHRASE | FLAG_LOVEHATE |
FLAG_WILDCARD))."\n";
print "right: ".$QueryParser->parse_query(qq{("testing
phrase")
-notallowed},(FLAG_BOOLEAN | FLAG_PHRASE | FLAG_LOVEHATE |
FLAG_WILDCARD))."\n";
print "wrong: ".$QueryParser->parse_query(qq{"testing
phrase"
-notallowed},(FLAG_BOOLEAN | FLAG_PHRASE | FLAG_LOVEHATE |
FLAG_WILDCARD))."\n";
This is the output:
this script is to test the LoveHate feature. Notice that when
phrases are not surrounded by brackets, the -notallowed translates
to a regular AND search rather than a AND_NOT as it should be
right: Xapian::Query(((Ztest:(pos=1) AND Zsearch:(pos=2)) AND_NOT
Znotallow:(pos=3)))
right: Xapian::Query(((testing:(pos=1) PHRASE 2 phrase:(pos=2))
AND_NOT Znotallow:(pos=3)))
wrong: Xapian::Query(((testing:(pos=1) PHRASE 2 phrase:(pos=2)) AND
Znotallow:(pos=3)))
Notice that the third search has [AND Znotallow:(pos=3)] rather than
[AND_NOT Znotallow:(pos=3)]
As you can see from the second, if forcing the phrase into (), it
manages to parse the query properly, but it should have done the same
without it.
Your thoughts?
Ron