mirror of
https://github.com/postgres/postgres.git
synced 2025-08-21 10:42:50 +03:00
Phrase full text search.
Patch introduces new text search operator (<-> or <DISTANCE>) 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
This commit is contained in:
@@ -34,16 +34,17 @@ typedef struct
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
uint32 selected:1,
|
||||
in:1,
|
||||
replace:1,
|
||||
repeated:1,
|
||||
skip:1,
|
||||
unused:3,
|
||||
type:8,
|
||||
len:16;
|
||||
char *word;
|
||||
QueryOperand *item;
|
||||
uint32 selected: 1,
|
||||
in: 1,
|
||||
replace: 1,
|
||||
repeated: 1,
|
||||
skip: 1,
|
||||
unused: 3,
|
||||
type: 8,
|
||||
len: 16;
|
||||
WordEntryPos pos;
|
||||
char *word;
|
||||
QueryOperand *item;
|
||||
} HeadlineWordEntry;
|
||||
|
||||
typedef struct
|
||||
@@ -51,6 +52,7 @@ typedef struct
|
||||
HeadlineWordEntry *words;
|
||||
int32 lenwords;
|
||||
int32 curwords;
|
||||
int32 vectorpos; /* positions a-la tsvector */
|
||||
char *startsel;
|
||||
char *stopsel;
|
||||
char *fragdelim;
|
||||
|
@@ -49,6 +49,8 @@ typedef struct
|
||||
#define MAXSTRLEN ( (1<<11) - 1)
|
||||
#define MAXSTRPOS ( (1<<20) - 1)
|
||||
|
||||
extern int comparePos(const void *a, const void *b);
|
||||
|
||||
/*
|
||||
* Equivalent to
|
||||
* typedef struct {
|
||||
@@ -213,15 +215,33 @@ typedef struct
|
||||
} QueryOperand;
|
||||
|
||||
|
||||
/* Legal values for QueryOperator.operator */
|
||||
#define OP_NOT 1
|
||||
#define OP_AND 2
|
||||
#define OP_OR 3
|
||||
/*
|
||||
* Legal values for QueryOperator.operator.
|
||||
* They should be ordered by priority! We assume that phrase
|
||||
* has highest priority, but this agreement is only
|
||||
* for query transformation! That's need to simplify
|
||||
* algorithm of query transformation.
|
||||
*/
|
||||
#define OP_OR 1
|
||||
#define OP_AND 2
|
||||
#define OP_NOT 3
|
||||
#define OP_PHRASE 4
|
||||
#define OP_NOT_PHRASE 5 /*
|
||||
* OP_PHRASE negation operations must have greater
|
||||
* priority in order to force infix() to surround
|
||||
* the whole OP_PHRASE expression with parentheses.
|
||||
*/
|
||||
|
||||
#define TOP_PRIORITY 6 /* highest priority for val nodes */
|
||||
|
||||
#define OP_PRIORITY(x) (x)
|
||||
#define QO_PRIORITY(x) OP_PRIORITY(((QueryOperator *) (x))->oper)
|
||||
|
||||
typedef struct
|
||||
{
|
||||
QueryItemType type;
|
||||
int8 oper; /* see above */
|
||||
int16 distance; /* distance between agrs for OP_PHRASE */
|
||||
uint32 left; /* pointer to left operand. Right operand is
|
||||
* item + 1, left operand is placed
|
||||
* item+item->left */
|
||||
@@ -304,6 +324,8 @@ extern Datum tsquery_numnode(PG_FUNCTION_ARGS);
|
||||
|
||||
extern Datum tsquery_and(PG_FUNCTION_ARGS);
|
||||
extern Datum tsquery_or(PG_FUNCTION_ARGS);
|
||||
extern Datum tsquery_phrase(PG_FUNCTION_ARGS);
|
||||
extern Datum tsquery_phrase_distance(PG_FUNCTION_ARGS);
|
||||
extern Datum tsquery_not(PG_FUNCTION_ARGS);
|
||||
|
||||
extern Datum tsquery_rewrite(PG_FUNCTION_ARGS);
|
||||
|
@@ -55,7 +55,7 @@ extern TSQuery parse_tsquery(char *buf,
|
||||
extern void pushValue(TSQueryParserState state,
|
||||
char *strval, int lenval, int16 weight, bool prefix);
|
||||
extern void pushStop(TSQueryParserState state);
|
||||
extern void pushOperator(TSQueryParserState state, int8 oper);
|
||||
extern void pushOperator(TSQueryParserState state, int8 oper, int16 distance);
|
||||
|
||||
/*
|
||||
* parse plain text and lexize words
|
||||
@@ -104,8 +104,15 @@ extern text *generateHeadline(HeadlineParsedText *prs);
|
||||
/*
|
||||
* Common check function for tsvector @@ tsquery
|
||||
*/
|
||||
typedef struct ExecPhraseData
|
||||
{
|
||||
int npos;
|
||||
bool allocated;
|
||||
WordEntryPos *pos;
|
||||
} ExecPhraseData;
|
||||
|
||||
extern bool TS_execute(QueryItem *curitem, void *checkval, bool calcnot,
|
||||
bool (*chkcond) (void *checkval, QueryOperand *val));
|
||||
bool (*chkcond) (void *, QueryOperand *, ExecPhraseData *));
|
||||
extern bool tsquery_requires_match(QueryItem *curitem);
|
||||
|
||||
/*
|
||||
@@ -120,6 +127,8 @@ extern Datum to_tsquery_byid(PG_FUNCTION_ARGS);
|
||||
extern Datum to_tsquery(PG_FUNCTION_ARGS);
|
||||
extern Datum plainto_tsquery_byid(PG_FUNCTION_ARGS);
|
||||
extern Datum plainto_tsquery(PG_FUNCTION_ARGS);
|
||||
extern Datum phraseto_tsquery_byid(PG_FUNCTION_ARGS);
|
||||
extern Datum phraseto_tsquery(PG_FUNCTION_ARGS);
|
||||
|
||||
/*
|
||||
* GiST support function
|
||||
@@ -169,7 +178,7 @@ extern Datum gin_tsquery_consistent_oldsig(PG_FUNCTION_ARGS);
|
||||
* TSQuery Utilities
|
||||
*/
|
||||
extern QueryItem *clean_NOT(QueryItem *ptr, int32 *len);
|
||||
extern QueryItem *clean_fakeval(QueryItem *ptr, int32 *len);
|
||||
extern TSQuery cleanup_fakeval_and_phrase(TSQuery in);
|
||||
|
||||
typedef struct QTNode
|
||||
{
|
||||
|
Reference in New Issue
Block a user