Annotation of embedaddon/sqlite3/ext/fts3/README.syntax, revision 1.1
1.1 ! misho 1:
! 2: 1. OVERVIEW
! 3:
! 4: This README file describes the syntax of the arguments that may be passed to
! 5: the FTS3 MATCH operator used for full-text queries. For example, if table
! 6: "t1" is an Fts3 virtual table, the following SQL query:
! 7:
! 8: SELECT * FROM t1 WHERE <col> MATCH <full-text query>
! 9:
! 10: may be used to retrieve all rows that match a specified for full-text query.
! 11: The text "<col>" should be replaced by either the name of the fts3 table
! 12: (in this case "t1"), or by the name of one of the columns of the fts3
! 13: table. <full-text-query> should be replaced by an SQL expression that
! 14: computes to a string containing an Fts3 query.
! 15:
! 16: If the left-hand-side of the MATCH operator is set to the name of the
! 17: fts3 table, then by default the query may be matched against any column
! 18: of the table. If it is set to a column name, then by default the query
! 19: may only match the specified column. In both cases this may be overriden
! 20: as part of the query text (see sections 2 and 3 below).
! 21:
! 22: As of SQLite version 3.6.8, Fts3 supports two slightly different query
! 23: formats; the standard syntax, which is used by default, and the enhanced
! 24: query syntax which can be selected by compiling with the pre-processor
! 25: symbol SQLITE_ENABLE_FTS3_PARENTHESIS defined.
! 26:
! 27: -DSQLITE_ENABLE_FTS3_PARENTHESIS
! 28:
! 29: 2. STANDARD QUERY SYNTAX
! 30:
! 31: When using the standard Fts3 query syntax, a query usually consists of a
! 32: list of terms (words) separated by white-space characters. To match a
! 33: query, a row (or column) of an Fts3 table must contain each of the specified
! 34: terms. For example, the following query:
! 35:
! 36: <col> MATCH 'hello world'
! 37:
! 38: matches rows (or columns, if <col> is the name of a column name) that
! 39: contain at least one instance of the token "hello", and at least one
! 40: instance of the token "world". Tokens may be grouped into phrases using
! 41: quotation marks. In this case, a matching row or column must contain each
! 42: of the tokens in the phrase in the order specified, with no intervening
! 43: tokens. For example, the query:
! 44:
! 45: <col> MATCH '"hello world" joe"
! 46:
! 47: matches the first of the following two documents, but not the second or
! 48: third:
! 49:
! 50: "'Hello world', said Joe."
! 51: "One should always greet the world with a cheery hello, thought Joe."
! 52: "How many hello world programs could their be?"
! 53:
! 54: As well as grouping tokens together by phrase, the binary NEAR operator
! 55: may be used to search for rows that contain two or more specified tokens
! 56: or phrases within a specified proximity of each other. The NEAR operator
! 57: must always be specified in upper case. The word "near" in lower or mixed
! 58: case is treated as an ordinary token. For example, the following query:
! 59:
! 60: <col> MATCH 'engineering NEAR consultancy'
! 61:
! 62: matches rows that contain both the "engineering" and "consultancy" tokens
! 63: in the same column with not more than 10 other words between them. It does
! 64: not matter which of the two terms occurs first in the document, only that
! 65: they be seperated by only 10 tokens or less. The user may also specify
! 66: a different required proximity by adding "/N" immediately after the NEAR
! 67: operator, where N is an integer. For example:
! 68:
! 69: <col> MATCH 'engineering NEAR/5 consultancy'
! 70:
! 71: searches for a row containing an instance of each specified token seperated
! 72: by not more than 5 other tokens. More than one NEAR operator can be used
! 73: in as sequence. For example this query:
! 74:
! 75: <col> MATCH 'reliable NEAR/2 engineering NEAR/5 consultancy'
! 76:
! 77: searches for a row that contains an instance of the token "reliable"
! 78: seperated by not more than two tokens from an instance of "engineering",
! 79: which is in turn separated by not more than 5 other tokens from an
! 80: instance of the term "consultancy". Phrases enclosed in quotes may
! 81: also be used as arguments to the NEAR operator.
! 82:
! 83: Similar to the NEAR operator, one or more tokens or phrases may be
! 84: separated by OR operators. In this case, only one of the specified tokens
! 85: or phrases must appear in the document. For example, the query:
! 86:
! 87: <col> MATCH 'hello OR world'
! 88:
! 89: matches rows that contain either the term "hello", or the term "world",
! 90: or both. Note that unlike in many programming languages, the OR operator
! 91: has a higher precedence than the AND operators implied between white-space
! 92: separated tokens. The following query matches documents that contain the
! 93: term 'sqlite' and at least one of the terms 'fantastic' or 'impressive',
! 94: not those that contain both 'sqlite' and 'fantastic' or 'impressive':
! 95:
! 96: <col> MATCH 'sqlite fantastic OR impressive'
! 97:
! 98: Any token that is part of an Fts3 query expression, whether or not it is
! 99: part of a phrase enclosed in quotes, may have a '*' character appended to
! 100: it. In this case, the token matches all terms that begin with the characters
! 101: of the token, not just those that exactly match it. For example, the
! 102: following query:
! 103:
! 104: <col> MATCH 'sql*'
! 105:
! 106: matches all rows that contain the term "SQLite", as well as those that
! 107: contain "SQL".
! 108:
! 109: A token that is not part of a quoted phrase may be preceded by a '-'
! 110: character, which indicates that matching rows must not contain the
! 111: specified term. For example, the following:
! 112:
! 113: <col> MATCH '"database engine" -sqlite'
! 114:
! 115: matches rows that contain the phrase "database engine" but do not contain
! 116: the term "sqlite". If the '-' character occurs inside a quoted phrase,
! 117: it is ignored. It is possible to use both the '-' prefix and the '*' postfix
! 118: on a single term. At this time, all Fts3 queries must contain at least
! 119: one term or phrase that is not preceded by the '-' prefix.
! 120:
! 121: Regardless of whether or not a table name or column name is used on the
! 122: left hand side of the MATCH operator, a specific column of the fts3 table
! 123: may be associated with each token in a query by preceding a token with
! 124: a column name followed by a ':' character. For example, regardless of what
! 125: is specified for <col>, the following query requires that column "col1"
! 126: of the table contains the term "hello", and that column "col2" of the
! 127: table contains the term "world". If the table does not contain columns
! 128: named "col1" and "col2", then an error is returned and the query is
! 129: not run.
! 130:
! 131: <col> MATCH 'col1:hello col2:world'
! 132:
! 133: It is not possible to associate a specific table column with a quoted
! 134: phrase or a term preceded by a '-' operator. A '*' character may be
! 135: appended to a term associated with a specific column for prefix matching.
! 136:
! 137: 3. ENHANCED QUERY SYNTAX
! 138:
! 139: The enhanced query syntax is quite similar to the standard query syntax,
! 140: with the following four differences:
! 141:
! 142: 1) Parenthesis are supported. When using the enhanced query syntax,
! 143: parenthesis may be used to overcome the built-in precedence of the
! 144: supplied binary operators. For example, the following query:
! 145:
! 146: <col> MATCH '(hello world) OR (simple example)'
! 147:
! 148: matches documents that contain both "hello" and "world", and documents
! 149: that contain both "simple" and "example". It is not possible to forumlate
! 150: such a query using the standard syntax.
! 151:
! 152: 2) Instead of separating tokens and phrases by whitespace, an AND operator
! 153: may be explicitly specified. This does not change query processing at
! 154: all, but may be used to improve readability. For example, the following
! 155: query is handled identically to the one above:
! 156:
! 157: <col> MATCH '(hello AND world) OR (simple AND example)'
! 158:
! 159: As with the OR and NEAR operators, the AND operator must be specified
! 160: in upper case. The word "and" specified in lower or mixed case is
! 161: handled as a regular token.
! 162:
! 163: 3) The '-' token prefix is not supported. Instead, a new binary operator,
! 164: NOT, is included. The NOT operator requires that the query specified
! 165: as its left-hand operator matches, but that the query specified as the
! 166: right-hand operator does not. For example, to query for all rows that
! 167: contain the term "example" but not the term "simple", the following
! 168: query could be used:
! 169:
! 170: <col> MATCH 'example NOT simple'
! 171:
! 172: As for all other operators, the NOT operator must be specified in
! 173: upper case. Otherwise it will be treated as a regular token.
! 174:
! 175: 4) Unlike in the standard syntax, where the OR operator has a higher
! 176: precedence than the implicit AND operator, when using the enhanced
! 177: syntax implicit and explict AND operators have a higher precedence
! 178: than OR operators. Using the enhanced syntax, the following two
! 179: queries are equivalent:
! 180:
! 181: <col> MATCH 'sqlite fantastic OR impressive'
! 182: <col> MATCH '(sqlite AND fantastic) OR impressive'
! 183:
! 184: however, when using the standard syntax, the query:
! 185:
! 186: <col> MATCH 'sqlite fantastic OR impressive'
! 187:
! 188: is equivalent to the enhanced syntax query:
! 189:
! 190: <col> MATCH 'sqlite AND (fantastic OR impressive)'
! 191:
! 192: The precedence of all enhanced syntax operators, in order from highest
! 193: to lowest, is:
! 194:
! 195: NEAR (highest precedence, tightest grouping)
! 196: NOT
! 197: AND
! 198: OR (lowest precedence, loosest grouping)
! 199:
! 200: Using the advanced syntax, it is possible to specify expressions enclosed
! 201: in parenthesis as operands to the NOT, AND and OR operators. However both
! 202: the left and right hand side operands of NEAR operators must be either
! 203: tokens or phrases. Attempting the following query will return an error:
! 204:
! 205: <col> MATCH 'sqlite NEAR (fantastic OR impressive)'
! 206:
! 207: Queries of this form must be re-written as:
! 208:
! 209: <col> MATCH 'sqlite NEAR fantastic OR sqlite NEAR impressive'
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>