mirror of
https://github.com/postgres/postgres.git
synced 2025-09-02 04:21:28 +03:00
Extend GIN to support partial-match searches, and extend tsquery to support
prefix matching using this facility. Teodor Sigaev and Oleg Bartunov
This commit is contained in:
@@ -7,7 +7,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/tsearch/to_tsany.c,v 1.11 2008/03/25 22:42:43 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/tsearch/to_tsany.c,v 1.12 2008/05/16 16:31:01 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -32,23 +32,22 @@ get_current_ts_config(PG_FUNCTION_ARGS)
|
||||
static int
|
||||
compareWORD(const void *a, const void *b)
|
||||
{
|
||||
if (((ParsedWord *) a)->len == ((ParsedWord *) b)->len)
|
||||
int res;
|
||||
|
||||
res = tsCompareString(
|
||||
((ParsedWord *) a)->word, ((ParsedWord *) a)->len,
|
||||
((ParsedWord *) b)->word, ((ParsedWord *) b)->len,
|
||||
false );
|
||||
|
||||
if (res == 0)
|
||||
{
|
||||
int res = strncmp(
|
||||
((ParsedWord *) a)->word,
|
||||
((ParsedWord *) b)->word,
|
||||
((ParsedWord *) b)->len);
|
||||
if (((ParsedWord *) a)->pos.pos == ((ParsedWord *) b)->pos.pos)
|
||||
return 0;
|
||||
|
||||
if (res == 0)
|
||||
{
|
||||
if (((ParsedWord *) a)->pos.pos == ((ParsedWord *) b)->pos.pos)
|
||||
return 0;
|
||||
|
||||
return (((ParsedWord *) a)->pos.pos > ((ParsedWord *) b)->pos.pos) ? 1 : -1;
|
||||
}
|
||||
return res;
|
||||
res = (((ParsedWord *) a)->pos.pos > ((ParsedWord *) b)->pos.pos) ? 1 : -1;
|
||||
}
|
||||
return (((ParsedWord *) a)->len > ((ParsedWord *) b)->len) ? 1 : -1;
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
static int
|
||||
@@ -268,7 +267,7 @@ to_tsvector(PG_FUNCTION_ARGS)
|
||||
* and different variants are ORred together.
|
||||
*/
|
||||
static void
|
||||
pushval_morph(Datum opaque, TSQueryParserState state, char *strval, int lenval, int2 weight)
|
||||
pushval_morph(Datum opaque, TSQueryParserState state, char *strval, int lenval, int2 weight, bool prefix)
|
||||
{
|
||||
int4 count = 0;
|
||||
ParsedText prs;
|
||||
@@ -302,7 +301,8 @@ pushval_morph(Datum opaque, TSQueryParserState state, char *strval, int lenval,
|
||||
while (count < prs.curwords && pos == prs.words[count].pos.pos && variant == prs.words[count].nvariant)
|
||||
{
|
||||
|
||||
pushValue(state, prs.words[count].word, prs.words[count].len, weight);
|
||||
pushValue(state, prs.words[count].word, prs.words[count].len, weight,
|
||||
( (prs.words[count].flags & TSL_PREFIX) || prefix ) ? true : false );
|
||||
pfree(prs.words[count].word);
|
||||
if (cnt)
|
||||
pushOperator(state, OP_AND);
|
||||
|
@@ -7,7 +7,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/tsearch/ts_parse.c,v 1.7 2008/01/01 19:45:52 momjian Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/tsearch/ts_parse.c,v 1.8 2008/05/16 16:31:01 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -415,6 +415,7 @@ parsetext(Oid cfgId, ParsedText *prs, char *buf, int buflen)
|
||||
prs->words[prs->curwords].len = strlen(ptr->lexeme);
|
||||
prs->words[prs->curwords].word = ptr->lexeme;
|
||||
prs->words[prs->curwords].nvariant = ptr->nvariant;
|
||||
prs->words[prs->curwords].flags = ptr->flags & TSL_PREFIX;
|
||||
prs->words[prs->curwords].alen = 0;
|
||||
prs->words[prs->curwords].pos.pos = LIMITPOS(prs->pos);
|
||||
ptr++;
|
||||
@@ -463,8 +464,8 @@ hlfinditem(HeadlineParsedText *prs, TSQuery query, char *buf, int buflen)
|
||||
for (i = 0; i < query->size; i++)
|
||||
{
|
||||
if (item->type == QI_VAL &&
|
||||
item->operand.length == buflen &&
|
||||
strncmp(GETOPERAND(query) + item->operand.distance, buf, buflen) == 0)
|
||||
tsCompareString( GETOPERAND(query) + item->operand.distance, item->operand.length,
|
||||
buf, buflen, item->operand.prefix ) == 0 )
|
||||
{
|
||||
if (word->item)
|
||||
{
|
||||
|
Reference in New Issue
Block a user