From bb140506df605fab58f48926ee1db1f80bdafb59 Mon Sep 17 00:00:00 2001 From: Teodor Sigaev Date: Thu, 7 Apr 2016 18:44:18 +0300 Subject: Phrase full text search. Patch introduces new text search operator (<-> or ) into tsquery. On-disk and binary in/out format of tsquery are backward compatible. It has two side effect: - change order for tsquery, so, users, who has a btree index over tsquery, should reindex it - less number of parenthesis in tsquery output, and tsquery becomes more readable Authors: Teodor Sigaev, Oleg Bartunov, Dmitry Ivanov Reviewers: Alexander Korotkov, Artur Zakirov --- src/backend/utils/adt/tsquery_util.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) (limited to 'src/backend/utils/adt/tsquery_util.c') diff --git a/src/backend/utils/adt/tsquery_util.c b/src/backend/utils/adt/tsquery_util.c index fe26ad52dd2..0f338aa653d 100644 --- a/src/backend/utils/adt/tsquery_util.c +++ b/src/backend/utils/adt/tsquery_util.c @@ -110,6 +110,10 @@ QTNodeCompare(QTNode *an, QTNode *bn) if ((res = QTNodeCompare(an->child[i], bn->child[i])) != 0) return res; } + + if (ao->oper == OP_PHRASE && ao->distance != bo->distance) + return (ao->distance > bo->distance) ? -1 : 1; + return 0; } else if (an->valnode->type == QI_VAL) @@ -150,7 +154,7 @@ QTNSort(QTNode *in) for (i = 0; i < in->nchild; i++) QTNSort(in->child[i]); - if (in->nchild > 1) + if (in->nchild > 1 && in->valnode->qoperator.oper != OP_PHRASE) qsort((void *) in->child, in->nchild, sizeof(QTNode *), cmpQTN); } @@ -190,7 +194,10 @@ QTNTernary(QTNode *in) { QTNode *cc = in->child[i]; - if (cc->valnode->type == QI_OPR && in->valnode->qoperator.oper == cc->valnode->qoperator.oper) + /* OP_Phrase isn't associative */ + if (cc->valnode->type == QI_OPR && + in->valnode->qoperator.oper == cc->valnode->qoperator.oper && + in->valnode->qoperator.oper != OP_PHRASE) { int oldnchild = in->nchild; -- cgit v1.2.3