--- ferret-0.11.4/ext/q_multi_term.c (revision 772) +++ ferret-0.11.4/ext/q_multi_term.c (revision 773) @@ -662,5 +662,5 @@ void multi_tq_add_term_boost(Query *self, const char *term, float boost) { - if (boost > MTQ(self)->min_boost) { + if (boost > MTQ(self)->min_boost && term && term[0]) { BoostedTerm *bt = boosted_term_new(term, boost); PriorityQueue *bt_pq = MTQ(self)->boosted_terms; --- ferret-0.11.4/ext/q_parser.c (revision 756) +++ ferret-0.11.4/ext/q_parser.c (revision 773) @@ -148,5 +148,5 @@ char *str; } -/* Line 193 of yacc.c. */ +/* Line 187 of yacc.c. */ #line 152 "y.tab.c" YYSTYPE; @@ -2490,7 +2490,35 @@ else { int i; - q = bq_new_max(false, qp->max_clauses); + int term_cnt = 0; + Token *token; + char *last_word; + for (i = 0; i < word_count; i++) { - bq_add_query_nr(q, get_term_q(qp, field, words[i]), BC_SHOULD); + token = ts_next(get_cached_ts(qp, field, words[i])); + free(words[i]); + if (token) { + last_word = words[i] = estrdup(token->text); + ++term_cnt; + } + else { + words[i] = estrdup(""); + } + } + + switch (term_cnt) { + case 0: + q = bq_new(false); + break; + case 1: + q = tq_new(field, last_word); + break; + default: + q = multi_tq_new_conf(field, term_cnt, 0.0); + for (i = 0; i < word_count; i++) { + if (words[i][0]) { + multi_tq_add_term(q, words[i]); + } + } + break; } } --- ferret-0.11.4/test/unit/query_parser/tc_query_parser.rb (revision 772) +++ ferret-0.11.4/test/unit/query_parser/tc_query_parser.rb (revision 773) @@ -23,5 +23,5 @@ ['field:"one <> 222 <> three|four|five <>"', 'field:"one <> 222 <> three|four|five"'], ['field:"on1|tw2 THREE|four|five six|seven"', 'field:"on1|tw2 THREE|four|five six|seven"'], - ['field:"testing|trucks"', 'field:testing field:trucks'], + ['field:"testing|trucks"', 'field:"testing|trucks"'], ['[aaa bbb]', '[aaa bbb]'], ['{aaa bbb]', '{aaa bbb]'], @@ -92,4 +92,6 @@ ['*:"asdf <> xxx|yyy"', '"asdf <> xxx|yyy" field:"asdf <> xxx|yyy" f1:"asdf <> xxx|yyy" f2:"asdf <> xxx|yyy"'], ['f1|f2:"asdf <> xxx|yyy"', 'f1:"asdf <> xxx|yyy" f2:"asdf <> xxx|yyy"'], + ['f1|f2:"asdf <> do|yyy"', 'f1:"asdf <> yyy" f2:"asdf <> yyy"'], + ['f1|f2:"do|cat"', 'f1:cat f2:cat'], ['*:[bbb xxx]', '[bbb xxx] field:[bbb xxx] f1:[bbb xxx] f2:[bbb xxx]'],