More accuracy works with stopwords in queries
This commit is contained in:
parent
d1031cdef2
commit
61366a9503
contrib/tsearch2
@ -569,6 +569,30 @@ select to_tsquery('default', '\'the wether\':dc & \' sKies \':BC ');
|
|||||||
'wether':CD & 'sky':BC
|
'wether':CD & 'sky':BC
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
|
select to_tsquery('asd&(and|fghj)');
|
||||||
|
to_tsquery
|
||||||
|
----------------
|
||||||
|
'asd' & 'fghj'
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
select to_tsquery('(asd&and)|fghj');
|
||||||
|
to_tsquery
|
||||||
|
----------------
|
||||||
|
'asd' | 'fghj'
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
select to_tsquery('(asd&!and)|fghj');
|
||||||
|
to_tsquery
|
||||||
|
----------------
|
||||||
|
'asd' | 'fghj'
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
select to_tsquery('(the|and&(i&1))&fghj');
|
||||||
|
to_tsquery
|
||||||
|
--------------
|
||||||
|
'1' & 'fghj'
|
||||||
|
(1 row)
|
||||||
|
|
||||||
select 'a b:89 ca:23A,64b d:34c'::tsvector @@ 'd:AC & ca';
|
select 'a b:89 ca:23A,64b d:34c'::tsvector @@ 'd:AC & ca';
|
||||||
?column?
|
?column?
|
||||||
----------
|
----------
|
||||||
|
@ -52,15 +52,6 @@ Datum to_tsquery_name(PG_FUNCTION_ARGS);
|
|||||||
PG_FUNCTION_INFO_V1(to_tsquery_current);
|
PG_FUNCTION_INFO_V1(to_tsquery_current);
|
||||||
Datum to_tsquery_current(PG_FUNCTION_ARGS);
|
Datum to_tsquery_current(PG_FUNCTION_ARGS);
|
||||||
|
|
||||||
#define END 0
|
|
||||||
#define ERR 1
|
|
||||||
#define VAL 2
|
|
||||||
#define OPR 3
|
|
||||||
#define OPEN 4
|
|
||||||
#define CLOSE 5
|
|
||||||
#define VALTRUE 6 /* for stop words */
|
|
||||||
#define VALFALSE 7
|
|
||||||
|
|
||||||
/* parser's states */
|
/* parser's states */
|
||||||
#define WAITOPERAND 1
|
#define WAITOPERAND 1
|
||||||
#define WAITOPERATOR 2
|
#define WAITOPERATOR 2
|
||||||
@ -293,7 +284,7 @@ pushval_morph(QPRS_STATE * state, int typeval, char *strval, int lenval, int2 we
|
|||||||
|
|
||||||
/* XXX */
|
/* XXX */
|
||||||
if (prs.curwords == 0)
|
if (prs.curwords == 0)
|
||||||
pushval_asis(state, VALTRUE, 0, 0, 0);
|
pushval_asis(state, VALSTOP, 0, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define STACKDEPTH 32
|
#define STACKDEPTH 32
|
||||||
@ -526,7 +517,7 @@ findoprnd(ITEM * ptr, int4 *pos)
|
|||||||
elog(DEBUG3, (ptr[*pos].type == OPR) ?
|
elog(DEBUG3, (ptr[*pos].type == OPR) ?
|
||||||
"%d %c" : "%d %d", *pos, ptr[*pos].val);
|
"%d %c" : "%d %d", *pos, ptr[*pos].val);
|
||||||
#endif
|
#endif
|
||||||
if (ptr[*pos].type == VAL || ptr[*pos].type == VALTRUE)
|
if (ptr[*pos].type == VAL || ptr[*pos].type == VALSTOP)
|
||||||
{
|
{
|
||||||
ptr[*pos].left = 0;
|
ptr[*pos].left = 0;
|
||||||
(*pos)++;
|
(*pos)++;
|
||||||
|
@ -46,8 +46,7 @@ typedef struct
|
|||||||
#define OPR 3
|
#define OPR 3
|
||||||
#define OPEN 4
|
#define OPEN 4
|
||||||
#define CLOSE 5
|
#define CLOSE 5
|
||||||
#define VALTRUE 6 /* for stop words */
|
#define VALSTOP 6 /* for stop words */
|
||||||
#define VALFALSE 7
|
|
||||||
|
|
||||||
bool TS_execute(ITEM * curitem, void *checkval,
|
bool TS_execute(ITEM * curitem, void *checkval,
|
||||||
bool calcnot, bool (*chkcond) (void *checkval, ITEM * val));
|
bool calcnot, bool (*chkcond) (void *checkval, ITEM * val));
|
||||||
|
@ -177,6 +177,7 @@ clean_NOT_v2(ITEM * ptr, int4 *len)
|
|||||||
#define V_UNKNOWN 0
|
#define V_UNKNOWN 0
|
||||||
#define V_TRUE 1
|
#define V_TRUE 1
|
||||||
#define V_FALSE 2
|
#define V_FALSE 2
|
||||||
|
#define V_STOP 3
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Clean query tree from values which is always in
|
* Clean query tree from values which is always in
|
||||||
@ -190,10 +191,10 @@ clean_fakeval_intree(NODE * node, char *result)
|
|||||||
|
|
||||||
if (node->valnode->type == VAL)
|
if (node->valnode->type == VAL)
|
||||||
return node;
|
return node;
|
||||||
else if (node->valnode->type == VALTRUE)
|
else if (node->valnode->type == VALSTOP)
|
||||||
{
|
{
|
||||||
pfree(node);
|
pfree(node);
|
||||||
*result = V_TRUE;
|
*result = V_STOP;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -203,65 +204,29 @@ clean_fakeval_intree(NODE * node, char *result)
|
|||||||
node->right = clean_fakeval_intree(node->right, &rresult);
|
node->right = clean_fakeval_intree(node->right, &rresult);
|
||||||
if (!node->right)
|
if (!node->right)
|
||||||
{
|
{
|
||||||
*result = (rresult == V_TRUE) ? V_FALSE : V_TRUE;
|
*result = V_STOP;
|
||||||
freetree(node);
|
freetree(node);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (node->valnode->val == (int4) '|')
|
|
||||||
{
|
|
||||||
NODE *res = node;
|
|
||||||
|
|
||||||
node->left = clean_fakeval_intree(node->left, &lresult);
|
|
||||||
node->right = clean_fakeval_intree(node->right, &rresult);
|
|
||||||
if (lresult == V_TRUE || rresult == V_TRUE)
|
|
||||||
{
|
|
||||||
freetree(node);
|
|
||||||
*result = V_TRUE;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
else if (lresult == V_FALSE && rresult == V_FALSE)
|
|
||||||
{
|
|
||||||
freetree(node);
|
|
||||||
*result = V_FALSE;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
else if (lresult == V_FALSE)
|
|
||||||
{
|
|
||||||
res = node->right;
|
|
||||||
pfree(node);
|
|
||||||
}
|
|
||||||
else if (rresult == V_FALSE)
|
|
||||||
{
|
|
||||||
res = node->left;
|
|
||||||
pfree(node);
|
|
||||||
}
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
NODE *res = node;
|
NODE *res = node;
|
||||||
|
|
||||||
node->left = clean_fakeval_intree(node->left, &lresult);
|
node->left = clean_fakeval_intree(node->left, &lresult);
|
||||||
node->right = clean_fakeval_intree(node->right, &rresult);
|
node->right = clean_fakeval_intree(node->right, &rresult);
|
||||||
if (lresult == V_FALSE || rresult == V_FALSE)
|
if (lresult == V_STOP && rresult == V_STOP)
|
||||||
{
|
{
|
||||||
freetree(node);
|
freetree(node);
|
||||||
*result = V_FALSE;
|
*result = V_STOP;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
else if (lresult == V_TRUE && rresult == V_TRUE)
|
else if (lresult == V_STOP)
|
||||||
{
|
|
||||||
freetree(node);
|
|
||||||
*result = V_TRUE;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
else if (lresult == V_TRUE)
|
|
||||||
{
|
{
|
||||||
res = node->right;
|
res = node->right;
|
||||||
pfree(node);
|
pfree(node);
|
||||||
}
|
}
|
||||||
else if (rresult == V_TRUE)
|
else if (rresult == V_STOP)
|
||||||
{
|
{
|
||||||
res = node->left;
|
res = node->left;
|
||||||
pfree(node);
|
pfree(node);
|
||||||
|
@ -87,6 +87,10 @@ SELECT length(to_tsvector('default', '345 qwe@efd.r \' http://www.com/ http://ae
|
|||||||
select to_tsquery('default', 'qwe & sKies ');
|
select to_tsquery('default', 'qwe & sKies ');
|
||||||
select to_tsquery('simple', 'qwe & sKies ');
|
select to_tsquery('simple', 'qwe & sKies ');
|
||||||
select to_tsquery('default', '\'the wether\':dc & \' sKies \':BC ');
|
select to_tsquery('default', '\'the wether\':dc & \' sKies \':BC ');
|
||||||
|
select to_tsquery('asd&(and|fghj)');
|
||||||
|
select to_tsquery('(asd&and)|fghj');
|
||||||
|
select to_tsquery('(asd&!and)|fghj');
|
||||||
|
select to_tsquery('(the|and&(i&1))&fghj');
|
||||||
select 'a b:89 ca:23A,64b d:34c'::tsvector @@ 'd:AC & ca';
|
select 'a b:89 ca:23A,64b d:34c'::tsvector @@ 'd:AC & ca';
|
||||||
select 'a b:89 ca:23A,64b d:34c'::tsvector @@ 'd:AC & ca:B';
|
select 'a b:89 ca:23A,64b d:34c'::tsvector @@ 'd:AC & ca:B';
|
||||||
select 'a b:89 ca:23A,64b d:34c'::tsvector @@ 'd:AC & ca:A';
|
select 'a b:89 ca:23A,64b d:34c'::tsvector @@ 'd:AC & ca:A';
|
||||||
|
Loading…
x
Reference in New Issue
Block a user