Documentation Source Text

Hex Artifact Content
Login

Artifact fd6dbd5656ee37ac6e6ee895403229988bf0e728:


0000: 3c 74 69 74 6c 65 3e 53 51 4c 69 74 65 20 46 54  <title>SQLite FT
0010: 53 33 20 45 78 74 65 6e 73 69 6f 6e 3c 2f 74 69  S3 Extension</ti
0020: 74 6c 65 3e 0a 3c 74 63 6c 3e 0a 0a 68 64 5f 6b  tle>.<tcl>..hd_k
0030: 65 79 77 6f 72 64 73 20 2a 66 74 73 33 20 46 54  eywords *fts3 FT
0040: 53 33 0a 73 6f 75 72 63 65 20 5b 66 69 6c 65 20  S3.source [file 
0050: 6a 6f 69 6e 20 24 3a 3a 44 4f 43 20 70 61 67 65  join $::DOC page
0060: 73 20 66 61 6e 63 79 66 6f 72 6d 61 74 2e 74 63  s fancyformat.tc
0070: 6c 5d 0a 66 61 6e 63 79 66 6f 72 6d 61 74 5f 64  l].fancyformat_d
0080: 6f 63 75 6d 65 6e 74 20 22 53 51 4c 69 74 65 20  ocument "SQLite 
0090: 46 54 53 33 20 45 78 74 65 6e 73 69 6f 6e 22 20  FTS3 Extension" 
00a0: 7b 7d 20 7b 0a 0a 3c 68 32 20 73 74 79 6c 65 3d  {} {..<h2 style=
00b0: 22 6d 61 72 67 69 6e 2d 6c 65 66 74 3a 31 2e 30  "margin-left:1.0
00c0: 65 6d 22 3e 20 4f 76 65 72 76 69 65 77 3c 2f 68  em"> Overview</h
00d0: 32 3e 0a 0a 3c 70 3e 0a 20 20 46 54 53 33 20 69  2>..<p>.  FTS3 i
00e0: 73 20 61 6e 20 53 51 4c 69 74 65 20 76 69 72 74  s an SQLite virt
00f0: 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65  ual table module
0100: 20 74 68 61 74 20 61 6c 6c 6f 77 73 20 75 73 65   that allows use
0110: 72 73 20 74 6f 20 70 65 72 66 6f 72 6d 20 0a 20  rs to perform . 
0120: 20 66 75 6c 6c 2d 74 65 78 74 20 73 65 61 72 63   full-text searc
0130: 68 65 73 20 6f 6e 20 61 20 73 65 74 20 6f 66 20  hes on a set of 
0140: 64 6f 63 75 6d 65 6e 74 73 2e 20 54 68 65 20 6d  documents. The m
0150: 6f 73 74 20 63 6f 6d 6d 6f 6e 20 28 61 6e 64 20  ost common (and 
0160: 65 66 66 65 63 74 69 76 65 29 20 0a 20 20 77 61  effective) .  wa
0170: 79 20 74 6f 20 64 65 73 63 72 69 62 65 20 66 75  y to describe fu
0180: 6c 6c 2d 74 65 78 74 20 73 65 61 72 63 68 65 73  ll-text searches
0190: 20 69 73 20 22 77 68 61 74 20 47 6f 6f 67 6c 65   is "what Google
01a0: 2c 20 59 61 68 6f 6f 20 61 6e 64 20 41 6c 74 61  , Yahoo and Alta
01b0: 76 69 73 74 61 20 64 6f 0a 20 20 77 69 74 68 20  vista do.  with 
01c0: 64 6f 63 75 6d 65 6e 74 73 20 70 6c 61 63 65 64  documents placed
01d0: 20 6f 6e 20 74 68 65 20 57 6f 72 6c 64 20 57 69   on the World Wi
01e0: 64 65 20 57 65 62 22 2e 20 55 73 65 72 73 20 69  de Web". Users i
01f0: 6e 70 75 74 20 61 20 74 65 72 6d 2c 20 6f 72 20  nput a term, or 
0200: 73 65 72 69 65 73 20 0a 20 20 6f 66 20 74 65 72  series .  of ter
0210: 6d 73 2c 20 70 65 72 68 61 70 73 20 63 6f 6e 6e  ms, perhaps conn
0220: 65 63 74 65 64 20 62 79 20 61 20 62 69 6e 61 72  ected by a binar
0230: 79 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 67 72  y operator or gr
0240: 6f 75 70 65 64 20 74 6f 67 65 74 68 65 72 20 69  ouped together i
0250: 6e 74 6f 20 61 20 0a 20 20 70 68 72 61 73 65 2c  nto a .  phrase,
0260: 20 61 6e 64 20 74 68 65 20 66 75 6c 6c 2d 74 65   and the full-te
0270: 78 74 20 71 75 65 72 79 20 73 79 73 74 65 6d 20  xt query system 
0280: 66 69 6e 64 73 20 74 68 65 20 73 65 74 20 6f 66  finds the set of
0290: 20 64 6f 63 75 6d 65 6e 74 73 20 74 68 61 74 20   documents that 
02a0: 62 65 73 74 20 0a 20 20 6d 61 74 63 68 65 73 20  best .  matches 
02b0: 74 68 6f 73 65 20 74 65 72 6d 73 20 63 6f 6e 73  those terms cons
02c0: 69 64 65 72 69 6e 67 20 74 68 65 20 6f 70 65 72  idering the oper
02d0: 61 74 6f 72 73 20 61 6e 64 20 67 72 6f 75 70 69  ators and groupi
02e0: 6e 67 73 20 74 68 65 20 75 73 65 72 20 68 61 73  ngs the user has
02f0: 20 0a 20 20 73 70 65 63 69 66 69 65 64 2e 20 54   .  specified. T
0300: 68 69 73 20 64 6f 63 75 6d 65 6e 74 20 64 65 73  his document des
0310: 63 72 69 62 65 73 20 74 68 65 20 64 65 70 6c 6f  cribes the deplo
0320: 79 6d 65 6e 74 20 61 6e 64 20 75 73 61 67 65 20  yment and usage 
0330: 6f 66 20 46 54 53 33 2e 0a 0a 3c 70 3e 0a 20 20  of FTS3...<p>.  
0340: 50 6f 72 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  Portions of the 
0350: 6f 72 69 67 69 6e 61 6c 20 46 54 53 33 20 63 6f  original FTS3 co
0360: 64 65 20 77 65 72 65 20 63 6f 6e 74 72 69 62 75  de were contribu
0370: 74 65 64 20 74 6f 20 74 68 65 20 53 51 4c 69 74  ted to the SQLit
0380: 65 20 70 72 6f 6a 65 63 74 20 0a 20 20 62 79 20  e project .  by 
0390: 53 63 6f 74 74 20 48 65 73 73 20 6f 66 20 3c 61  Scott Hess of <a
03a0: 20 68 72 65 66 3d 22 68 74 74 70 3a 2f 2f 77 77   href="http://ww
03b0: 77 2e 67 6f 6f 67 6c 65 2e 63 6f 6d 22 3e 47 6f  w.google.com">Go
03c0: 6f 67 6c 65 3c 2f 61 3e 2e 20 49 74 20 69 73 20  ogle</a>. It is 
03d0: 6e 6f 77 20 0a 20 20 64 65 76 65 6c 6f 70 65 64  now .  developed
03e0: 20 61 6e 64 20 6d 61 69 6e 74 61 69 6e 65 64 20   and maintained 
03f0: 61 73 20 70 61 72 74 20 6f 66 20 53 51 4c 69 74  as part of SQLit
0400: 65 2e 0a 0a 5b 68 31 20 22 49 6e 74 72 6f 64 75  e...[h1 "Introdu
0410: 63 74 69 6f 6e 20 74 6f 20 46 54 53 33 22 5d 0a  ction to FTS3"].
0420: 0a 3c 70 3e 0a 20 20 54 68 65 20 46 54 53 33 20  .<p>.  The FTS3 
0430: 65 78 74 65 6e 73 69 6f 6e 20 6d 6f 64 75 6c 65  extension module
0440: 20 61 6c 6c 6f 77 73 20 75 73 65 72 73 20 74 6f   allows users to
0450: 20 63 72 65 61 74 65 20 73 70 65 63 69 61 6c 20   create special 
0460: 74 61 62 6c 65 73 20 77 69 74 68 20 61 20 0a 20  tables with a . 
0470: 20 62 75 69 6c 74 2d 69 6e 20 66 75 6c 6c 2d 74   built-in full-t
0480: 65 78 74 20 69 6e 64 65 78 20 28 68 65 72 65 61  ext index (herea
0490: 66 74 65 72 20 22 46 54 53 33 20 74 61 62 6c 65  fter "FTS3 table
04a0: 73 22 29 2e 20 54 68 65 20 66 75 6c 6c 2d 74 65  s"). The full-te
04b0: 78 74 20 69 6e 64 65 78 0a 20 20 61 6c 6c 6f 77  xt index.  allow
04c0: 73 20 74 68 65 20 75 73 65 72 20 74 6f 20 65 66  s the user to ef
04d0: 66 69 63 69 65 6e 74 6c 79 20 71 75 65 72 79 20  ficiently query 
04e0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 6f 72  the database for
04f0: 20 61 6c 6c 20 72 6f 77 73 20 74 68 61 74 20 63   all rows that c
0500: 6f 6e 74 61 69 6e 0a 20 20 6f 6e 65 20 6f 72 20  ontain.  one or 
0510: 6d 6f 72 65 20 69 6e 73 74 61 6e 63 65 73 20 73  more instances s
0520: 70 65 63 69 66 69 65 64 20 77 6f 72 64 20 28 68  pecified word (h
0530: 65 72 65 61 66 74 65 72 20 61 20 22 74 6f 6b 65  ereafter a "toke
0540: 6e 22 2c 20 65 76 65 6e 20 69 66 20 74 68 65 20  n", even if the 
0550: 74 61 62 6c 65 0a 20 20 63 6f 6e 74 61 69 6e 73  table.  contains
0560: 20 6d 61 6e 79 20 6c 61 72 67 65 20 64 6f 63 75   many large docu
0570: 6d 65 6e 74 73 2e 0a 0a 3c 70 3e 0a 20 20 46 6f  ments...<p>.  Fo
0580: 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 65 61  r example, if ea
0590: 63 68 20 6f 66 20 74 68 65 20 35 31 37 34 33 30  ch of the 517430
05a0: 20 64 6f 63 75 6d 65 6e 74 73 20 69 6e 20 74 68   documents in th
05b0: 65 20 0a 20 20 22 3c 61 20 68 72 65 66 3d 22 68  e .  "<a href="h
05c0: 74 74 70 3a 2f 2f 77 77 77 2e 63 73 2e 63 6d 75  ttp://www.cs.cmu
05d0: 2e 65 64 75 2f 7e 65 6e 72 6f 6e 2f 22 3e 45 6e  .edu/~enron/">En
05e0: 72 6f 6e 20 45 2d 4d 61 69 6c 20 44 61 74 61 73  ron E-Mail Datas
05f0: 65 74 3c 2f 61 3e 22 0a 20 20 69 73 20 69 6e 73  et</a>".  is ins
0600: 65 72 74 65 64 20 69 6e 74 6f 20 62 6f 74 68 20  erted into both 
0610: 74 68 65 20 46 54 53 33 20 74 61 62 6c 65 20 61  the FTS3 table a
0620: 6e 64 20 74 68 65 20 6f 72 64 69 6e 61 72 79 20  nd the ordinary 
0630: 53 51 4c 69 74 65 20 74 61 62 6c 65 0a 20 20 63  SQLite table.  c
0640: 72 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65  reated using the
0650: 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 51 4c 20 73   following SQL s
0660: 63 72 69 70 74 3a 0a 0a 5b 43 6f 64 65 20 7b 0a  cript:..[Code {.
0670: 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c    CREATE VIRTUAL
0680: 20 54 41 42 4c 45 20 65 6e 72 6f 6e 64 61 74 61   TABLE enrondata
0690: 31 20 55 53 49 4e 47 20 66 74 73 33 28 63 6f 6e  1 USING fts3(con
06a0: 74 65 6e 74 20 54 45 58 54 29 3b 20 20 20 20 20  tent TEXT);     
06b0: 2f 2a 20 46 54 53 33 20 74 61 62 6c 65 20 2a 2f  /* FTS3 table */
06c0: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
06d0: 65 6e 72 6f 6e 64 61 74 61 32 28 63 6f 6e 74 65  enrondata2(conte
06e0: 6e 74 20 54 45 58 54 29 3b 20 20 20 20 20 20 20  nt TEXT);       
06f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0700: 20 2f 2a 20 4f 72 64 69 6e 61 72 79 20 74 61 62   /* Ordinary tab
0710: 6c 65 20 2a 2f 0a 7d 5d 0a 0a 3c 70 3e 0a 20 20  le */.}]..<p>.  
0720: 54 68 65 6e 20 65 69 74 68 65 72 20 6f 66 20 74  Then either of t
0730: 68 65 20 74 77 6f 20 71 75 65 72 69 65 73 20 62  he two queries b
0740: 65 6c 6f 77 20 6d 61 79 20 62 65 20 65 78 65 63  elow may be exec
0750: 75 74 65 64 20 74 6f 20 66 69 6e 64 20 74 68 65  uted to find the
0760: 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 64 6f 63   number of.  doc
0770: 75 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 64 61  uments in the da
0780: 74 61 62 61 73 65 20 74 68 61 74 20 63 6f 6e 74  tabase that cont
0790: 61 69 6e 20 74 68 65 20 77 6f 72 64 20 22 6c 69  ain the word "li
07a0: 6e 75 78 22 20 28 33 35 31 29 2e 20 55 73 69 6e  nux" (351). Usin
07b0: 67 20 6f 6e 65 0a 20 20 64 65 73 6b 74 6f 70 20  g one.  desktop 
07c0: 50 43 20 68 61 72 64 77 61 72 65 20 63 6f 6e 66  PC hardware conf
07d0: 69 67 75 72 61 74 69 6f 6e 2c 20 74 68 65 20 71  iguration, the q
07e0: 75 65 72 79 20 6f 6e 20 74 68 65 20 46 54 53 33  uery on the FTS3
07f0: 20 74 61 62 6c 65 20 72 65 74 75 72 6e 73 20 69   table returns i
0800: 6e 0a 20 20 61 70 70 72 6f 78 69 6d 61 74 65 6c  n.  approximatel
0810: 79 20 30 2e 30 33 20 73 65 63 6f 6e 64 73 2c 20  y 0.03 seconds, 
0820: 76 65 72 73 75 73 20 32 32 2e 35 20 66 6f 72 20  versus 22.5 for 
0830: 71 75 65 72 79 69 6e 67 20 74 68 65 20 6f 72 64  querying the ord
0840: 69 6e 61 72 79 20 74 61 62 6c 65 2e 0a 0a 5b 43  inary table...[C
0850: 6f 64 65 20 7b 0a 20 20 53 45 4c 45 43 54 20 63  ode {.  SELECT c
0860: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 65 6e 72  ount(*) FROM enr
0870: 6f 6e 64 61 74 61 31 20 57 48 45 52 45 20 63 6f  ondata1 WHERE co
0880: 6e 74 65 6e 74 20 4d 41 54 43 48 20 27 6c 69 6e  ntent MATCH 'lin
0890: 75 78 27 3b 20 20 2f 2a 20 30 2e 30 33 20 73 65  ux';  /* 0.03 se
08a0: 63 6f 6e 64 73 20 2a 2f 0a 20 20 53 45 4c 45 43  conds */.  SELEC
08b0: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
08c0: 65 6e 72 6f 6e 64 61 74 61 32 20 57 48 45 52 45  enrondata2 WHERE
08d0: 20 63 6f 6e 74 65 6e 74 20 4c 49 4b 45 20 27 25   content LIKE '%
08e0: 6c 69 6e 75 78 25 27 3b 20 2f 2a 20 32 32 2e 35  linux%'; /* 22.5
08f0: 20 73 65 63 6f 6e 64 73 20 2a 2f 0a 7d 5d 0a 0a   seconds */.}]..
0900: 3c 70 3e 0a 20 20 4f 66 20 63 6f 75 72 73 65 2c  <p>.  Of course,
0910: 20 74 68 65 20 74 77 6f 20 71 75 65 72 69 65 73   the two queries
0920: 20 61 62 6f 76 65 20 61 72 65 20 6e 6f 74 20 65   above are not e
0930: 6e 74 69 72 65 6c 79 20 65 71 75 69 76 61 6c 65  ntirely equivale
0940: 6e 74 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 0a  nt. For example.
0950: 20 20 74 68 65 20 4c 49 4b 45 20 71 75 65 72 79    the LIKE query
0960: 20 6d 61 74 63 68 65 73 20 72 6f 77 73 20 74 68   matches rows th
0970: 61 74 20 63 6f 6e 74 61 69 6e 20 74 65 72 6d 73  at contain terms
0980: 20 73 75 63 68 20 61 73 20 22 6c 69 6e 75 78 6f   such as "linuxo
0990: 70 68 6f 62 65 22 0a 20 20 6f 72 20 22 45 6e 74  phobe".  or "Ent
09a0: 65 72 70 72 69 73 65 4c 69 6e 75 78 22 20 28 61  erpriseLinux" (a
09b0: 73 20 69 74 20 68 61 70 70 65 6e 73 2c 20 74 68  s it happens, th
09c0: 65 20 45 6e 72 6f 6e 20 45 2d 4d 61 69 6c 20 44  e Enron E-Mail D
09d0: 61 74 61 73 65 74 20 64 6f 65 73 20 6e 6f 74 0a  ataset does not.
09e0: 20 20 61 63 74 75 61 6c 6c 79 20 63 6f 6e 74 61    actually conta
09f0: 69 6e 20 61 6e 79 20 73 75 63 68 20 74 65 72 6d  in any such term
0a00: 73 29 2c 20 77 68 65 72 65 61 73 20 74 68 65 20  s), whereas the 
0a10: 4d 41 54 43 48 20 71 75 65 72 79 20 6f 6e 20 74  MATCH query on t
0a20: 68 65 20 46 54 53 33 20 74 61 62 6c 65 0a 20 20  he FTS3 table.  
0a30: 73 65 6c 65 63 74 73 20 6f 6e 6c 79 20 74 68 6f  selects only tho
0a40: 73 65 20 72 6f 77 73 20 74 68 61 74 20 63 6f 6e  se rows that con
0a50: 74 61 69 6e 20 22 6c 69 6e 75 78 22 20 61 73 20  tain "linux" as 
0a60: 61 20 64 69 73 63 72 65 74 65 20 74 6f 6b 65 6e  a discrete token
0a70: 2e 20 42 6f 74 68 20 0a 20 20 73 65 61 72 63 68  . Both .  search
0a80: 65 73 20 61 72 65 20 63 61 73 65 2d 69 6e 73 65  es are case-inse
0a90: 6e 73 69 74 69 76 65 2e 20 54 68 65 20 46 54 53  nsitive. The FTS
0aa0: 33 20 74 61 62 6c 65 20 63 6f 6e 73 75 6d 65 73  3 table consumes
0ab0: 20 61 72 6f 75 6e 64 20 32 30 30 36 20 4d 42 20   around 2006 MB 
0ac0: 6f 6e 0a 20 20 64 69 73 6b 20 63 6f 6d 70 61 72  on.  disk compar
0ad0: 65 64 20 74 6f 20 6a 75 73 74 20 31 34 35 33 20  ed to just 1453 
0ae0: 4d 42 20 66 6f 72 20 74 68 65 20 6f 72 64 69 6e  MB for the ordin
0af0: 61 72 79 20 74 61 62 6c 65 2e 20 55 73 69 6e 67  ary table. Using
0b00: 20 74 68 65 20 73 61 6d 65 0a 20 20 68 61 72 64   the same.  hard
0b10: 77 61 72 65 20 63 6f 6e 66 69 67 75 72 61 74 69  ware configurati
0b20: 6f 6e 20 75 73 65 64 20 74 6f 20 70 65 72 66 6f  on used to perfo
0b30: 72 6d 20 74 68 65 20 53 45 4c 45 43 54 20 71 75  rm the SELECT qu
0b40: 65 72 69 65 73 20 61 62 6f 76 65 2c 20 74 68 65  eries above, the
0b50: 20 46 54 53 33 0a 20 20 74 61 62 6c 65 20 74 6f   FTS3.  table to
0b60: 6f 6b 20 6a 75 73 74 20 75 6e 64 65 72 20 33 31  ok just under 31
0b70: 20 6d 69 6e 75 74 65 73 20 74 6f 20 70 6f 70 75   minutes to popu
0b80: 6c 61 74 65 2c 20 76 65 72 73 75 73 20 32 35 20  late, versus 25 
0b90: 66 6f 72 20 74 68 65 20 6f 72 64 69 6e 61 72 79  for the ordinary
0ba0: 0a 20 20 74 61 62 6c 65 2e 0a 0a 5b 68 32 20 22  .  table...[h2 "
0bb0: 43 72 65 61 74 69 6e 67 20 61 6e 64 20 44 65 73  Creating and Des
0bc0: 74 72 6f 79 69 6e 67 20 46 54 53 33 20 54 61 62  troying FTS3 Tab
0bd0: 6c 65 73 22 5d 0a 0a 3c 70 3e 0a 20 20 4c 69 6b  les"]..<p>.  Lik
0be0: 65 20 6f 74 68 65 72 20 76 69 72 74 75 61 6c 20  e other virtual 
0bf0: 74 61 62 6c 65 20 74 79 70 65 73 2c 20 6e 65 77  table types, new
0c00: 20 46 54 53 33 20 74 61 62 6c 65 73 20 61 72 65   FTS3 tables are
0c10: 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 61   created using a
0c20: 20 0a 20 20 5c 5b 43 52 45 41 54 45 20 56 49 52   .  \[CREATE VIR
0c30: 54 55 41 4c 20 54 41 42 4c 45 5c 5d 20 73 74 61  TUAL TABLE\] sta
0c40: 74 65 6d 65 6e 74 2e 20 54 68 65 20 6d 6f 64 75  tement. The modu
0c50: 6c 65 20 6e 61 6d 65 2c 20 77 68 69 63 68 20 66  le name, which f
0c60: 6f 6c 6c 6f 77 73 0a 20 20 74 68 65 20 55 53 49  ollows.  the USI
0c70: 4e 47 20 6b 65 79 77 6f 72 64 2c 20 69 73 20 22  NG keyword, is "
0c80: 66 74 73 33 22 2e 20 54 68 65 20 76 69 72 74 75  fts3". The virtu
0c90: 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20  al table module 
0ca0: 61 72 67 75 6d 65 6e 74 73 20 6d 61 79 0a 20 20  arguments may.  
0cb0: 62 65 20 6c 65 66 74 20 65 6d 70 74 79 2c 20 69  be left empty, i
0cc0: 6e 20 77 68 69 63 68 20 63 61 73 65 20 61 6e 20  n which case an 
0cd0: 46 54 53 33 20 74 61 62 6c 65 20 77 69 74 68 20  FTS3 table with 
0ce0: 61 20 73 69 6e 67 6c 65 20 75 73 65 72 2d 64 65  a single user-de
0cf0: 66 69 6e 65 64 20 0a 20 20 63 6f 6c 75 6d 6e 20  fined .  column 
0d00: 6e 61 6d 65 64 20 22 63 6f 6e 74 65 6e 74 22 20  named "content" 
0d10: 69 73 20 63 72 65 61 74 65 64 2e 20 41 6c 74 65  is created. Alte
0d20: 72 6e 61 74 69 76 65 6c 79 2c 20 74 68 65 20 6d  rnatively, the m
0d30: 6f 64 75 6c 65 20 61 72 67 75 6d 65 6e 74 73 0a  odule arguments.
0d40: 20 20 6d 61 79 20 62 65 20 70 61 73 73 65 64 20    may be passed 
0d50: 61 20 6c 69 73 74 20 6f 66 20 63 6f 6d 6d 61 20  a list of comma 
0d60: 73 65 70 61 72 61 74 65 64 20 63 6f 6c 75 6d 6e  separated column
0d70: 20 6e 61 6d 65 73 2e 20 0a 0a 3c 70 3e 0a 20 20   names. ..<p>.  
0d80: 49 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  If column names 
0d90: 61 72 65 20 65 78 70 6c 69 63 69 74 6c 79 20 70  are explicitly p
0da0: 72 6f 76 69 64 65 64 20 66 6f 72 20 74 68 65 20  rovided for the 
0db0: 46 54 53 33 20 74 61 62 6c 65 20 61 73 20 70 61  FTS3 table as pa
0dc0: 72 74 20 6f 66 0a 20 20 74 68 65 20 43 52 45 41  rt of.  the CREA
0dd0: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
0de0: 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e   statement, then
0df0: 20 61 20 64 61 74 61 74 79 70 65 20 6e 61 6d 65   a datatype name
0e00: 20 6d 61 79 20 62 65 20 6f 70 74 69 6f 6e 61 6c   may be optional
0e10: 6c 79 20 0a 20 20 73 70 65 63 69 66 69 65 64 20  ly .  specified 
0e20: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e  for each column.
0e30: 20 48 6f 77 65 76 65 72 2c 20 74 68 69 73 20 69   However, this i
0e40: 73 20 70 75 72 65 20 73 79 6e 74 61 63 74 69 63  s pure syntactic
0e50: 20 73 75 67 61 72 2c 20 74 68 65 0a 20 20 73 75   sugar, the.  su
0e60: 70 70 6c 69 65 64 20 74 79 70 65 6e 61 6d 65 73  pplied typenames
0e70: 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20 62 79   are not used by
0e80: 20 46 54 53 33 20 6f 72 20 74 68 65 20 53 51 4c   FTS3 or the SQL
0e90: 69 74 65 20 63 6f 72 65 20 66 6f 72 20 61 6e 79  ite core for any
0ea0: 0a 20 20 70 75 72 70 6f 73 65 2e 20 54 68 65 20  .  purpose. The 
0eb0: 73 61 6d 65 20 61 70 70 6c 69 65 73 20 74 6f 20  same applies to 
0ec0: 61 6e 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  any constraints 
0ed0: 73 70 65 63 69 66 69 65 64 20 61 6c 6f 6e 67 20  specified along 
0ee0: 77 69 74 68 20 61 6e 0a 20 20 46 54 53 33 20 63  with an.  FTS3 c
0ef0: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2d 20 74 68 65  olumn name - the
0f00: 79 20 61 72 65 20 70 61 72 73 65 64 20 62 75 74  y are parsed but
0f10: 20 6e 6f 74 20 75 73 65 64 20 6f 72 20 72 65 63   not used or rec
0f20: 6f 72 64 65 64 20 62 79 20 74 68 65 20 73 79 73  orded by the sys
0f30: 74 65 6d 0a 20 20 69 6e 20 61 6e 79 20 77 61 79  tem.  in any way
0f40: 2e 0a 0a 5b 43 6f 64 65 20 7b 0a 20 20 3c 69 3e  ...[Code {.  <i>
0f50: 2d 2d 20 43 72 65 61 74 65 20 61 6e 20 46 54 53  -- Create an FTS
0f60: 33 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 22 64  3 table named "d
0f70: 61 74 61 22 20 77 69 74 68 20 6f 6e 65 20 63 6f  ata" with one co
0f80: 6c 75 6d 6e 20 2d 20 22 63 6f 6e 74 65 6e 74 22  lumn - "content"
0f90: 3a 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45 20 56  :</i>.  CREATE V
0fa0: 49 52 54 55 41 4c 20 54 41 42 4c 45 20 64 61 74  IRTUAL TABLE dat
0fb0: 61 20 55 53 49 4e 47 20 66 74 73 33 28 29 3b 0a  a USING fts3();.
0fc0: 0a 20 20 3c 69 3e 2d 2d 20 43 72 65 61 74 65 20  .  <i>-- Create 
0fd0: 61 6e 20 46 54 53 33 20 74 61 62 6c 65 20 6e 61  an FTS3 table na
0fe0: 6d 65 64 20 22 70 61 67 65 73 22 20 77 69 74 68  med "pages" with
0ff0: 20 74 68 72 65 65 20 63 6f 6c 75 6d 6e 73 3a 3c   three columns:<
1000: 2f 69 3e 0a 20 20 43 52 45 41 54 45 20 56 49 52  /i>.  CREATE VIR
1010: 54 55 41 4c 20 54 41 42 4c 45 20 70 61 67 65 73  TUAL TABLE pages
1020: 20 55 53 49 4e 47 20 66 74 73 33 28 74 69 74 6c   USING fts3(titl
1030: 65 2c 20 6b 65 79 77 6f 72 64 73 2c 20 62 6f 64  e, keywords, bod
1040: 79 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 43 72 65  y);..  <i>-- Cre
1050: 61 74 65 20 61 6e 20 46 54 53 33 20 74 61 62 6c  ate an FTS3 tabl
1060: 65 20 6e 61 6d 65 64 20 22 6d 61 69 6c 22 20 77  e named "mail" w
1070: 69 74 68 20 74 77 6f 20 63 6f 6c 75 6d 6e 73 2e  ith two columns.
1080: 20 44 61 74 61 74 79 70 65 73 0a 20 20 2d 2d 20   Datatypes.  -- 
1090: 61 6e 64 20 63 6f 6c 75 6d 6e 20 63 6f 6e 73 74  and column const
10a0: 72 61 69 6e 74 73 20 61 72 65 20 73 70 65 63 69  raints are speci
10b0: 66 69 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20  fied along with 
10c0: 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 20 54 68 65  each column. The
10d0: 73 65 0a 20 20 2d 2d 20 61 72 65 20 63 6f 6d 70  se.  -- are comp
10e0: 6c 65 74 65 6c 79 20 69 67 6e 6f 72 65 64 20 62  letely ignored b
10f0: 79 20 46 54 53 33 20 61 6e 64 20 53 51 4c 69 74  y FTS3 and SQLit
1100: 65 2e 20 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45  e. </i>.  CREATE
1110: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 6d   VIRTUAL TABLE m
1120: 61 69 6c 20 55 53 49 4e 47 20 66 74 73 33 28 0a  ail USING fts3(.
1130: 20 20 20 20 73 75 62 6a 65 63 74 20 56 41 52 43      subject VARC
1140: 48 41 52 28 32 35 36 29 20 4e 4f 54 20 4e 55 4c  HAR(256) NOT NUL
1150: 4c 2c 0a 20 20 20 20 62 6f 64 79 20 54 45 58 54  L,.    body TEXT
1160: 20 43 48 45 43 4b 28 6c 65 6e 67 74 68 28 62 6f   CHECK(length(bo
1170: 64 79 29 3c 31 30 32 34 30 29 0a 20 20 29 3b 0a  dy)<10240).  );.
1180: 7d 5d 0a 0a 3c 70 3e 0a 20 20 41 73 20 77 65 6c  }]..<p>.  As wel
1190: 6c 20 61 73 20 61 20 6c 69 73 74 20 6f 66 20 63  l as a list of c
11a0: 6f 6c 75 6d 6e 73 2c 20 74 68 65 20 6d 6f 64 75  olumns, the modu
11b0: 6c 65 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73  le arguments pas
11c0: 73 65 64 20 74 6f 20 61 20 43 52 45 41 54 45 0a  sed to a CREATE.
11d0: 20 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20    VIRTUAL TABLE 
11e0: 73 74 61 74 65 6d 65 6e 74 20 75 73 65 64 20 74  statement used t
11f0: 6f 20 63 72 65 61 74 65 20 61 6e 20 46 54 53 33  o create an FTS3
1200: 20 74 61 62 6c 65 20 6d 61 79 20 62 65 20 75 73   table may be us
1210: 65 64 20 74 6f 20 73 70 65 63 69 66 79 0a 20 20  ed to specify.  
1220: 61 20 5c 5b 74 6f 6b 65 6e 69 7a 65 72 5c 5d 2e  a \[tokenizer\].
1230: 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62 79   This is done by
1240: 20 73 70 65 63 69 66 79 69 6e 67 20 61 20 73 74   specifying a st
1250: 72 69 6e 67 20 6f 66 20 74 68 65 20 66 6f 72 6d  ring of the form
1260: 0a 20 20 22 74 6f 6b 65 6e 69 7a 65 3d 26 6c 74  .  "tokenize=&lt
1270: 3b 74 6f 6b 65 6e 69 7a 65 72 20 6e 61 6d 65 26  ;tokenizer name&
1280: 67 74 3b 20 26 6c 74 3b 74 6f 6b 65 6e 69 7a 65  gt; &lt;tokenize
1290: 72 20 61 72 67 73 26 67 74 3b 22 20 69 6e 20 70  r args&gt;" in p
12a0: 6c 61 63 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e  lace of a column
12b0: 0a 20 20 6e 61 6d 65 2c 20 77 68 65 72 65 20 26  .  name, where &
12c0: 6c 74 3b 74 6f 6b 65 6e 69 7a 65 72 20 6e 61 6d  lt;tokenizer nam
12d0: 65 26 67 74 3b 20 69 73 20 74 68 65 20 6e 61 6d  e&gt; is the nam
12e0: 65 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e 69 7a  e of the tokeniz
12f0: 65 72 20 74 6f 20 75 73 65 20 61 6e 64 0a 20 20  er to use and.  
1300: 26 6c 74 3b 74 6f 6b 65 6e 69 7a 65 72 20 61 72  &lt;tokenizer ar
1310: 67 73 26 67 74 3b 20 69 73 20 61 6e 20 6f 70 74  gs&gt; is an opt
1320: 69 6f 6e 61 6c 20 6c 69 73 74 20 6f 66 20 77 68  ional list of wh
1330: 69 74 65 73 70 61 63 65 20 73 65 70 61 72 61 74  itespace separat
1340: 65 64 20 71 75 61 6c 69 66 69 65 72 73 0a 20 20  ed qualifiers.  
1350: 74 6f 20 70 61 73 73 20 74 6f 20 74 68 65 20 74  to pass to the t
1360: 6f 6b 65 6e 69 7a 65 72 20 69 6d 70 6c 65 6d 65  okenizer impleme
1370: 6e 74 61 74 69 6f 6e 2e 20 41 20 74 6f 6b 65 6e  ntation. A token
1380: 69 7a 65 72 20 73 70 65 63 69 66 69 63 61 74 69  izer specificati
1390: 6f 6e 20 6d 61 79 20 62 65 0a 20 20 70 6c 61 63  on may be.  plac
13a0: 65 64 20 61 6e 79 77 68 65 72 65 20 69 6e 20 74  ed anywhere in t
13b0: 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20  he column list, 
13c0: 62 75 74 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20  but at most one 
13d0: 74 6f 6b 65 6e 69 7a 65 72 20 64 65 63 6c 61 72  tokenizer declar
13e0: 61 74 69 6f 6e 20 69 73 0a 20 20 61 6c 6c 6f 77  ation is.  allow
13f0: 65 64 20 66 6f 72 20 65 61 63 68 20 43 52 45 41  ed for each CREA
1400: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
1410: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
1420: 20 73 65 63 6f 6e 64 20 61 6e 64 20 73 75 62 73   second and subs
1430: 65 71 75 65 6e 74 0a 20 20 74 6f 6b 65 6e 69 7a  equent.  tokeniz
1440: 65 72 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 61  er declaration a
1450: 72 65 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  re interpreted a
1460: 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20  s column names. 
1470: 0a 20 20 5c 5b 74 6f 6b 65 6e 69 7a 65 72 7c 53  .  \[tokenizer|S
1480: 65 65 20 62 65 6c 6f 77 5c 5d 20 66 6f 72 20 61  ee below\] for a
1490: 20 64 65 74 61 69 6c 65 64 20 64 65 73 63 72 69   detailed descri
14a0: 70 74 69 6f 6e 20 6f 66 20 75 73 69 6e 67 20 28  ption of using (
14b0: 61 6e 64 2c 20 69 66 0a 20 20 6e 65 63 65 73 73  and, if.  necess
14c0: 61 72 79 2c 20 69 6d 70 6c 65 6d 65 6e 74 69 6e  ary, implementin
14d0: 67 29 20 61 20 74 6f 6b 65 6e 69 7a 65 72 2e 0a  g) a tokenizer..
14e0: 0a 5b 43 6f 64 65 20 7b 0a 20 20 3c 69 3e 2d 2d  .[Code {.  <i>--
14f0: 20 43 72 65 61 74 65 20 61 6e 20 46 54 53 33 20   Create an FTS3 
1500: 74 61 62 6c 65 20 6e 61 6d 65 64 20 22 70 61 70  table named "pap
1510: 65 72 73 22 20 77 69 74 68 20 74 77 6f 20 63 6f  ers" with two co
1520: 6c 75 6d 6e 73 20 74 68 61 74 20 75 73 65 73 3c  lumns that uses<
1530: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 68 65 20  /i>.  <i>-- the 
1540: 74 6f 6b 65 6e 69 7a 65 72 20 22 70 6f 72 74 65  tokenizer "porte
1550: 72 22 2e 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45  r".</i>.  CREATE
1560: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 70   VIRTUAL TABLE p
1570: 61 70 65 72 73 20 55 53 49 4e 47 20 66 74 73 33  apers USING fts3
1580: 28 61 75 74 68 6f 72 2c 20 64 6f 63 75 6d 65 6e  (author, documen
1590: 74 2c 20 74 6f 6b 65 6e 69 7a 65 3d 70 6f 72 74  t, tokenize=port
15a0: 65 72 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 43 72  er);..  <i>-- Cr
15b0: 65 61 74 65 20 61 6e 20 46 54 53 33 20 74 61 62  eate an FTS3 tab
15c0: 6c 65 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65  le with a single
15d0: 20 63 6f 6c 75 6d 6e 20 2d 20 22 63 6f 6e 74 65   column - "conte
15e0: 6e 74 22 20 2d 20 74 68 61 74 20 75 73 65 73 3c  nt" - that uses<
15f0: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 68 65 20  /i>.  <i>-- the 
1600: 22 73 69 6d 70 6c 65 22 20 74 6f 6b 65 6e 69 7a  "simple" tokeniz
1610: 65 72 2e 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45  er.</i>.  CREATE
1620: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 64   VIRTUAL TABLE d
1630: 61 74 61 20 55 53 49 4e 47 20 66 74 73 33 28 74  ata USING fts3(t
1640: 6f 6b 65 6e 69 7a 65 3d 73 69 6d 70 6c 65 29 3b  okenize=simple);
1650: 0a 0a 20 20 3c 69 3e 2d 2d 20 43 72 65 61 74 65  ..  <i>-- Create
1660: 20 61 6e 20 46 54 53 33 20 74 61 62 6c 65 20 77   an FTS3 table w
1670: 69 74 68 20 74 77 6f 20 63 6f 6c 75 6d 6e 73 20  ith two columns 
1680: 74 68 61 74 20 75 73 65 73 20 74 68 65 20 22 69  that uses the "i
1690: 63 75 22 20 74 6f 6b 65 6e 69 7a 65 72 2e 3c 2f  cu" tokenizer.</
16a0: 69 3e 0a 20 20 3c 69 3e 2d 2d 20 54 68 65 20 71  i>.  <i>-- The q
16b0: 75 61 6c 69 66 69 65 72 20 22 65 6e 5f 41 55 22  ualifier "en_AU"
16c0: 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 74 68   is passed to th
16d0: 65 20 74 6f 6b 65 6e 69 7a 65 72 20 69 6d 70 6c  e tokenizer impl
16e0: 65 6d 65 6e 74 61 74 69 6f 6e 3c 2f 69 3e 0a 20  ementation</i>. 
16f0: 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
1700: 54 41 42 4c 45 20 6e 61 6d 65 73 20 55 53 49 4e  TABLE names USIN
1710: 47 20 66 74 73 33 28 61 2c 20 62 2c 20 74 6f 6b  G fts3(a, b, tok
1720: 65 6e 69 7a 65 3d 69 63 75 20 65 6e 5f 41 55 29  enize=icu en_AU)
1730: 3b 0a 7d 5d 0a 0a 3c 70 3e 0a 20 20 46 54 53 33  ;.}]..<p>.  FTS3
1740: 20 74 61 62 6c 65 73 20 6d 61 79 20 62 65 20 64   tables may be d
1750: 72 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20  ropped from the 
1760: 64 61 74 61 62 61 73 65 20 75 73 69 6e 67 20 61  database using a
1770: 6e 20 6f 72 64 69 6e 61 72 79 20 5c 5b 44 52 4f  n ordinary \[DRO
1780: 50 20 54 41 42 4c 45 5c 5d 0a 20 20 73 74 61 74  P TABLE\].  stat
1790: 65 6d 65 6e 74 2e 20 46 6f 72 20 65 78 61 6d 70  ement. For examp
17a0: 6c 65 3a 0a 0a 5b 43 6f 64 65 20 7b 0a 20 20 3c  le:..[Code {.  <
17b0: 69 3e 2d 2d 20 43 72 65 61 74 65 2c 20 74 68 65  i>-- Create, the
17c0: 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 64 72  n immediately dr
17d0: 6f 70 2c 20 61 6e 20 46 54 53 33 20 74 61 62 6c  op, an FTS3 tabl
17e0: 65 2e 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45 20  e.</i>.  CREATE 
17f0: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 64 61  VIRTUAL TABLE da
1800: 74 61 20 55 53 49 4e 47 20 66 74 73 33 28 29 3b  ta USING fts3();
1810: 0a 20 20 44 52 4f 50 20 54 41 42 4c 45 20 64 61  .  DROP TABLE da
1820: 74 61 3b 0a 7d 5d 0a 0a 5b 68 32 20 22 50 6f 70  ta;.}]..[h2 "Pop
1830: 75 6c 61 74 69 6e 67 20 46 54 53 33 20 54 61 62  ulating FTS3 Tab
1840: 6c 65 73 22 5d 0a 0a 20 20 3c 70 3e 0a 20 20 20  les"]..  <p>.   
1850: 20 46 54 53 33 20 74 61 62 6c 65 73 20 61 72 65   FTS3 tables are
1860: 20 70 6f 70 75 6c 61 74 65 64 20 75 73 69 6e 67   populated using
1870: 20 5c 5b 49 4e 53 45 52 54 5c 5d 2c 20 5c 5b 55   \[INSERT\], \[U
1880: 50 44 41 54 45 5c 5d 20 61 6e 64 20 5c 5b 44 45  PDATE\] and \[DE
1890: 4c 45 54 45 5c 5d 0a 20 20 20 20 73 74 61 74 65  LETE\].    state
18a0: 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 73 61 6d  ments in the sam
18b0: 65 20 77 61 79 20 61 73 20 6f 72 64 69 6e 61 72  e way as ordinar
18c0: 79 20 53 51 4c 69 74 65 20 74 61 62 6c 65 73 20  y SQLite tables 
18d0: 61 72 65 2e 0a 0a 20 20 3c 70 3e 0a 20 20 20 20  are...  <p>.    
18e0: 41 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 63  As well as the c
18f0: 6f 6c 75 6d 6e 73 20 6e 61 6d 65 64 20 62 79 20  olumns named by 
1900: 74 68 65 20 75 73 65 72 20 28 6f 72 20 74 68 65  the user (or the
1910: 20 22 63 6f 6e 74 65 6e 74 22 20 63 6f 6c 75 6d   "content" colum
1920: 6e 20 69 66 20 6e 6f 0a 20 20 20 20 6d 6f 64 75  n if no.    modu
1930: 6c 65 20 61 72 67 75 6d 65 6e 74 73 20 77 68 65  le arguments whe
1940: 72 65 20 73 70 65 63 69 66 69 65 64 20 61 73 20  re specified as 
1950: 70 61 72 74 20 6f 66 20 74 68 65 20 5c 5b 43 52  part of the \[CR
1960: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
1970: 4c 45 5c 5d 20 0a 20 20 20 20 73 74 61 74 65 6d  LE\] .    statem
1980: 65 6e 74 29 2c 20 65 61 63 68 20 46 54 53 33 20  ent), each FTS3 
1990: 74 61 62 6c 65 20 68 61 73 20 61 20 22 72 6f 77  table has a "row
19a0: 69 64 22 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 20  id" column. The 
19b0: 72 6f 77 69 64 20 6f 66 20 61 6e 20 46 54 53 33  rowid of an FTS3
19c0: 0a 20 20 20 20 74 61 62 6c 65 20 62 65 68 61 76  .    table behav
19d0: 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 77  es in the same w
19e0: 61 79 20 61 73 20 74 68 65 20 72 6f 77 69 64 20  ay as the rowid 
19f0: 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20 6f 72 64  column of an ord
1a00: 69 6e 61 72 79 20 53 51 4c 69 74 65 20 0a 20 20  inary SQLite .  
1a10: 20 20 74 61 62 6c 65 2c 20 65 78 63 65 70 74 20    table, except 
1a20: 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73 20  that the values 
1a30: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 72 6f  stored in the ro
1a40: 77 69 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e  wid column of an
1a50: 20 46 54 53 33 20 74 61 62 6c 65 20 0a 20 20 20   FTS3 table .   
1a60: 20 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65   remain unchange
1a70: 64 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  d if the databas
1a80: 65 20 69 73 20 72 65 62 75 69 6c 74 20 75 73 69  e is rebuilt usi
1a90: 6e 67 20 74 68 65 20 5c 5b 56 41 43 55 55 4d 5c  ng the \[VACUUM\
1aa0: 5d 20 63 6f 6d 6d 61 6e 64 2e 20 0a 20 20 20 20  ] command. .    
1ab0: 46 6f 72 20 46 54 53 33 20 74 61 62 6c 65 73 2c  For FTS3 tables,
1ac0: 20 22 64 6f 63 69 64 22 20 69 73 20 61 6c 6c 6f   "docid" is allo
1ad0: 77 65 64 20 61 73 20 61 6e 20 61 6c 69 61 73 20  wed as an alias 
1ae0: 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 75  along with the u
1af0: 73 75 61 6c 20 22 72 6f 77 69 64 22 2c 0a 20 20  sual "rowid",.  
1b00: 20 20 22 6f 69 64 22 20 61 6e 64 20 22 5f 6f 69    "oid" and "_oi
1b10: 64 5f 22 20 69 64 65 6e 74 69 66 69 65 72 73 2e  d_" identifiers.
1b20: 20 41 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 69   Attempting to i
1b30: 6e 73 65 72 74 20 6f 72 20 75 70 64 61 74 65 20  nsert or update 
1b40: 61 20 72 6f 77 20 77 69 74 68 20 61 20 0a 20 20  a row with a .  
1b50: 20 20 64 6f 63 69 64 20 76 61 6c 75 65 20 74 68    docid value th
1b60: 61 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  at already exist
1b70: 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 69  s in the table i
1b80: 73 20 61 6e 20 65 72 72 6f 72 2c 20 6a 75 73 74  s an error, just
1b90: 20 61 73 20 69 74 20 77 6f 75 6c 64 20 0a 20 20   as it would .  
1ba0: 20 20 62 65 20 77 69 74 68 20 61 6e 20 6f 72 64    be with an ord
1bb0: 69 6e 61 72 79 20 53 51 4c 69 74 65 20 74 61 62  inary SQLite tab
1bc0: 6c 65 2e 0a 0a 20 20 3c 70 3e 0a 20 20 20 20 54  le...  <p>.    T
1bd0: 68 65 72 65 20 69 73 20 6f 6e 65 20 6f 74 68 65  here is one othe
1be0: 72 20 73 75 62 74 6c 65 20 64 69 66 66 65 72 65  r subtle differe
1bf0: 6e 63 65 20 62 65 74 77 65 65 6e 20 22 64 6f 63  nce between "doc
1c00: 69 64 22 20 61 6e 64 20 74 68 65 20 6e 6f 72 6d  id" and the norm
1c10: 61 6c 20 53 51 4c 69 74 65 0a 20 20 20 20 61 6c  al SQLite.    al
1c20: 69 61 73 65 73 20 66 6f 72 20 74 68 65 20 72 6f  iases for the ro
1c30: 77 69 64 20 63 6f 6c 75 6d 6e 2e 20 4e 6f 72 6d  wid column. Norm
1c40: 61 6c 6c 79 2c 20 69 66 20 61 6e 20 49 4e 53 45  ally, if an INSE
1c50: 52 54 20 6f 72 20 55 50 44 41 54 45 20 73 74 61  RT or UPDATE sta
1c60: 74 65 6d 65 6e 74 20 0a 20 20 20 20 61 73 73 69  tement .    assi
1c70: 67 6e 73 20 64 69 73 63 72 65 65 74 20 76 61 6c  gns discreet val
1c80: 75 65 73 20 74 6f 20 74 77 6f 20 6f 72 20 6d 6f  ues to two or mo
1c90: 72 65 20 61 6c 69 61 73 65 73 20 6f 66 20 74 68  re aliases of th
1ca0: 65 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 2c 20  e rowid column, 
1cb0: 53 51 4c 69 74 65 20 0a 20 20 20 20 77 72 69 74  SQLite .    writ
1cc0: 65 73 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74  es the rightmost
1cd0: 20 6f 66 20 73 75 63 68 20 76 61 6c 75 65 73 20   of such values 
1ce0: 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65  specified in the
1cf0: 20 49 4e 53 45 52 54 20 6f 72 20 55 50 44 41 54   INSERT or UPDAT
1d00: 45 0a 20 20 20 20 73 74 61 74 65 6d 65 6e 74 20  E.    statement 
1d10: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
1d20: 20 48 6f 77 65 76 65 72 2c 20 61 73 73 69 67 6e   However, assign
1d30: 69 6e 67 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76  ing a non-NULL v
1d40: 61 6c 75 65 20 74 6f 20 62 6f 74 68 0a 20 20 20  alue to both.   
1d50: 20 74 68 65 20 22 64 6f 63 69 64 22 20 61 6e 64   the "docid" and
1d60: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20   one or more of 
1d70: 74 68 65 20 53 51 4c 69 74 65 20 72 6f 77 69 64  the SQLite rowid
1d80: 20 61 6c 69 61 73 65 73 20 77 68 65 6e 20 69 6e   aliases when in
1d90: 73 65 72 74 69 6e 67 20 6f 72 0a 20 20 20 20 75  serting or.    u
1da0: 70 64 61 74 69 6e 67 20 61 6e 20 46 54 53 33 20  pdating an FTS3 
1db0: 74 61 62 6c 65 20 69 73 20 63 6f 6e 73 69 64 65  table is conside
1dc0: 72 65 64 20 61 6e 20 65 72 72 6f 72 2e 20 53 65  red an error. Se
1dd0: 65 20 62 65 6c 6f 77 20 66 6f 72 20 61 6e 20 65  e below for an e
1de0: 78 61 6d 70 6c 65 2e 0a 0a 5b 43 6f 64 65 20 7b  xample...[Code {
1df0: 0a 20 20 3c 69 3e 2d 2d 20 43 72 65 61 74 65 20  .  <i>-- Create 
1e00: 61 6e 20 46 54 53 33 20 74 61 62 6c 65 3c 2f 69  an FTS3 table</i
1e10: 3e 0a 20 20 43 52 45 41 54 45 20 56 49 52 54 55  >.  CREATE VIRTU
1e20: 41 4c 20 54 41 42 4c 45 20 70 61 67 65 73 20 55  AL TABLE pages U
1e30: 53 49 4e 47 20 66 74 73 33 28 74 69 74 6c 65 2c  SING fts3(title,
1e40: 20 62 6f 64 79 29 3b 0a 0a 20 20 3c 69 3e 2d 2d   body);..  <i>--
1e50: 20 49 6e 73 65 72 74 20 61 20 72 6f 77 20 77 69   Insert a row wi
1e60: 74 68 20 61 20 73 70 65 63 69 66 69 63 20 64 6f  th a specific do
1e70: 63 69 64 20 76 61 6c 75 65 2e 3c 2f 69 3e 0a 20  cid value.</i>. 
1e80: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 67   INSERT INTO pag
1e90: 65 73 28 64 6f 63 69 64 2c 20 74 69 74 6c 65 2c  es(docid, title,
1ea0: 20 62 6f 64 79 29 20 56 41 4c 55 45 53 28 35 33   body) VALUES(53
1eb0: 2c 20 27 48 6f 6d 65 20 50 61 67 65 27 2c 20 27  , 'Home Page', '
1ec0: 53 51 4c 69 74 65 20 69 73 20 61 20 73 6f 66 74  SQLite is a soft
1ed0: 77 61 72 65 2e 2e 2e 27 29 3b 0a 0a 20 20 3c 69  ware...');..  <i
1ee0: 3e 2d 2d 20 49 6e 73 65 72 74 20 61 20 72 6f 77  >-- Insert a row
1ef0: 20 61 6e 64 20 61 6c 6c 6f 77 20 46 54 53 33 20   and allow FTS3 
1f00: 74 6f 20 61 73 73 69 67 6e 20 61 20 64 6f 63 69  to assign a doci
1f10: 64 20 76 61 6c 75 65 20 75 73 69 6e 67 20 74 68  d value using th
1f20: 65 20 73 61 6d 65 20 61 6c 67 6f 72 69 74 68 6d  e same algorithm
1f30: 20 61 73 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20   as</i>.  <i>-- 
1f40: 53 51 4c 69 74 65 20 75 73 65 73 20 66 6f 72 20  SQLite uses for 
1f50: 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65 73 2e  ordinary tables.
1f60: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
1f70: 65 20 6e 65 77 20 64 6f 63 69 64 20 77 69 6c 6c  e new docid will
1f80: 20 62 65 20 35 34 2c 3c 2f 69 3e 0a 20 20 3c 69   be 54,</i>.  <i
1f90: 3e 2d 2d 20 6f 6e 65 20 67 72 65 61 74 65 72 20  >-- one greater 
1fa0: 74 68 61 6e 20 74 68 65 20 6c 61 72 67 65 73 74  than the largest
1fb0: 20 64 6f 63 69 64 20 63 75 72 72 65 6e 74 6c 79   docid currently
1fc0: 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20   present in the 
1fd0: 74 61 62 6c 65 2e 3c 2f 69 3e 0a 20 20 49 4e 53  table.</i>.  INS
1fe0: 45 52 54 20 49 4e 54 4f 20 70 61 67 65 73 28 74  ERT INTO pages(t
1ff0: 69 74 6c 65 2c 20 62 6f 64 79 29 20 56 41 4c 55  itle, body) VALU
2000: 45 53 28 27 44 6f 77 6e 6c 6f 61 64 27 2c 20 27  ES('Download', '
2010: 41 6c 6c 20 53 51 4c 69 74 65 20 73 6f 75 72 63  All SQLite sourc
2020: 65 20 63 6f 64 65 2e 2e 2e 27 29 3b 0a 0a 20 20  e code...');..  
2030: 3c 69 3e 2d 2d 20 43 68 61 6e 67 65 20 74 68 65  <i>-- Change the
2040: 20 74 69 74 6c 65 20 6f 66 20 74 68 65 20 72 6f   title of the ro
2050: 77 20 6a 75 73 74 20 69 6e 73 65 72 74 65 64 2e  w just inserted.
2060: 3c 2f 69 3e 0a 20 20 55 50 44 41 54 45 20 70 61  </i>.  UPDATE pa
2070: 67 65 73 20 53 45 54 20 74 69 74 6c 65 20 3d 20  ges SET title = 
2080: 27 44 6f 77 6e 6c 6f 61 64 20 53 51 4c 69 74 65  'Download SQLite
2090: 27 20 57 48 45 52 45 20 72 6f 77 69 64 20 3d 20  ' WHERE rowid = 
20a0: 35 34 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 44 65 6c  54;..  <i>-- Del
20b0: 65 74 65 20 74 68 65 20 65 6e 74 69 72 65 20 74  ete the entire t
20c0: 61 62 6c 65 20 63 6f 6e 74 65 6e 74 73 2e 3c 2f  able contents.</
20d0: 69 3e 0a 20 20 44 45 4c 45 54 45 20 46 52 4f 4d  i>.  DELETE FROM
20e0: 20 70 61 67 65 73 3b 0a 0a 20 20 3c 69 3e 2d 2d   pages;..  <i>--
20f0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   The following i
2100: 73 20 61 6e 20 65 72 72 6f 72 2e 20 49 74 20 69  s an error. It i
2110: 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
2120: 6f 20 61 73 73 69 67 6e 20 6e 6f 6e 2d 4e 55 4c  o assign non-NUL
2130: 4c 20 76 61 6c 75 65 73 20 74 6f 20 62 6f 74 68  L values to both
2140: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 68 65  </i>.  <i>-- the
2150: 20 72 6f 77 69 64 20 61 6e 64 20 64 6f 63 69 64   rowid and docid
2160: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 61 6e 20 46   columns of an F
2170: 54 53 33 20 74 61 62 6c 65 2e 3c 2f 69 3e 0a 20  TS3 table.</i>. 
2180: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 67   INSERT INTO pag
2190: 65 73 28 72 6f 77 69 64 2c 20 64 6f 63 69 64 2c  es(rowid, docid,
21a0: 20 74 69 74 6c 65 2c 20 62 6f 64 79 29 20 56 41   title, body) VA
21b0: 4c 55 45 53 28 31 2c 20 32 2c 20 27 41 20 74 69  LUES(1, 2, 'A ti
21c0: 74 6c 65 27 2c 20 27 41 20 64 6f 63 75 6d 65 6e  tle', 'A documen
21d0: 74 20 62 6f 64 79 27 29 3b 0a 7d 5d 0a 0a 20 20  t body');.}]..  
21e0: 3c 70 3e 0a 20 20 20 20 54 6f 20 73 75 70 70 6f  <p>.    To suppo
21f0: 72 74 20 66 75 6c 6c 2d 74 65 78 74 20 71 75 65  rt full-text que
2200: 72 69 65 73 2c 20 46 54 53 33 20 6d 61 69 6e 74  ries, FTS3 maint
2210: 61 69 6e 73 20 61 6e 20 69 6e 76 65 72 74 65 64  ains an inverted
2220: 20 69 6e 64 65 78 20 74 68 61 74 20 6d 61 70 73   index that maps
2230: 0a 20 20 20 20 66 72 6f 6d 20 65 61 63 68 20 75  .    from each u
2240: 6e 69 71 75 65 20 74 65 72 6d 20 6f 72 20 77 6f  nique term or wo
2250: 72 64 20 74 68 61 74 20 61 70 70 65 61 72 73 20  rd that appears 
2260: 69 6e 20 74 68 65 20 64 61 74 61 73 65 74 20 74  in the dataset t
2270: 6f 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 73 0a  o the locations.
2280: 20 20 20 20 69 6e 20 77 68 69 63 68 20 69 74 20      in which it 
2290: 61 70 70 65 61 72 73 20 77 69 74 68 69 6e 20 74  appears within t
22a0: 68 65 20 74 61 62 6c 65 20 63 6f 6e 74 65 6e 74  he table content
22b0: 73 2e 20 46 6f 72 20 74 68 65 20 63 75 72 69 6f  s. For the curio
22c0: 75 73 2c 20 61 20 0a 20 20 20 20 63 6f 6d 70 6c  us, a .    compl
22d0: 65 74 65 20 64 65 73 63 72 69 70 74 69 6f 6e 20  ete description 
22e0: 6f 66 20 74 68 65 20 5c 5b 73 65 67 6d 65 6e 74  of the \[segment
22f0: 20 62 74 72 65 65 7c 64 61 74 61 20 73 74 72 75   btree|data stru
2300: 63 74 75 72 65 5c 5d 20 75 73 65 64 20 74 6f 20  cture\] used to 
2310: 73 74 6f 72 65 0a 20 20 20 20 74 68 69 73 20 69  store.    this i
2320: 6e 64 65 78 20 77 69 74 68 69 6e 20 74 68 65 20  ndex within the 
2330: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
2340: 20 64 65 73 63 72 69 62 65 64 20 62 65 6c 6f 77   described below
2350: 2e 20 41 20 66 65 61 74 75 72 65 20 6f 66 0a 20  . A feature of. 
2360: 20 20 20 74 68 69 73 20 64 61 74 61 20 73 74 72     this data str
2370: 75 63 74 75 72 65 20 69 73 20 74 68 61 74 20 61  ucture is that a
2380: 74 20 61 6e 79 20 74 69 6d 65 20 74 68 65 20 64  t any time the d
2390: 61 74 61 62 61 73 65 20 6d 61 79 20 63 6f 6e 74  atabase may cont
23a0: 61 69 6e 20 6e 6f 74 0a 20 20 20 20 6f 6e 65 20  ain not.    one 
23b0: 69 6e 64 65 78 20 62 2d 74 72 65 65 2c 20 62 75  index b-tree, bu
23c0: 74 20 73 65 76 65 72 61 6c 20 64 69 66 66 65 72  t several differ
23d0: 65 6e 74 20 62 2d 74 72 65 65 73 20 74 68 61 74  ent b-trees that
23e0: 20 61 72 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c   are incremental
23f0: 6c 79 0a 20 20 20 20 6d 65 72 67 65 64 20 61 73  ly.    merged as
2400: 20 72 6f 77 73 20 61 72 65 20 69 6e 73 65 72 74   rows are insert
2410: 65 64 2c 20 75 70 64 61 74 65 64 20 61 6e 64 20  ed, updated and 
2420: 64 65 6c 65 74 65 64 2e 20 54 68 69 73 20 74 65  deleted. This te
2430: 63 68 6e 69 71 75 65 20 69 6d 70 72 6f 76 65 73  chnique improves
2440: 20 0a 20 20 20 20 70 65 72 66 6f 72 6d 61 6e 63   .    performanc
2450: 65 20 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74  e when writing t
2460: 6f 20 61 6e 20 46 54 53 33 20 74 61 62 6c 65 2c  o an FTS3 table,
2470: 20 62 75 74 20 63 61 75 73 65 73 20 73 6f 6d 65   but causes some
2480: 20 6f 76 65 72 68 65 61 64 20 66 6f 72 0a 20 20   overhead for.  
2490: 20 20 66 75 6c 6c 2d 74 65 78 74 20 71 75 65 72    full-text quer
24a0: 69 65 73 20 74 68 61 74 20 75 73 65 20 74 68 65  ies that use the
24b0: 20 69 6e 64 65 78 2e 20 45 78 65 63 75 74 69 6e   index. Executin
24c0: 67 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65  g an SQL stateme
24d0: 6e 74 20 6f 66 20 74 68 65 0a 20 20 20 20 66 6f  nt of the.    fo
24e0: 72 6d 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20  rm "INSERT INTO 
24f0: 26 6c 74 3b 66 74 73 33 2d 74 61 62 6c 65 26 67  &lt;fts3-table&g
2500: 74 3b 28 26 6c 74 3b 66 74 73 33 2d 74 61 62 6c  t;(&lt;fts3-tabl
2510: 65 26 67 74 3b 29 20 56 41 4c 55 45 53 28 27 6f  e&gt;) VALUES('o
2520: 70 74 69 6d 69 7a 65 27 29 22 0a 20 20 20 20 63  ptimize')".    c
2530: 61 75 73 65 73 20 46 54 53 33 20 74 6f 20 6d 65  auses FTS3 to me
2540: 72 67 65 20 61 6c 6c 20 65 78 69 73 74 69 6e 67  rge all existing
2550: 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73 20 69   index b-trees i
2560: 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 6c 61 72  nto a single lar
2570: 67 65 0a 20 20 20 20 62 2d 74 72 65 65 20 63 6f  ge.    b-tree co
2580: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65 6e 74  ntaining the ent
2590: 69 72 65 20 69 6e 64 65 78 2e 20 54 68 69 73 20  ire index. This 
25a0: 63 61 6e 20 62 65 20 61 6e 20 65 78 70 65 6e 73  can be an expens
25b0: 69 76 65 20 6f 70 65 72 61 74 69 6f 6e 2c 0a 20  ive operation,. 
25c0: 20 20 20 62 75 74 20 6d 61 79 20 73 70 65 65 64     but may speed
25d0: 20 75 70 20 66 75 74 75 72 65 20 71 75 65 72 69   up future queri
25e0: 65 73 2e 20 0a 0a 20 20 3c 70 3e 0a 20 20 20 20  es. ..  <p>.    
25f0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 6f 20  For example, to 
2600: 6f 70 74 69 6d 69 7a 65 20 74 68 65 20 66 75 6c  optimize the ful
2610: 6c 2d 74 65 78 74 20 69 6e 64 65 78 20 66 6f 72  l-text index for
2620: 20 61 6e 20 46 54 53 33 20 74 61 62 6c 65 20 6e   an FTS3 table n
2630: 61 6d 65 64 0a 20 20 20 20 22 64 6f 63 73 22 3a  amed.    "docs":
2640: 0a 0a 5b 43 6f 64 65 20 7b 0a 20 20 3c 69 3e 2d  ..[Code {.  <i>-
2650: 2d 20 4f 70 74 69 6d 69 7a 65 20 74 68 65 20 69  - Optimize the i
2660: 6e 74 65 72 6e 61 6c 20 73 74 72 75 63 74 75 72  nternal structur
2670: 65 20 6f 66 20 46 54 53 33 20 74 61 62 6c 65 20  e of FTS3 table 
2680: 22 64 6f 63 73 22 2e 3c 2f 69 3e 0a 20 20 49 4e  "docs".</i>.  IN
2690: 53 45 52 54 20 49 4e 54 4f 20 64 6f 63 73 28 64  SERT INTO docs(d
26a0: 6f 63 73 29 20 56 41 4c 55 45 53 28 27 6f 70 74  ocs) VALUES('opt
26b0: 69 6d 69 7a 65 27 29 3b 0a 7d 5d 0a 0a 20 20 3c  imize');.}]..  <
26c0: 70 3e 0a 20 20 20 20 54 68 65 20 73 74 61 74 65  p>.    The state
26d0: 6d 65 6e 74 20 61 62 6f 76 65 20 6d 61 79 20 61  ment above may a
26e0: 70 70 65 61 72 20 73 79 6e 74 61 63 74 69 63 6c  ppear syntacticl
26f0: 79 20 69 6e 63 6f 72 72 65 63 74 20 74 6f 20 73  y incorrect to s
2700: 6f 6d 65 2e 20 52 65 66 65 72 20 74 6f 0a 20 20  ome. Refer to.  
2710: 20 20 74 68 65 20 73 65 63 74 69 6f 6e 20 64 65    the section de
2720: 73 63 72 69 62 69 6e 67 20 74 68 65 20 5c 5b 73  scribing the \[s
2730: 69 6d 70 6c 65 20 66 74 73 33 20 71 75 65 72 69  imple fts3 queri
2740: 65 73 5c 5d 20 66 6f 72 20 61 6e 20 65 78 70 6c  es\] for an expl
2750: 61 6e 61 74 69 6f 6e 2e 0a 0a 20 20 3c 70 3e 0a  anation...  <p>.
2760: 20 20 20 20 54 68 65 72 65 20 69 73 20 61 6e 6f      There is ano
2770: 74 68 65 72 2c 20 64 65 70 72 65 63 61 74 65 64  ther, deprecated
2780: 2c 20 6d 65 74 68 6f 64 20 66 6f 72 20 69 6e 76  , method for inv
2790: 6f 6b 69 6e 67 20 74 68 65 20 6f 70 74 69 6d 69  oking the optimi
27a0: 7a 65 20 0a 20 20 20 20 6f 70 65 72 61 74 69 6f  ze .    operatio
27b0: 6e 20 75 73 69 6e 67 20 61 20 53 45 4c 45 43 54  n using a SELECT
27c0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 4e 65 77 20   statement. New 
27d0: 63 6f 64 65 20 73 68 6f 75 6c 64 20 75 73 65 20  code should use 
27e0: 73 74 61 74 65 6d 65 6e 74 73 0a 20 20 20 20 73  statements.    s
27f0: 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 20 49 4e  imilar to the IN
2800: 53 45 52 54 20 61 62 6f 76 65 20 74 6f 20 6f 70  SERT above to op
2810: 74 69 6d 69 7a 65 20 46 54 53 33 20 73 74 72 75  timize FTS3 stru
2820: 63 74 75 72 65 73 2e 0a 0a 5b 68 32 20 22 51 75  ctures...[h2 "Qu
2830: 65 72 79 69 6e 67 20 46 54 53 33 20 54 61 62 6c  erying FTS3 Tabl
2840: 65 73 22 20 7b 7d 20 7b 73 69 6d 70 6c 65 20 66  es" {} {simple f
2850: 74 73 33 20 71 75 65 72 69 65 73 7d 5d 0a 0a 3c  ts3 queries}]..<
2860: 70 3e 0a 20 20 41 73 20 66 6f 72 20 61 6c 6c 20  p>.  As for all 
2870: 6f 74 68 65 72 20 53 51 4c 69 74 65 20 74 61 62  other SQLite tab
2880: 6c 65 73 2c 20 76 69 72 74 75 61 6c 20 6f 72 20  les, virtual or 
2890: 6f 74 68 65 72 77 69 73 65 2c 20 64 61 74 61 20  otherwise, data 
28a0: 69 73 20 72 65 74 72 69 65 76 65 64 0a 20 20 66  is retrieved.  f
28b0: 72 6f 6d 20 46 54 53 33 20 74 61 62 6c 65 73 20  rom FTS3 tables 
28c0: 75 73 69 6e 67 20 61 20 5c 5b 53 45 4c 45 43 54  using a \[SELECT
28d0: 5c 5d 20 73 74 61 74 65 6d 65 6e 74 2e 0a 0a 3c  \] statement...<
28e0: 70 3e 0a 20 20 46 54 53 33 20 74 61 62 6c 65 73  p>.  FTS3 tables
28f0: 20 63 61 6e 20 62 65 20 71 75 65 72 69 65 64 20   can be queried 
2900: 65 66 66 69 63 69 65 6e 74 6c 79 20 75 73 69 6e  efficiently usin
2910: 67 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  g SELECT stateme
2920: 6e 74 73 20 6f 66 20 74 77 6f 0a 20 20 64 69 66  nts of two.  dif
2930: 66 65 72 65 6e 74 20 66 6f 72 6d 73 3a 0a 0a 3c  ferent forms:..<
2940: 75 6c 3e 0a 20 20 3c 6c 69 3e 3c 70 3e 0a 20 20  ul>.  <li><p>.  
2950: 20 20 3c 62 3e 51 75 65 72 79 20 62 79 20 72 6f    <b>Query by ro
2960: 77 69 64 3c 2f 62 3e 2e 20 49 66 20 74 68 65 20  wid</b>. If the 
2970: 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20  WHERE clause of 
2980: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
2990: 6d 65 6e 74 0a 20 20 20 20 63 6f 6e 74 61 69 6e  ment.    contain
29a0: 73 20 61 20 73 75 62 2d 63 6c 61 75 73 65 20 6f  s a sub-clause o
29b0: 66 20 74 68 65 20 66 6f 72 6d 20 22 72 6f 77 69  f the form "rowi
29c0: 64 20 3d 20 3f 22 2c 20 77 68 65 72 65 20 3f 20  d = ?", where ? 
29d0: 69 73 20 61 6e 20 53 51 4c 20 65 78 70 72 65 73  is an SQL expres
29e0: 73 69 6f 6e 2c 0a 20 20 20 20 46 54 53 33 20 69  sion,.    FTS3 i
29f0: 73 20 61 62 6c 65 20 74 6f 20 72 65 74 72 65 69  s able to retrei
2a00: 76 65 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ve the requested
2a10: 20 72 6f 77 20 64 69 72 65 63 74 6c 79 20 75 73   row directly us
2a20: 69 6e 67 20 74 68 65 20 65 71 75 69 76 61 6c 65  ing the equivale
2a30: 6e 74 20 0a 20 20 20 20 6f 66 20 61 6e 20 53 51  nt .    of an SQ
2a40: 4c 69 74 65 20 5c 5b 49 4e 54 45 47 45 52 20 50  Lite \[INTEGER P
2a50: 52 49 4d 41 52 59 20 4b 45 59 5c 5d 20 69 6e 64  RIMARY KEY\] ind
2a60: 65 78 2e 0a 0a 20 20 3c 6c 69 3e 3c 70 3e 0a 20  ex...  <li><p>. 
2a70: 20 20 20 3c 62 3e 46 75 6c 6c 2d 74 65 78 74 20     <b>Full-text 
2a80: 71 75 65 72 79 3c 2f 62 3e 2e 20 49 66 20 74 68  query</b>. If th
2a90: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f  e WHERE clause o
2aa0: 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
2ab0: 74 65 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 73 0a  tement contains.
2ac0: 20 20 20 20 61 20 73 75 62 2d 63 6c 61 75 73 65      a sub-clause
2ad0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 26 6c   of the form "&l
2ae0: 74 3b 63 6f 6c 75 6d 6e 26 67 74 3b 20 4d 41 54  t;column&gt; MAT
2af0: 43 48 20 3f 22 2c 20 46 54 53 33 20 69 73 20 61  CH ?", FTS3 is a
2b00: 62 6c 65 20 74 6f 20 75 73 65 20 0a 20 20 20 20  ble to use .    
2b10: 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 66 75 6c  the built-in ful
2b20: 6c 2d 74 65 78 74 20 69 6e 64 65 78 20 74 6f 20  l-text index to 
2b30: 72 65 73 74 72 69 63 74 20 74 68 65 20 73 65 61  restrict the sea
2b40: 72 63 68 20 74 6f 20 74 68 6f 73 65 20 64 6f 63  rch to those doc
2b50: 75 6d 65 6e 74 73 20 0a 20 20 20 20 74 68 61 74  uments .    that
2b60: 20 6d 61 74 63 68 20 74 68 65 20 66 75 6c 6c 2d   match the full-
2b70: 74 65 78 74 20 71 75 65 72 79 20 73 74 72 69 6e  text query strin
2b80: 67 20 73 70 65 63 69 66 69 65 64 20 61 73 20 74  g specified as t
2b90: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 6f 70  he right-hand op
2ba0: 65 72 61 6e 64 0a 20 20 20 20 6f 66 20 74 68 65  erand.    of the
2bb0: 20 4d 41 54 43 48 20 63 6c 61 75 73 65 2e 0a 3c   MATCH clause..<
2bc0: 2f 75 6c 3e 0a 0a 3c 70 3e 0a 20 20 49 66 20 6e  /ul>..<p>.  If n
2bd0: 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 74 77  either of the tw
2be0: 6f 20 71 75 65 72 79 20 73 74 72 61 74 65 67 69  o query strategi
2bf0: 65 73 20 65 6e 75 6d 65 72 61 74 65 64 20 61 62  es enumerated ab
2c00: 6f 76 65 20 63 61 6e 20 62 65 20 75 73 65 64 2c  ove can be used,
2c10: 20 61 6c 6c 0a 20 20 71 75 65 72 69 65 73 20 6f   all.  queries o
2c20: 6e 20 46 54 53 33 20 74 61 62 6c 65 73 20 61 72  n FTS3 tables ar
2c30: 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73  e implemented us
2c40: 69 6e 67 20 61 20 6c 69 6e 65 61 72 20 73 63 61  ing a linear sca
2c50: 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 0a  n of the entire.
2c60: 20 20 74 61 62 6c 65 2e 20 49 66 20 74 68 65 20    table. If the 
2c70: 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 6c  table contains l
2c80: 61 72 67 65 20 61 6d 6f 75 6e 74 73 20 6f 66 20  arge amounts of 
2c90: 64 61 74 61 2c 20 74 68 69 73 20 6d 61 79 20 62  data, this may b
2ca0: 65 20 61 6e 20 0a 20 20 69 6d 70 72 61 63 74 69  e an .  impracti
2cb0: 63 61 6c 6c 79 20 61 70 70 72 6f 61 63 68 20 28  cally approach (
2cc0: 74 68 65 20 66 69 72 73 74 20 65 78 61 6d 70 6c  the first exampl
2cd0: 65 20 6f 6e 20 74 68 69 73 20 70 61 67 65 20 73  e on this page s
2ce0: 68 6f 77 73 20 74 68 61 74 20 61 20 6c 69 6e 65  hows that a line
2cf0: 61 72 0a 20 20 73 63 61 6e 20 6f 66 20 31 2e 35  ar.  scan of 1.5
2d00: 20 47 42 20 6f 66 20 64 61 74 61 20 74 61 6b 65   GB of data take
2d10: 73 20 61 72 6f 75 6e 64 20 33 30 20 73 65 63 6f  s around 30 seco
2d20: 6e 64 73 20 75 73 69 6e 67 20 61 20 6d 6f 64 65  nds using a mode
2d30: 72 6e 20 50 43 29 2e 0a 0a 5b 43 6f 64 65 20 7b  rn PC)...[Code {
2d40: 0a 20 20 3c 69 3e 2d 2d 20 54 68 65 20 65 78 61  .  <i>-- The exa
2d50: 6d 70 6c 65 73 20 69 6e 20 74 68 69 73 20 62 6c  mples in this bl
2d60: 6f 63 6b 20 61 73 73 75 6d 65 20 74 68 65 20 66  ock assume the f
2d70: 6f 6c 6c 6f 77 69 6e 67 20 46 54 53 33 20 74 61  ollowing FTS3 ta
2d80: 62 6c 65 3a 3c 2f 69 3e 0a 20 20 43 52 45 41 54  ble:</i>.  CREAT
2d90: 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  E VIRTUAL TABLE 
2da0: 6d 61 69 6c 20 55 53 49 4e 47 20 66 74 73 33 28  mail USING fts3(
2db0: 73 75 62 6a 65 63 74 2c 20 62 6f 64 79 29 3b 0a  subject, body);.
2dc0: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
2dd0: 20 6d 61 69 6c 20 57 48 45 52 45 20 72 6f 77 69   mail WHERE rowi
2de0: 64 20 3d 20 31 35 3b 20 20 20 20 20 20 20 20 20  d = 15;         
2df0: 20 20 20 20 20 20 20 3c 69 3e 2d 2d 20 46 61 73         <i>-- Fas
2e00: 74 2e 20 52 6f 77 69 64 20 6c 6f 6f 6b 75 70 2e  t. Rowid lookup.
2e10: 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20  </i>.  SELECT * 
2e20: 46 52 4f 4d 20 6d 61 69 6c 20 57 48 45 52 45 20  FROM mail WHERE 
2e30: 62 6f 64 79 20 4d 41 54 43 48 20 27 73 71 6c 69  body MATCH 'sqli
2e40: 74 65 27 3b 20 20 20 20 20 20 20 3c 69 3e 2d 2d  te';       <i>--
2e50: 20 46 61 73 74 2e 20 46 75 6c 6c 2d 74 65 78 74   Fast. Full-text
2e60: 20 71 75 65 72 79 2e 3c 2f 69 3e 0a 20 20 53 45   query.</i>.  SE
2e70: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6d 61 69 6c  LECT * FROM mail
2e80: 20 57 48 45 52 45 20 6d 61 69 6c 20 4d 41 54 43   WHERE mail MATC
2e90: 48 20 27 73 65 61 72 63 68 27 3b 20 20 20 20 20  H 'search';     
2ea0: 20 20 3c 69 3e 2d 2d 20 46 61 73 74 2e 20 46 75    <i>-- Fast. Fu
2eb0: 6c 6c 2d 74 65 78 74 20 71 75 65 72 79 2e 3c 2f  ll-text query.</
2ec0: 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52  i>.  SELECT * FR
2ed0: 4f 4d 20 6d 61 69 6c 20 57 48 45 52 45 20 72 6f  OM mail WHERE ro
2ee0: 77 69 64 20 42 45 54 57 45 45 4e 20 31 35 20 41  wid BETWEEN 15 A
2ef0: 4e 44 20 32 30 3b 20 20 20 3c 69 3e 2d 2d 20 53  ND 20;   <i>-- S
2f00: 6c 6f 77 2e 20 4c 69 6e 65 61 72 20 73 63 61 6e  low. Linear scan
2f10: 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a  .</i>.  SELECT *
2f20: 20 46 52 4f 4d 20 6d 61 69 6c 20 57 48 45 52 45   FROM mail WHERE
2f30: 20 73 75 62 6a 65 63 74 20 3d 20 27 64 61 74 61   subject = 'data
2f40: 62 61 73 65 27 3b 20 20 20 20 20 20 3c 69 3e 2d  base';      <i>-
2f50: 2d 20 53 6c 6f 77 2e 20 4c 69 6e 65 61 72 20 73  - Slow. Linear s
2f60: 63 61 6e 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43  can.</i>.  SELEC
2f70: 54 20 2a 20 46 52 4f 4d 20 6d 61 69 6c 20 57 48  T * FROM mail WH
2f80: 45 52 45 20 73 75 62 6a 65 63 74 20 4d 41 54 43  ERE subject MATC
2f90: 48 20 27 64 61 74 61 62 61 73 65 27 3b 20 20 3c  H 'database';  <
2fa0: 69 3e 2d 2d 20 46 61 73 74 2e 20 46 75 6c 6c 2d  i>-- Fast. Full-
2fb0: 74 65 78 74 20 71 75 65 72 79 2e 3c 2f 69 3e 0a  text query.</i>.
2fc0: 7d 5d 0a 0a 3c 70 3e 0a 20 20 49 6e 20 61 6c 6c  }]..<p>.  In all
2fd0: 20 6f 66 20 74 68 65 20 66 75 6c 6c 2d 74 65 78   of the full-tex
2fe0: 74 20 71 75 65 72 69 65 73 20 61 62 6f 76 65 2c  t queries above,
2ff0: 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   the right-hand 
3000: 6f 70 65 72 61 6e 64 20 6f 66 20 74 68 65 20 4d  operand of the M
3010: 41 54 43 48 0a 20 20 6f 70 65 72 61 74 6f 72 20  ATCH.  operator 
3020: 69 73 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 73  is a string cons
3030: 69 73 74 69 6e 67 20 6f 66 20 61 20 73 69 6e 67  isting of a sing
3040: 6c 65 20 74 65 72 6d 2e 20 49 6e 20 74 68 69 73  le term. In this
3050: 20 63 61 73 65 2c 20 74 68 65 20 4d 41 54 43 48   case, the MATCH
3060: 0a 20 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76  .  expression ev
3070: 61 6c 75 61 74 65 73 20 74 6f 20 74 72 75 65 20  aluates to true 
3080: 66 6f 72 20 61 6c 6c 20 64 6f 63 75 6d 65 6e 74  for all document
3090: 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 6f  s that contain o
30a0: 6e 65 20 6f 72 20 6d 6f 72 65 20 0a 20 20 69 6e  ne or more .  in
30b0: 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 73  stances of the s
30c0: 70 65 63 69 66 69 65 64 20 77 6f 72 64 20 28 22  pecified word ("
30d0: 73 71 6c 69 74 65 22 2c 20 22 73 65 61 72 63 68  sqlite", "search
30e0: 22 20 6f 72 20 22 64 61 74 61 62 61 73 65 22 2c  " or "database",
30f0: 20 64 65 70 65 6e 64 69 6e 67 20 0a 20 20 6f 6e   depending .  on
3100: 20 77 68 69 63 68 20 65 78 61 6d 70 6c 65 20 79   which example y
3110: 6f 75 20 6c 6f 6f 6b 20 61 74 29 2e 20 53 70 65  ou look at). Spe
3120: 63 69 66 79 69 6e 67 20 61 20 73 69 6e 67 6c 65  cifying a single
3130: 20 74 65 72 6d 20 61 73 20 74 68 65 20 72 69 67   term as the rig
3140: 68 74 2d 68 61 6e 64 0a 20 20 6f 70 65 72 61 6e  ht-hand.  operan
3150: 64 20 6f 66 20 74 68 65 20 4d 41 54 43 48 20 6f  d of the MATCH o
3160: 70 65 72 61 74 6f 72 20 72 65 73 75 6c 74 73 20  perator results 
3170: 69 6e 20 74 68 65 20 73 69 6d 70 6c 65 73 74 20  in the simplest 
3180: 28 61 6e 64 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e  (and most common
3190: 29 20 74 79 70 65 20 0a 20 20 6f 66 20 66 75 6c  ) type .  of ful
31a0: 6c 2d 74 65 78 74 20 71 75 65 72 79 20 70 6f 73  l-text query pos
31b0: 73 69 62 6c 65 2e 20 48 6f 77 65 76 65 72 20 6d  sible. However m
31c0: 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 20  ore complicated 
31d0: 71 75 65 72 69 65 73 20 61 72 65 20 70 6f 73 73  queries are poss
31e0: 69 62 6c 65 2c 0a 20 20 69 6e 63 6c 75 64 69 6e  ible,.  includin
31f0: 67 20 70 68 72 61 73 65 20 73 65 61 72 63 68 65  g phrase searche
3200: 73 2c 20 74 65 72 6d 2d 70 72 65 66 69 78 20 73  s, term-prefix s
3210: 65 61 72 63 68 65 73 20 61 6e 64 20 73 65 61 72  earches and sear
3220: 63 68 65 73 20 66 6f 72 20 64 6f 63 75 6d 65 6e  ches for documen
3230: 74 73 20 0a 20 20 63 6f 6e 74 61 69 6e 69 6e 67  ts .  containing
3240: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66   combinations of
3250: 20 74 65 72 6d 73 20 6f 63 63 75 72 69 6e 67 20   terms occuring 
3260: 77 69 74 68 69 6e 20 61 20 64 65 66 69 6e 65 64  within a defined
3270: 20 70 72 6f 78 69 6d 69 74 79 20 6f 66 20 65 61   proximity of ea
3280: 63 68 0a 20 20 6f 74 68 65 72 2e 20 54 68 65 20  ch.  other. The 
3290: 76 61 72 69 6f 75 73 20 77 61 79 73 20 69 6e 20  various ways in 
32a0: 77 68 69 63 68 20 74 68 65 20 66 75 6c 6c 2d 74  which the full-t
32b0: 65 78 74 20 69 6e 64 65 78 20 6d 61 79 20 62 65  ext index may be
32c0: 20 71 75 65 72 69 65 64 20 61 72 65 0a 20 20 5c   queried are.  \
32d0: 5b 46 54 53 33 20 4d 41 54 43 48 7c 64 65 73 63  [FTS3 MATCH|desc
32e0: 72 69 62 65 64 20 62 65 6c 6f 77 5c 5d 2e 0a 0a  ribed below\]...
32f0: 3c 70 3e 0a 20 20 4e 6f 72 6d 61 6c 6c 79 2c 20  <p>.  Normally, 
3300: 66 75 6c 6c 2d 74 65 78 74 20 71 75 65 72 69 65  full-text querie
3310: 73 20 61 72 65 20 63 61 73 65 2d 69 6e 73 65 6e  s are case-insen
3320: 73 69 74 69 76 65 2e 20 48 6f 77 65 76 65 72 2c  sitive. However,
3330: 20 74 68 69 73 20 69 73 0a 20 20 69 73 20 64 65   this is.  is de
3340: 70 65 6e 64 65 6e 74 20 6f 6e 20 74 68 65 20 73  pendent on the s
3350: 70 65 63 69 66 69 63 20 5c 5b 74 6f 6b 65 6e 69  pecific \[tokeni
3360: 7a 65 72 5c 5d 20 75 73 65 64 20 62 79 20 74 68  zer\] used by th
3370: 65 20 46 54 53 33 20 74 61 62 6c 65 0a 20 20 62  e FTS3 table.  b
3380: 65 69 6e 67 20 71 75 65 72 69 65 64 2e 20 52 65  eing queried. Re
3390: 66 65 72 20 74 6f 20 74 68 65 20 73 65 63 74 69  fer to the secti
33a0: 6f 6e 20 6f 6e 20 5c 5b 74 6f 6b 65 6e 69 7a 65  on on \[tokenize
33b0: 72 7c 74 6f 6b 65 6e 69 7a 65 72 73 5c 5d 20 66  r|tokenizers\] f
33c0: 6f 72 20 64 65 74 61 69 6c 73 2e 0a 0a 3c 70 3e  or details...<p>
33d0: 0a 20 20 54 68 65 20 70 61 72 61 67 72 61 70 68  .  The paragraph
33e0: 20 61 62 6f 76 65 20 6e 6f 74 65 73 20 74 68 61   above notes tha
33f0: 74 20 61 20 4d 41 54 43 48 20 6f 70 65 72 61 74  t a MATCH operat
3400: 6f 72 20 77 69 74 68 20 61 20 73 69 6d 70 6c 65  or with a simple
3410: 20 74 65 72 6d 20 61 73 20 74 68 65 0a 20 20 72   term as the.  r
3420: 69 67 68 74 2d 68 61 6e 64 20 6f 70 65 72 61 6e  ight-hand operan
3430: 64 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 74  d evaluates to t
3440: 72 75 65 20 66 6f 72 20 61 6c 6c 20 64 6f 63 75  rue for all docu
3450: 6d 65 6e 74 73 20 74 68 61 74 20 63 6f 6e 74 61  ments that conta
3460: 69 6e 20 74 68 65 0a 20 20 73 70 65 63 69 66 69  in the.  specifi
3470: 65 64 20 74 65 72 6d 2e 20 49 6e 20 74 68 69 73  ed term. In this
3480: 20 63 6f 6e 74 65 78 74 2c 20 74 68 65 20 22 64   context, the "d
3490: 6f 63 75 6d 65 6e 74 22 20 6d 61 79 20 72 65 66  ocument" may ref
34a0: 65 72 20 74 6f 20 65 69 74 68 65 72 20 74 68 65  er to either the
34b0: 20 0a 20 20 64 61 74 61 20 73 74 6f 72 65 64 20   .  data stored 
34c0: 69 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75  in a single colu
34d0: 6d 6e 20 6f 66 20 61 20 72 6f 77 20 6f 66 20 61  mn of a row of a
34e0: 6e 20 46 54 53 33 20 74 61 62 6c 65 2c 20 6f 72  n FTS3 table, or
34f0: 20 74 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 73   to the contents
3500: 0a 20 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e  .  of all column
3510: 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f  s in a single ro
3520: 77 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  w, depending on 
3530: 74 68 65 20 69 64 65 6e 74 69 66 69 65 72 20 75  the identifier u
3540: 73 65 64 20 61 73 20 74 68 65 0a 20 20 6c 65 66  sed as the.  lef
3550: 74 2d 68 61 6e 64 20 6f 70 65 72 61 6e 64 20 74  t-hand operand t
3560: 6f 20 74 68 65 20 4d 41 54 43 48 20 6f 70 65 72  o the MATCH oper
3570: 61 74 6f 72 2e 20 49 66 20 74 68 65 20 69 64 65  ator. If the ide
3580: 6e 74 69 66 69 65 72 20 73 70 65 63 69 66 69 65  ntifier specifie
3590: 64 20 61 73 0a 20 20 74 68 65 20 6c 65 66 74 2d  d as.  the left-
35a0: 68 61 6e 64 20 6f 70 65 72 61 6e 64 20 6f 66 20  hand operand of 
35b0: 74 68 65 20 4d 41 54 43 48 20 6f 70 65 72 61 74  the MATCH operat
35c0: 6f 72 20 69 73 20 61 6e 20 46 54 53 33 20 74 61  or is an FTS3 ta
35d0: 62 6c 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2c  ble column name,
35e0: 0a 20 20 74 68 65 6e 20 74 68 65 20 64 6f 63 75  .  then the docu
35f0: 6d 65 6e 74 20 74 68 61 74 20 74 68 65 20 73 65  ment that the se
3600: 61 72 63 68 20 74 65 72 6d 20 6d 75 73 74 20 62  arch term must b
3610: 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 69  e contained in i
3620: 73 20 74 68 65 20 76 61 6c 75 65 0a 20 20 73 74  s the value.  st
3630: 6f 72 65 64 20 69 6e 20 74 68 65 20 73 70 65 63  ored in the spec
3640: 69 66 69 65 64 20 63 6f 6c 75 6d 6e 2e 20 48 6f  ified column. Ho
3650: 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 69 64  wever, if the id
3660: 65 6e 74 69 66 69 65 72 20 69 73 20 74 68 65 20  entifier is the 
3670: 6e 61 6d 65 0a 20 20 6f 66 20 74 68 65 20 46 54  name.  of the FT
3680: 53 33 20 3c 69 3e 74 61 62 6c 65 3c 2f 69 3e 20  S3 <i>table</i> 
3690: 69 74 73 65 6c 66 2c 20 74 68 65 6e 20 74 68 65  itself, then the
36a0: 20 4d 41 54 43 48 20 6f 70 65 72 61 74 6f 72 20   MATCH operator 
36b0: 65 76 61 6c 75 61 74 65 73 20 74 6f 20 74 72 75  evaluates to tru
36c0: 65 0a 20 20 66 6f 72 20 65 61 63 68 20 72 6f 77  e.  for each row
36d0: 20 6f 66 20 74 68 65 20 46 54 53 33 20 74 61 62   of the FTS3 tab
36e0: 6c 65 20 66 6f 72 20 77 68 69 63 68 20 61 6e 79  le for which any
36f0: 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73   column contains
3700: 20 74 68 65 20 73 65 61 72 63 68 20 0a 20 20 74   the search .  t
3710: 65 72 6d 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  erm. The followi
3720: 6e 67 20 65 78 61 6d 70 6c 65 20 64 65 6d 6f 6e  ng example demon
3730: 73 74 72 61 74 65 73 20 74 68 69 73 3a 0a 0a 5b  strates this:..[
3740: 43 6f 64 65 20 7b 0a 20 20 3c 69 3e 2d 2d 20 45  Code {.  <i>-- E
3750: 78 61 6d 70 6c 65 20 73 63 68 65 6d 61 3c 2f 69  xample schema</i
3760: 3e 0a 20 20 43 52 45 41 54 45 20 56 49 52 54 55  >.  CREATE VIRTU
3770: 41 4c 20 54 41 42 4c 45 20 6d 61 69 6c 20 55 53  AL TABLE mail US
3780: 49 4e 47 20 66 74 73 33 28 73 75 62 6a 65 63 74  ING fts3(subject
3790: 2c 20 62 6f 64 79 29 3b 0a 0a 20 20 3c 69 3e 2d  , body);..  <i>-
37a0: 2d 20 45 78 61 6d 70 6c 65 20 74 61 62 6c 65 20  - Example table 
37b0: 70 6f 70 75 6c 61 74 69 6f 6e 3c 2f 69 3e 0a 20  population</i>. 
37c0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6d 61 69   INSERT INTO mai
37d0: 6c 28 64 6f 63 69 64 2c 20 73 75 62 6a 65 63 74  l(docid, subject
37e0: 2c 20 62 6f 64 79 29 20 56 41 4c 55 45 53 28 31  , body) VALUES(1
37f0: 2c 20 27 73 6f 66 74 77 61 72 65 20 66 65 65 64  , 'software feed
3800: 62 61 63 6b 27 2c 20 27 66 6f 75 6e 64 20 69 74  back', 'found it
3810: 20 74 6f 6f 20 73 6c 6f 77 27 29 3b 0a 20 20 49   too slow');.  I
3820: 4e 53 45 52 54 20 49 4e 54 4f 20 6d 61 69 6c 28  NSERT INTO mail(
3830: 64 6f 63 69 64 2c 20 73 75 62 6a 65 63 74 2c 20  docid, subject, 
3840: 62 6f 64 79 29 20 56 41 4c 55 45 53 28 32 2c 20  body) VALUES(2, 
3850: 27 73 6f 66 74 77 61 72 65 20 66 65 65 64 62 61  'software feedba
3860: 63 6b 27 2c 20 27 6e 6f 20 66 65 65 64 62 61 63  ck', 'no feedbac
3870: 6b 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  k');.  INSERT IN
3880: 54 4f 20 6d 61 69 6c 28 64 6f 63 69 64 2c 20 73  TO mail(docid, s
3890: 75 62 6a 65 63 74 2c 20 62 6f 64 79 29 20 56 41  ubject, body) VA
38a0: 4c 55 45 53 28 33 2c 20 27 73 6c 6f 77 20 6c 75  LUES(3, 'slow lu
38b0: 6e 63 68 20 6f 72 64 65 72 27 2c 20 20 27 77 61  nch order',  'wa
38c0: 73 20 61 20 73 6f 66 74 77 61 72 65 20 70 72 6f  s a software pro
38d0: 62 6c 65 6d 27 29 3b 0a 0a 20 20 3c 69 3e 2d 2d  blem');..  <i>--
38e0: 20 45 78 61 6d 70 6c 65 20 71 75 65 72 69 65 73   Example queries
38f0: 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20  </i>.  SELECT * 
3900: 46 52 4f 4d 20 6d 61 69 6c 20 57 48 45 52 45 20  FROM mail WHERE 
3910: 73 75 62 6a 65 63 74 20 4d 41 54 43 48 20 27 73  subject MATCH 's
3920: 6f 66 74 77 61 72 65 27 3b 20 20 20 20 3c 69 3e  oftware';    <i>
3930: 2d 2d 20 53 65 6c 65 63 74 73 20 72 6f 77 73 20  -- Selects rows 
3940: 31 20 61 6e 64 20 32 3c 2f 69 3e 0a 20 20 53 45  1 and 2</i>.  SE
3950: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6d 61 69 6c  LECT * FROM mail
3960: 20 57 48 45 52 45 20 62 6f 64 79 20 20 20 20 4d   WHERE body    M
3970: 41 54 43 48 20 27 66 65 65 64 62 61 63 6b 27 3b  ATCH 'feedback';
3980: 20 20 20 20 3c 69 3e 2d 2d 20 53 65 6c 65 63 74      <i>-- Select
3990: 73 20 72 6f 77 20 32 3c 2f 69 3e 0a 20 20 53 45  s row 2</i>.  SE
39a0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6d 61 69 6c  LECT * FROM mail
39b0: 20 57 48 45 52 45 20 6d 61 69 6c 20 20 20 20 4d   WHERE mail    M
39c0: 41 54 43 48 20 27 73 6f 66 74 77 61 72 65 27 3b  ATCH 'software';
39d0: 20 20 20 20 3c 69 3e 2d 2d 20 53 65 6c 65 63 74      <i>-- Select
39e0: 73 20 72 6f 77 73 20 31 2c 20 32 20 61 6e 64 20  s rows 1, 2 and 
39f0: 33 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a  3</i>.  SELECT *
3a00: 20 46 52 4f 4d 20 6d 61 69 6c 20 57 48 45 52 45   FROM mail WHERE
3a10: 20 6d 61 69 6c 20 20 20 20 4d 41 54 43 48 20 27   mail    MATCH '
3a20: 73 6c 6f 77 27 3b 20 20 20 20 20 20 20 20 3c 69  slow';        <i
3a30: 3e 2d 2d 20 53 65 6c 65 63 74 73 20 72 6f 77 73  >-- Selects rows
3a40: 20 31 20 61 6e 64 20 33 3c 2f 69 3e 0a 7d 5d 0a   1 and 3</i>.}].
3a50: 20 20 0a 3c 70 3e 0a 20 20 41 74 20 66 69 72 73    .<p>.  At firs
3a60: 74 20 67 6c 61 6e 63 65 2c 20 74 68 65 20 66 69  t glance, the fi
3a70: 6e 61 6c 20 74 77 6f 20 66 75 6c 6c 2d 74 65 78  nal two full-tex
3a80: 74 20 71 75 65 72 69 65 73 20 69 6e 20 74 68 65  t queries in the
3a90: 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 20 73   example above s
3aa0: 65 65 6d 0a 20 20 74 6f 20 62 65 20 73 79 6e 74  eem.  to be synt
3ab0: 61 63 74 69 63 6c 79 20 69 6e 63 6f 72 72 65 63  acticly incorrec
3ac0: 74 2c 20 61 73 20 74 68 65 72 65 20 69 73 20 61  t, as there is a
3ad0: 20 74 61 62 6c 65 20 6e 61 6d 65 20 28 22 6d 61   table name ("ma
3ae0: 69 6c 22 29 20 75 73 65 64 20 61 73 0a 20 20 61  il") used as.  a
3af0: 6e 20 53 51 4c 20 65 78 70 72 65 73 73 69 6f 6e  n SQL expression
3b00: 2e 20 54 68 65 20 72 65 61 73 6f 6e 20 74 68 69  . The reason thi
3b10: 73 20 69 73 20 61 63 63 65 70 74 61 62 6c 65 20  s is acceptable 
3b20: 69 73 20 74 68 61 74 20 65 61 63 68 20 46 54 53  is that each FTS
3b30: 33 20 74 61 62 6c 65 0a 20 20 61 63 74 75 61 6c  3 table.  actual
3b40: 6c 79 20 68 61 73 20 61 20 5c 5b 73 71 6c 69 74  ly has a \[sqlit
3b50: 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 7c  e3_declare_vtab|
3b60: 48 49 44 44 45 4e 5c 5d 20 63 6f 6c 75 6d 6e 20  HIDDEN\] column 
3b70: 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
3b80: 6d 65 0a 20 20 61 73 20 74 68 65 20 74 61 62 6c  me.  as the tabl
3b90: 65 20 69 74 73 65 6c 66 20 28 69 6e 20 74 68 69  e itself (in thi
3ba0: 73 20 63 61 73 65 2c 20 22 6d 61 69 6c 22 29 2e  s case, "mail").
3bb0: 20 54 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65   The value store
3bc0: 64 20 69 6e 20 74 68 69 73 0a 20 20 63 6f 6c 75  d in this.  colu
3bd0: 6d 6e 20 69 73 20 6e 6f 74 20 6d 65 61 6e 69 6e  mn is not meanin
3be0: 67 66 75 6c 20 74 6f 20 74 68 65 20 61 70 70 6c  gful to the appl
3bf0: 69 63 61 74 69 6f 6e 2c 20 62 75 74 20 63 61 6e  ication, but can
3c00: 20 62 65 20 75 73 65 64 20 61 73 20 74 68 65 20   be used as the 
3c10: 0a 20 20 6c 65 66 74 2d 68 61 6e 64 20 6f 70 65  .  left-hand ope
3c20: 72 61 6e 64 20 74 6f 20 61 20 4d 41 54 43 48 20  rand to a MATCH 
3c30: 6f 70 65 72 61 74 6f 72 2e 20 54 68 69 73 20 73  operator. This s
3c40: 70 65 63 69 61 6c 20 63 6f 6c 75 6d 6e 20 6d 61  pecial column ma
3c50: 79 20 61 6c 73 6f 20 62 65 0a 20 20 70 61 73 73  y also be.  pass
3c60: 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ed as an argumen
3c70: 74 20 74 6f 20 74 68 65 20 5c 5b 73 6e 69 70 70  t to the \[snipp
3c80: 65 74 28 29 7c 46 54 53 33 20 61 75 78 69 6c 6c  et()|FTS3 auxill
3c90: 61 72 79 20 66 75 6e 63 74 69 6f 6e 73 5c 5d 2e  ary functions\].
3ca0: 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 66 6f 6c 6c  ..<p>.  The foll
3cb0: 6f 77 69 6e 67 20 65 78 61 6d 70 6c 65 20 69 6c  owing example il
3cc0: 6c 75 73 74 72 61 74 65 73 20 74 68 65 20 61 62  lustrates the ab
3cd0: 6f 76 65 2e 20 54 68 65 20 65 78 70 72 65 73 73  ove. The express
3ce0: 69 6f 6e 73 20 22 64 6f 63 73 22 2c 20 0a 20 20  ions "docs", .  
3cf0: 22 64 6f 63 73 2e 64 6f 63 73 22 20 61 6e 64 20  "docs.docs" and 
3d00: 22 6d 61 69 6e 2e 64 6f 63 73 2e 64 6f 63 73 22  "main.docs.docs"
3d10: 20 61 6c 6c 20 72 65 66 65 72 20 74 6f 20 63 6f   all refer to co
3d20: 6c 75 6d 6e 20 22 64 6f 63 73 22 2e 20 48 6f 77  lumn "docs". How
3d30: 65 76 65 72 2c 20 74 68 65 20 0a 20 20 65 78 70  ever, the .  exp
3d40: 72 65 73 73 69 6f 6e 20 22 6d 61 69 6e 2e 64 6f  ression "main.do
3d50: 63 73 22 20 64 6f 65 73 20 6e 6f 74 20 72 65 66  cs" does not ref
3d60: 65 72 20 74 6f 20 61 6e 79 20 63 6f 6c 75 6d 6e  er to any column
3d70: 2e 20 49 74 20 63 6f 75 6c 64 20 62 65 20 75 73  . It could be us
3d80: 65 64 20 74 6f 20 0a 20 20 72 65 66 65 72 20 74  ed to .  refer t
3d90: 6f 20 61 20 74 61 62 6c 65 2c 20 62 75 74 20 61  o a table, but a
3da0: 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e   table name is n
3db0: 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74 68  ot allowed in th
3dc0: 65 20 63 6f 6e 74 65 78 74 20 69 6e 20 77 68 69  e context in whi
3dd0: 63 68 0a 20 20 69 74 20 69 73 20 75 73 65 64 20  ch.  it is used 
3de0: 62 65 6c 6f 77 2e 0a 0a 5b 43 6f 64 65 20 7b 0a  below...[Code {.
3df0: 20 20 3c 69 3e 2d 2d 20 45 78 61 6d 70 6c 65 20    <i>-- Example 
3e00: 73 63 68 65 6d 61 3c 2f 69 3e 0a 20 20 43 52 45  schema</i>.  CRE
3e10: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
3e20: 45 20 64 6f 63 73 20 55 53 49 4e 47 20 66 74 73  E docs USING fts
3e30: 33 28 63 6f 6e 74 65 6e 74 29 3b 0a 0a 20 20 3c  3(content);..  <
3e40: 69 3e 2d 2d 20 45 78 61 6d 70 6c 65 20 71 75 65  i>-- Example que
3e50: 72 69 65 73 3c 2f 69 3e 0a 20 20 53 45 4c 45 43  ries</i>.  SELEC
3e60: 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48  T * FROM docs WH
3e70: 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27  ERE docs MATCH '
3e80: 73 71 6c 69 74 65 27 3b 20 20 20 20 20 20 20 20  sqlite';        
3e90: 20 20 20 20 20 20 3c 69 3e 2d 2d 20 4f 4b 2e 3c        <i>-- OK.<
3ea0: 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  /i>.  SELECT * F
3eb0: 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20 64  ROM docs WHERE d
3ec0: 6f 63 73 2e 64 6f 63 73 20 4d 41 54 43 48 20 27  ocs.docs MATCH '
3ed0: 73 71 6c 69 74 65 27 3b 20 20 20 20 20 20 20 20  sqlite';        
3ee0: 20 3c 69 3e 2d 2d 20 4f 4b 2e 3c 2f 69 3e 0a 20   <i>-- OK.</i>. 
3ef0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64   SELECT * FROM d
3f00: 6f 63 73 20 57 48 45 52 45 20 6d 61 69 6e 2e 64  ocs WHERE main.d
3f10: 6f 63 73 2e 64 6f 63 73 20 4d 41 54 43 48 20 27  ocs.docs MATCH '
3f20: 73 71 6c 69 74 65 27 3b 20 20 20 20 3c 69 3e 2d  sqlite';    <i>-
3f30: 2d 20 4f 4b 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45  - OK.</i>.  SELE
3f40: 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57  CT * FROM docs W
3f50: 48 45 52 45 20 6d 61 69 6e 2e 64 6f 63 73 20 4d  HERE main.docs M
3f60: 41 54 43 48 20 27 73 71 6c 69 74 65 27 3b 20 20  ATCH 'sqlite';  
3f70: 20 20 20 20 20 20 20 3c 69 3e 2d 2d 20 45 72 72         <i>-- Err
3f80: 6f 72 2e 3c 2f 69 3e 0a 7d 5d 0a 20 0a 5b 68 32  or.</i>.}]. .[h2
3f90: 20 22 53 75 6d 6d 61 72 79 22 5d 0a 0a 3c 70 3e   "Summary"]..<p>
3fa0: 0a 20 20 46 72 6f 6d 20 74 68 65 20 75 73 65 72  .  From the user
3fb0: 73 20 70 6f 69 6e 74 20 6f 66 20 76 69 65 77 2c  s point of view,
3fc0: 20 46 54 53 33 20 74 61 62 6c 65 73 20 61 72 65   FTS3 tables are
3fd0: 20 73 69 6d 69 6c 61 72 20 74 6f 20 6f 72 64 69   similar to ordi
3fe0: 6e 61 72 79 20 53 51 4c 69 74 65 0a 20 20 74 61  nary SQLite.  ta
3ff0: 62 6c 65 73 20 69 6e 20 6d 61 6e 79 20 77 61 79  bles in many way
4000: 73 2e 20 44 61 74 61 20 6d 61 79 20 62 65 20 61  s. Data may be a
4010: 64 64 65 64 20 74 6f 2c 20 6d 6f 64 69 66 69 65  dded to, modifie
4020: 64 20 77 69 74 68 69 6e 20 61 6e 64 20 72 65 6d  d within and rem
4030: 6f 76 65 64 20 0a 20 20 66 72 6f 6d 20 46 54 53  oved .  from FTS
4040: 33 20 74 61 62 6c 65 73 20 75 73 69 6e 67 20 74  3 tables using t
4050: 68 65 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54  he INSERT, UPDAT
4060: 45 20 61 6e 64 20 44 45 4c 45 54 45 20 63 6f 6d  E and DELETE com
4070: 6d 61 6e 64 73 20 6a 75 73 74 20 61 73 20 0a 20  mands just as . 
4080: 20 69 74 20 6d 61 79 20 62 65 20 77 69 74 68 20   it may be with 
4090: 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65 73 2e  ordinary tables.
40a0: 20 53 69 6d 69 6c 61 72 6c 79 2c 20 74 68 65 20   Similarly, the 
40b0: 53 45 4c 45 43 54 20 63 6f 6d 6d 61 6e 64 20 6d  SELECT command m
40c0: 61 79 20 62 65 20 75 73 65 64 20 0a 20 20 74 6f  ay be used .  to
40d0: 20 71 75 65 72 79 20 64 61 74 61 2e 20 54 68 65   query data. The
40e0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 69 73 74 20   following list 
40f0: 73 75 6d 6d 61 72 69 7a 65 73 20 74 68 65 20 64  summarizes the d
4100: 69 66 66 65 72 65 6e 63 65 73 20 62 65 74 77 65  ifferences betwe
4110: 65 6e 20 46 54 53 33 0a 20 20 61 6e 64 20 6f 72  en FTS3.  and or
4120: 64 69 6e 61 72 79 20 74 61 62 6c 65 73 3a 0a 0a  dinary tables:..
4130: 3c 6f 6c 3e 0a 20 20 3c 6c 69 3e 3c 70 3e 20 0a  <ol>.  <li><p> .
4140: 20 20 20 20 41 73 20 77 69 74 68 20 61 6c 6c 20      As with all 
4150: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 79  virtual table ty
4160: 70 65 73 2c 20 69 74 20 69 73 20 6e 6f 74 20 70  pes, it is not p
4170: 6f 73 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74  ossible to creat
4180: 65 20 69 6e 64 69 63 65 73 20 6f 72 0a 20 20 20  e indices or.   
4190: 20 74 72 69 67 67 65 72 73 20 61 74 74 61 63 68   triggers attach
41a0: 65 64 20 74 6f 20 46 54 53 33 20 74 61 62 6c 65  ed to FTS3 table
41b0: 73 2e 20 4e 6f 72 20 69 73 20 69 74 20 70 6f 73  s. Nor is it pos
41c0: 73 69 62 6c 65 20 74 6f 20 75 73 65 20 74 68 65  sible to use the
41d0: 20 41 4c 54 45 52 20 54 41 42 4c 45 0a 20 20 20   ALTER TABLE.   
41e0: 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 61 64 64 20   command to add 
41f0: 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20 74 6f  extra columns to
4200: 20 46 54 53 33 20 74 61 62 6c 65 73 20 28 61 6c   FTS3 tables (al
4210: 74 68 6f 75 67 68 20 69 74 20 69 73 20 70 6f 73  though it is pos
4220: 73 69 62 6c 65 20 74 6f 20 75 73 65 0a 20 20 20  sible to use.   
4230: 20 41 4c 54 45 52 20 54 41 42 4c 45 20 74 6f 20   ALTER TABLE to 
4240: 72 65 6e 61 6d 65 20 61 6e 20 46 54 53 33 20 74  rename an FTS3 t
4250: 61 62 6c 65 29 2e 0a 0a 20 20 3c 6c 69 3e 3c 70  able)...  <li><p
4260: 3e 20 0a 20 20 20 20 44 61 74 61 2d 74 79 70 65  > .    Data-type
4270: 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20 70  s specified as p
4280: 61 72 74 20 6f 66 20 74 68 65 20 22 43 52 45 41  art of the "CREA
4290: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
42a0: 22 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20  " statement.    
42b0: 75 73 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  used to create a
42c0: 6e 20 46 54 53 33 20 74 61 62 6c 65 20 61 72 65  n FTS3 table are
42d0: 20 69 67 6e 6f 72 65 64 20 63 6f 6d 70 6c 65 74   ignored complet
42e0: 65 6c 79 2e 20 49 6e 73 74 65 61 64 20 6f 66 20  ely. Instead of 
42f0: 74 68 65 0a 20 20 20 20 6e 6f 72 6d 61 6c 20 72  the.    normal r
4300: 75 6c 65 73 20 66 6f 72 20 61 70 70 6c 79 69 6e  ules for applyin
4310: 67 20 74 79 70 65 20 5c 5b 61 66 66 69 6e 69 74  g type \[affinit
4320: 79 5c 5d 20 74 6f 20 69 6e 73 65 72 74 65 64 20  y\] to inserted 
4330: 76 61 6c 75 65 73 2c 20 61 6c 6c 0a 20 20 20 20  values, all.    
4340: 76 61 6c 75 65 73 20 69 6e 73 65 72 74 65 64 20  values inserted 
4350: 69 6e 74 6f 20 46 54 53 33 20 74 61 62 6c 65 20  into FTS3 table 
4360: 63 6f 6c 75 6d 6e 73 20 28 65 78 63 65 70 74 20  columns (except 
4370: 74 68 65 20 73 70 65 63 69 61 6c 20 72 6f 77 69  the special rowi
4380: 64 0a 20 20 20 20 63 6f 6c 75 6d 6e 29 20 61 72  d.    column) ar
4390: 65 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 74  e converted to t
43a0: 79 70 65 20 54 45 58 54 20 62 65 66 6f 72 65 20  ype TEXT before 
43b0: 62 65 69 6e 67 20 73 74 6f 72 65 64 2e 0a 0a 20  being stored... 
43c0: 20 3c 6c 69 3e 3c 70 3e 20 0a 20 20 20 20 46 54   <li><p> .    FT
43d0: 53 33 20 74 61 62 6c 65 73 20 70 65 72 6d 69 74  S3 tables permit
43e0: 20 74 68 65 20 73 70 65 63 69 61 6c 20 61 6c 69   the special ali
43f0: 61 73 20 22 64 6f 63 69 64 22 20 74 6f 20 62 65  as "docid" to be
4400: 20 75 73 65 64 20 74 6f 20 72 65 66 65 72 20 74   used to refer t
4410: 6f 20 74 68 65 0a 20 20 20 20 72 6f 77 69 64 20  o the.    rowid 
4420: 63 6f 6c 75 6d 6e 20 73 75 70 70 6f 72 74 65 64  column supported
4430: 20 62 79 20 61 6c 6c 20 5c 5b 76 69 72 74 75 61   by all \[virtua
4440: 6c 20 74 61 62 6c 65 73 5c 5d 2e 0a 0a 20 20 3c  l tables\]...  <
4450: 6c 69 3e 3c 70 3e 20 0a 20 20 20 20 54 68 65 20  li><p> .    The 
4460: 5c 5b 46 54 53 33 20 4d 41 54 43 48 5c 5d 20 6f  \[FTS3 MATCH\] o
4470: 70 65 72 61 74 6f 72 20 69 73 20 73 75 70 70 6f  perator is suppo
4480: 72 74 65 64 20 66 6f 72 20 71 75 65 72 69 65 73  rted for queries
4490: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 62 75   based on the bu
44a0: 69 6c 74 2d 69 6e 0a 20 20 20 20 66 75 6c 6c 2d  ilt-in.    full-
44b0: 74 65 78 74 20 69 6e 64 65 78 2e 20 0a 0a 20 20  text index. ..  
44c0: 3c 6c 69 3e 3c 70 3e 20 0a 20 20 20 20 54 68 65  <li><p> .    The
44d0: 20 46 54 53 33 20 61 75 78 69 6c 6c 61 72 79 20   FTS3 auxillary 
44e0: 66 75 6e 63 74 69 6f 6e 73 2c 20 5c 5b 73 6e 69  functions, \[sni
44f0: 70 70 65 74 7c 73 6e 69 70 70 65 74 28 29 20 61  ppet|snippet() a
4500: 6e 64 20 6f 66 66 73 65 74 73 28 29 5c 5d 2c 20  nd offsets()\], 
4510: 61 72 65 20 0a 20 20 20 20 61 76 61 69 6c 61 62  are .    availab
4520: 6c 65 20 74 6f 20 73 75 70 70 6f 72 74 20 66 75  le to support fu
4530: 6c 6c 2d 74 65 78 74 20 71 75 65 72 69 65 73 2e  ll-text queries.
4540: 0a 0a 20 20 3c 6c 69 3e 3c 70 3e 20 0a 20 20 20  ..  <li><p> .   
4550: 20 45 61 63 68 20 46 54 53 33 20 74 61 62 6c 65   Each FTS3 table
4560: 20 68 61 73 20 61 20 5c 5b 73 71 6c 69 74 65 33   has a \[sqlite3
4570: 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28 29 7c  _declare_vtab()|
4580: 48 49 44 44 45 4e 20 63 6f 6c 75 6d 6e 5c 5d 20  HIDDEN column\] 
4590: 77 69 74 68 20 74 68 65 20 0a 20 20 20 20 73 61  with the .    sa
45a0: 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 74  me name as the t
45b0: 61 62 6c 65 20 69 74 73 65 6c 66 2e 20 54 68 65  able itself. The
45c0: 20 76 61 6c 75 65 20 63 6f 6e 74 61 69 6e 65 64   value contained
45d0: 20 69 6e 20 65 61 63 68 20 72 6f 77 20 66 6f 72   in each row for
45e0: 20 74 68 65 0a 20 20 20 20 73 70 65 63 69 61 6c   the.    special
45f0: 20 63 6f 6c 75 6d 6e 20 69 73 20 6f 6e 6c 79 20   column is only 
4600: 75 73 65 66 75 6c 20 77 68 65 6e 20 75 73 65 64  useful when used
4610: 20 6f 6e 20 74 68 65 20 6c 65 66 74 2d 68 61 6e   on the left-han
4620: 64 20 73 69 64 65 20 6f 66 20 61 20 0a 20 20 20  d side of a .   
4630: 20 5c 5b 46 54 53 33 20 4d 41 54 43 48 7c 4d 41   \[FTS3 MATCH|MA
4640: 54 43 48 5c 5d 20 6f 70 65 72 61 74 6f 72 2c 20  TCH\] operator, 
4650: 6f 72 20 77 68 65 6e 20 73 70 65 63 69 66 69 65  or when specifie
4660: 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  d as an argument
4670: 20 74 6f 20 6f 6e 65 20 0a 20 20 20 20 6f 66 20   to one .    of 
4680: 74 68 65 20 5c 5b 73 6e 69 70 70 65 74 7c 46 54  the \[snippet|FT
4690: 53 33 20 61 75 78 69 6c 6c 61 72 79 20 66 75 6e  S3 auxillary fun
46a0: 63 74 69 6f 6e 73 5c 5d 2e 0a 20 20 20 20 0a 0a  ctions\]..    ..
46b0: 3c 2f 6f 6c 3e 0a 0a 0a 5b 68 31 20 22 43 6f 6d  </ol>...[h1 "Com
46c0: 70 69 6c 69 6e 67 20 61 6e 64 20 45 6e 61 62 6c  piling and Enabl
46d0: 69 6e 67 20 46 54 53 33 22 20 7b 7d 20 7b 63 6f  ing FTS3" {} {co
46e0: 6d 70 69 6c 65 20 66 74 73 33 7d 5d 0a 0a 3c 70  mpile fts3}]..<p
46f0: 3e 0a 20 20 41 6c 74 68 6f 75 67 68 20 46 54 53  >.  Although FTS
4700: 33 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64  3 is distributed
4710: 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
4720: 53 51 4c 69 74 65 20 73 6f 75 72 63 65 20 63 6f  SQLite source co
4730: 64 65 2c 20 69 74 20 69 73 20 6e 6f 74 0a 20 20  de, it is not.  
4740: 65 6e 61 62 6c 65 64 20 62 79 20 64 65 66 61 75  enabled by defau
4750: 6c 74 2e 20 54 6f 20 62 75 69 6c 64 20 53 51 4c  lt. To build SQL
4760: 69 74 65 20 77 69 74 68 20 46 54 53 33 20 66 75  ite with FTS3 fu
4770: 6e 63 74 69 6f 6e 61 6c 69 74 79 20 65 6e 61 62  nctionality enab
4780: 6c 65 64 2c 20 64 65 66 69 6e 65 0a 20 20 74 68  led, define.  th
4790: 65 20 70 72 65 70 72 6f 63 65 73 73 6f 72 20 6d  e preprocessor m
47a0: 61 63 72 6f 20 5c 5b 53 51 4c 49 54 45 5f 45 4e  acro \[SQLITE_EN
47b0: 41 42 4c 45 5f 46 54 53 33 5c 5d 20 77 68 65 6e  ABLE_FTS3\] when
47c0: 20 63 6f 6d 70 69 6c 69 6e 67 2e 20 4e 65 77 20   compiling. New 
47d0: 61 70 70 6c 69 63 61 74 69 6f 6e 73 0a 20 20 73  applications.  s
47e0: 68 6f 75 6c 64 20 61 6c 73 6f 20 64 65 66 69 6e  hould also defin
47f0: 65 20 74 68 65 20 5c 5b 53 51 4c 49 54 45 5f 45  e the \[SQLITE_E
4800: 4e 41 42 4c 45 5f 46 54 53 33 5f 50 41 52 45 4e  NABLE_FTS3_PAREN
4810: 54 48 45 53 49 53 5c 5d 20 6d 61 63 72 6f 20 74  THESIS\] macro t
4820: 6f 20 65 6e 61 62 6c 65 20 74 68 65 0a 20 20 5c  o enable the.  \
4830: 5b 65 6e 68 61 6e 63 65 64 20 71 75 65 72 79 20  [enhanced query 
4840: 73 79 6e 74 61 78 5c 5d 20 28 73 65 65 20 62 65  syntax\] (see be
4850: 6c 6f 77 29 2e 20 55 73 75 61 6c 6c 79 2c 20 74  low). Usually, t
4860: 68 69 73 20 69 73 20 64 6f 6e 65 20 62 79 20 61  his is done by a
4870: 64 64 69 6e 67 20 74 68 65 20 0a 20 20 66 6f 6c  dding the .  fol
4880: 6c 6f 77 69 6e 67 20 74 77 6f 20 73 77 69 74 63  lowing two switc
4890: 68 65 73 20 74 6f 20 74 68 65 20 63 6f 6d 70 69  hes to the compi
48a0: 6c 65 72 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  ler command line
48b0: 3a 0a 0a 5b 43 6f 64 65 20 7b 0a 20 20 2d 44 53  :..[Code {.  -DS
48c0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53  QLITE_ENABLE_FTS
48d0: 33 0a 20 20 2d 44 53 51 4c 49 54 45 5f 45 4e 41  3.  -DSQLITE_ENA
48e0: 42 4c 45 5f 46 54 53 33 5f 50 41 52 45 4e 54 48  BLE_FTS3_PARENTH
48f0: 45 53 49 53 0a 7d 5d 0a 0a 3c 70 3e 0a 20 20 49  ESIS.}]..<p>.  I
4900: 66 20 75 73 69 6e 67 20 74 68 65 20 61 6d 61 6c  f using the amal
4910: 67 61 6d 61 74 69 6f 6e 20 61 75 74 6f 63 6f 6e  gamation autocon
4920: 66 20 62 61 73 65 64 20 62 75 69 6c 64 20 73 79  f based build sy
4930: 73 74 65 6d 2c 20 73 65 74 74 69 6e 67 20 74 68  stem, setting th
4940: 65 20 43 50 50 46 4c 41 47 53 0a 20 20 65 6e 76  e CPPFLAGS.  env
4950: 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c  ironment variabl
4960: 65 20 77 68 69 6c 65 20 72 75 6e 6e 69 6e 67 20  e while running 
4970: 74 68 65 20 27 63 6f 6e 66 69 67 75 72 65 27 20  the 'configure' 
4980: 73 63 72 69 70 74 20 69 73 20 61 6e 20 65 61 73  script is an eas
4990: 79 0a 20 20 77 61 79 20 74 6f 20 73 65 74 20 74  y.  way to set t
49a0: 68 65 73 65 20 6d 61 63 72 6f 73 2e 20 46 6f 72  hese macros. For
49b0: 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 66 6f   example, the fo
49c0: 6c 6c 6f 77 69 6e 67 20 63 6f 6d 6d 61 6e 64 3a  llowing command:
49d0: 0a 0a 5b 43 6f 64 65 20 7b 0a 20 20 43 50 50 46  ..[Code {.  CPPF
49e0: 4c 41 47 53 3d 22 2d 44 53 51 4c 49 54 45 5f 45  LAGS="-DSQLITE_E
49f0: 4e 41 42 4c 45 5f 46 54 53 33 20 2d 44 53 51 4c  NABLE_FTS3 -DSQL
4a00: 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 5f  ITE_ENABLE_FTS3_
4a10: 50 41 52 45 4e 54 48 45 53 49 53 22 20 2e 2f 63  PARENTHESIS" ./c
4a20: 6f 6e 66 69 67 75 72 65 20 26 6c 74 3b 63 6f 6e  onfigure &lt;con
4a30: 66 69 67 75 72 65 20 6f 70 74 69 6f 6e 73 26 67  figure options&g
4a40: 74 3b 0a 7d 5d 0a 0a 3c 70 3e 0a 20 20 77 68 65  t;.}]..<p>.  whe
4a50: 72 65 20 3c 69 3e 26 6c 74 3b 63 6f 6e 66 69 67  re <i>&lt;config
4a60: 75 72 65 20 6f 70 74 69 6f 6e 73 26 67 74 3b 3c  ure options&gt;<
4a70: 2f 69 3e 20 61 72 65 20 74 68 6f 73 65 20 6f 70  /i> are those op
4a80: 74 69 6f 6e 73 20 6e 6f 72 6d 61 6c 6c 79 20 70  tions normally p
4a90: 61 73 73 65 64 20 74 6f 0a 20 20 74 68 65 20 63  assed to.  the c
4aa0: 6f 6e 66 69 67 75 72 65 20 73 63 72 69 70 74 2c  onfigure script,
4ab0: 20 69 66 20 61 6e 79 2e 0a 0a 3c 70 3e 0a 20 20   if any...<p>.  
4ac0: 42 65 63 61 75 73 65 20 46 54 53 33 20 69 73 20  Because FTS3 is 
4ad0: 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c  a virtual table,
4ae0: 20 69 74 20 69 73 20 69 6e 63 6f 6d 70 61 74 69   it is incompati
4af0: 62 6c 65 20 77 69 74 68 20 74 68 65 0a 20 20 5c  ble with the.  \
4b00: 5b 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  [SQLITE_OMIT_VIR
4b10: 54 55 41 4c 54 41 42 4c 45 5c 5d 20 6f 70 74 69  TUALTABLE\] opti
4b20: 6f 6e 2e 0a 0a 3c 70 3e 0a 20 20 49 66 20 61 6e  on...<p>.  If an
4b30: 20 53 51 4c 69 74 65 20 62 75 69 6c 64 20 64 6f   SQLite build do
4b40: 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 46  es not include F
4b50: 54 53 33 2c 20 74 68 65 6e 20 61 6e 79 20 61 74  TS3, then any at
4b60: 74 65 6d 70 74 20 74 6f 20 70 72 65 70 61 72 65  tempt to prepare
4b70: 20 61 6e 0a 20 20 53 51 4c 20 73 74 61 74 65 6d   an.  SQL statem
4b80: 65 6e 74 20 74 6f 20 63 72 65 61 74 65 20 61 6e  ent to create an
4b90: 20 46 54 53 33 20 74 61 62 6c 65 20 6f 72 20 74   FTS3 table or t
4ba0: 6f 20 64 72 6f 70 20 6f 72 20 61 63 63 65 73 73  o drop or access
4bb0: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 0a 20 20   an existing .  
4bc0: 46 54 53 33 20 74 61 62 6c 65 20 69 6e 20 61 6e  FTS3 table in an
4bd0: 79 20 77 61 79 20 77 69 6c 6c 20 66 61 69 6c 2e  y way will fail.
4be0: 20 54 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   The error messa
4bf0: 67 65 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c  ge returned will
4c00: 20 62 65 20 73 69 6d 69 6c 61 72 20 0a 20 20 74   be similar .  t
4c10: 6f 20 22 6e 6f 20 73 75 63 68 20 6d 6f 64 75 6c  o "no such modul
4c20: 65 3a 20 66 74 73 33 22 2e 0a 0a 3c 70 3e 0a 20  e: fts3"...<p>. 
4c30: 20 49 66 20 74 68 65 20 43 20 76 65 72 73 69 6f   If the C versio
4c40: 6e 20 6f 66 20 74 68 65 20 3c 61 20 68 72 65 66  n of the <a href
4c50: 3d 68 74 74 70 3a 2f 2f 73 69 74 65 2e 69 63 75  =http://site.icu
4c60: 2d 70 72 6f 6a 65 63 74 2e 6f 72 67 2f 3e 49 43  -project.org/>IC
4c70: 55 20 6c 69 62 72 61 72 79 3c 2f 61 3e 0a 20 20  U library</a>.  
4c80: 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68  is available, th
4c90: 65 6e 20 46 54 53 33 20 6d 61 79 20 61 6c 73 6f  en FTS3 may also
4ca0: 20 62 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   be compiled wit
4cb0: 68 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41  h the SQLITE_ENA
4cc0: 42 4c 45 5f 49 43 55 0a 20 20 70 72 65 2d 70 72  BLE_ICU.  pre-pr
4cd0: 6f 63 65 73 73 6f 72 20 6d 61 63 72 6f 20 64 65  ocessor macro de
4ce0: 66 69 6e 65 64 2e 20 43 6f 6d 70 69 6c 69 6e 67  fined. Compiling
4cf0: 20 77 69 74 68 20 74 68 69 73 20 6d 61 63 72 6f   with this macro
4d00: 20 65 6e 61 62 6c 65 73 20 61 6e 20 46 54 53 33   enables an FTS3
4d10: 0a 20 20 5c 5b 74 6f 6b 65 6e 69 7a 65 72 5c 5d  .  \[tokenizer\]
4d20: 20 74 68 61 74 20 75 73 65 73 20 74 68 65 20 49   that uses the I
4d30: 43 55 20 6c 69 62 72 61 72 79 20 74 6f 20 73 70  CU library to sp
4d40: 6c 69 74 20 61 20 64 6f 63 75 6d 65 6e 74 20 69  lit a document i
4d50: 6e 74 6f 20 74 65 72 6d 73 0a 20 20 28 77 6f 72  nto terms.  (wor
4d60: 64 73 29 20 75 73 69 6e 67 20 74 68 65 20 63 6f  ds) using the co
4d70: 6e 76 65 6e 74 69 6f 6e 73 20 66 6f 72 20 61 20  nventions for a 
4d80: 73 70 65 63 69 66 69 65 64 20 6c 61 6e 67 75 61  specified langua
4d90: 67 65 20 61 6e 64 20 6c 6f 63 61 6c 65 2e 0a 0a  ge and locale...
4da0: 5b 43 6f 64 65 20 7b 0a 20 20 2d 44 53 51 4c 49  [Code {.  -DSQLI
4db0: 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a 7d 5d  TE_ENABLE_ICU.}]
4dc0: 0a 20 20 0a 0a 5b 68 31 20 22 46 75 6c 6c 2d 74  .  ..[h1 "Full-t
4dd0: 65 78 74 20 49 6e 64 65 78 20 51 75 65 72 69 65  ext Index Querie
4de0: 73 22 20 7b 7d 20 7b 46 54 53 33 20 4d 41 54 43  s" {} {FTS3 MATC
4df0: 48 7d 5d 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 6d  H}]..<p>.  The m
4e00: 6f 73 74 20 75 73 65 66 75 6c 20 74 68 69 6e 67  ost useful thing
4e10: 20 61 62 6f 75 74 20 46 54 53 33 20 74 61 62 6c   about FTS3 tabl
4e20: 65 73 20 69 73 20 74 68 65 20 71 75 65 72 69 65  es is the querie
4e30: 73 20 74 68 61 74 20 6d 61 79 20 62 65 20 0a 20  s that may be . 
4e40: 20 70 65 72 66 6f 72 6d 65 64 20 75 73 69 6e 67   performed using
4e50: 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 66 75   the built-in fu
4e60: 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 2e 20 46  ll-text index. F
4e70: 75 6c 6c 2d 74 65 78 74 20 71 75 65 72 69 65 73  ull-text queries
4e80: 20 61 72 65 20 0a 20 20 70 65 72 66 6f 72 6d 65   are .  performe
4e90: 64 20 62 79 20 73 70 65 63 69 66 79 69 6e 67 20  d by specifying 
4ea0: 61 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  a clause of the 
4eb0: 66 6f 72 6d 20 0a 20 20 22 26 6c 74 3b 63 6f 6c  form .  "&lt;col
4ec0: 75 6d 6e 26 67 74 3b 20 4d 41 54 43 48 20 26 6c  umn&gt; MATCH &l
4ed0: 74 3b 66 75 6c 6c 2d 74 65 78 74 20 71 75 65 72  t;full-text quer
4ee0: 79 20 65 78 70 72 65 73 73 69 6f 6e 26 67 74 3b  y expression&gt;
4ef0: 22 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 0a  " to the WHERE .
4f00: 20 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45    clause of a SE
4f10: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
4f20: 68 61 74 20 72 65 61 64 73 20 64 61 74 61 20 66  hat reads data f
4f30: 72 6f 6d 20 61 6e 20 46 54 53 33 20 74 61 62 6c  rom an FTS3 tabl
4f40: 65 2e 20 0a 20 20 5c 5b 73 69 6d 70 6c 65 20 66  e. .  \[simple f
4f50: 74 73 33 20 71 75 65 72 69 65 73 7c 53 69 6d 70  ts3 queries|Simp
4f60: 6c 65 20 46 54 53 33 20 71 75 65 72 69 65 73 5c  le FTS3 queries\
4f70: 5d 20 74 68 61 74 20 72 65 74 75 72 6e 20 61 6c  ] that return al
4f80: 6c 20 64 6f 63 75 6d 65 6e 74 73 20 74 68 61 74  l documents that
4f90: 20 0a 20 20 63 6f 6e 74 61 69 6e 20 61 20 67 69   .  contain a gi
4fa0: 76 65 6e 20 74 65 72 6d 20 61 72 65 20 64 65 73  ven term are des
4fb0: 63 72 69 62 65 64 20 61 62 6f 76 65 2e 20 49 6e  cribed above. In
4fc0: 20 74 68 61 74 20 64 69 73 63 75 73 73 69 6f 6e   that discussion
4fd0: 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 0a   the right-hand.
4fe0: 20 20 6f 70 65 72 61 6e 64 20 6f 66 20 74 68 65    operand of the
4ff0: 20 4d 41 54 43 48 20 6f 70 65 72 61 74 6f 72 20   MATCH operator 
5000: 77 61 73 20 61 73 73 75 6d 65 64 20 74 6f 20 62  was assumed to b
5010: 65 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 73 69  e a string consi
5020: 73 74 69 6e 67 20 6f 66 20 61 0a 20 20 73 69 6e  sting of a.  sin
5030: 67 6c 65 20 74 65 72 6d 2e 20 54 68 69 73 20 73  gle term. This s
5040: 65 63 74 69 6f 6e 20 64 65 73 63 72 69 62 65 73  ection describes
5050: 20 74 68 65 20 6d 6f 72 65 20 63 6f 6d 70 6c 65   the more comple
5060: 78 20 71 75 65 72 79 20 74 79 70 65 73 20 73 75  x query types su
5070: 70 70 6f 72 74 65 64 20 0a 20 20 62 79 20 46 54  pported .  by FT
5080: 53 33 20 74 61 62 6c 65 73 2c 20 61 6e 64 20 68  S3 tables, and h
5090: 6f 77 20 74 68 65 79 20 6d 61 79 20 62 65 20 75  ow they may be u
50a0: 74 69 6c 69 7a 65 64 20 62 79 20 73 70 65 63 69  tilized by speci
50b0: 66 79 69 6e 67 20 61 20 6d 6f 72 65 0a 20 20 63  fying a more.  c
50c0: 6f 6d 70 6c 65 78 20 71 75 65 72 79 20 65 78 70  omplex query exp
50d0: 72 65 73 73 69 6f 6e 20 61 73 20 74 68 65 20 72  ression as the r
50e0: 69 67 68 74 2d 68 61 6e 64 20 6f 70 65 72 61 6e  ight-hand operan
50f0: 64 20 6f 66 20 61 20 4d 41 54 43 48 20 6f 70 65  d of a MATCH ope
5100: 72 61 74 6f 72 2e 0a 0a 3c 70 3e 0a 20 20 46 54  rator...<p>.  FT
5110: 53 33 20 74 61 62 6c 65 73 20 73 75 70 70 6f 72  S3 tables suppor
5120: 74 20 74 68 72 65 65 20 62 61 73 69 63 20 71 75  t three basic qu
5130: 65 72 79 20 74 79 70 65 73 3a 0a 0a 3c 75 6c 3e  ery types:..<ul>
5140: 0a 20 20 3c 6c 69 3e 3c 70 3e 3c 62 3e 54 6f 6b  .  <li><p><b>Tok
5150: 65 6e 20 6f 72 20 74 6f 6b 65 6e 20 70 72 65 66  en or token pref
5160: 69 78 20 71 75 65 72 69 65 73 3c 2f 62 3e 2e 20  ix queries</b>. 
5170: 0a 20 20 20 20 41 6e 20 46 54 53 33 20 74 61 62  .    An FTS3 tab
5180: 6c 65 20 6d 61 79 20 62 65 20 71 75 65 72 69 65  le may be querie
5190: 64 20 66 6f 72 20 61 6c 6c 20 64 6f 63 75 6d 65  d for all docume
51a0: 6e 74 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  nts that contain
51b0: 20 61 20 73 70 65 63 69 66 69 65 64 0a 20 20 20   a specified.   
51c0: 20 74 65 72 6d 20 28 74 68 65 20 5c 5b 73 69 6d   term (the \[sim
51d0: 70 6c 65 20 66 74 73 33 20 71 75 65 72 69 65 73  ple fts3 queries
51e0: 7c 73 69 6d 70 6c 65 20 63 61 73 65 5c 5d 20 64  |simple case\] d
51f0: 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 29 2c  escribed above),
5200: 20 6f 72 20 66 6f 72 0a 20 20 20 20 61 6c 6c 20   or for.    all 
5210: 64 6f 63 75 6d 65 6e 74 73 20 74 68 61 74 20 63  documents that c
5220: 6f 6e 74 61 69 6e 20 61 20 74 65 72 6d 20 77 69  ontain a term wi
5230: 74 68 20 61 20 73 70 65 63 69 66 69 65 64 20 70  th a specified p
5240: 72 65 66 69 78 2e 20 41 73 20 77 65 20 68 61 76  refix. As we hav
5250: 65 0a 20 20 20 20 73 65 65 6e 2c 20 74 68 65 20  e.    seen, the 
5260: 71 75 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e  query expression
5270: 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20   for a specific 
5280: 74 65 72 6d 20 69 73 20 73 69 6d 70 6c 79 20 74  term is simply t
5290: 68 65 20 74 65 72 6d 20 69 74 73 65 6c 66 2e 0a  he term itself..
52a0: 20 20 20 20 54 68 65 20 71 75 65 72 79 20 65 78      The query ex
52b0: 70 72 65 73 73 69 6f 6e 20 75 73 65 64 20 74 6f  pression used to
52c0: 20 73 65 61 72 63 68 20 66 6f 72 20 61 20 74 65   search for a te
52d0: 72 6d 20 70 72 65 66 69 78 20 69 73 20 74 68 65  rm prefix is the
52e0: 20 70 72 65 66 69 78 0a 20 20 20 20 69 74 73 65   prefix.    itse
52f0: 6c 66 20 77 69 74 68 20 61 20 27 2a 27 20 63 68  lf with a '*' ch
5300: 61 72 61 63 74 65 72 20 61 70 70 65 6e 64 65 64  aracter appended
5310: 20 74 6f 20 69 74 2e 20 46 6f 72 20 65 78 61 6d   to it. For exam
5320: 70 6c 65 3a 0a 3c 2f 75 6c 3e 0a 0a 5b 43 6f 64  ple:.</ul>..[Cod
5330: 65 20 7b 0a 20 20 3c 69 3e 2d 2d 20 56 69 72 74  e {.  <i>-- Virt
5340: 75 61 6c 20 74 61 62 6c 65 20 64 65 63 6c 61 72  ual table declar
5350: 61 74 69 6f 6e 3c 2f 69 3e 0a 20 20 43 52 45 41  ation</i>.  CREA
5360: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
5370: 20 64 6f 63 73 20 55 53 49 4e 47 20 66 74 73 33   docs USING fts3
5380: 28 74 69 74 6c 65 2c 20 62 6f 64 79 29 3b 0a 0a  (title, body);..
5390: 20 20 3c 69 3e 2d 2d 20 51 75 65 72 79 20 66 6f    <i>-- Query fo
53a0: 72 20 61 6c 6c 20 64 6f 63 75 6d 65 6e 74 73 20  r all documents 
53b0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74  containing the t
53c0: 65 72 6d 20 22 6c 69 6e 75 78 22 3a 3c 2f 69 3e  erm "linux":</i>
53d0: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
53e0: 20 64 6f 63 73 20 57 48 45 52 45 20 64 6f 63 73   docs WHERE docs
53f0: 20 4d 41 54 43 48 20 27 6c 69 6e 75 78 27 3b 0a   MATCH 'linux';.
5400: 0a 20 20 3c 69 3e 2d 2d 20 51 75 65 72 79 20 66  .  <i>-- Query f
5410: 6f 72 20 61 6c 6c 20 64 6f 63 75 6d 65 6e 74 73  or all documents
5420: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 74 65   containing a te
5430: 72 6d 20 77 69 74 68 20 74 68 65 20 70 72 65 66  rm with the pref
5440: 69 78 20 22 6c 69 6e 22 2e 20 54 68 69 73 20 77  ix "lin". This w
5450: 69 6c 6c 20 6d 61 74 63 68 3c 2f 69 3e 0a 20 20  ill match</i>.  
5460: 3c 69 3e 2d 2d 20 61 6c 6c 20 64 6f 63 75 6d 65  <i>-- all docume
5470: 6e 74 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  nts that contain
5480: 20 22 6c 69 6e 75 78 22 2c 20 62 75 74 20 61 6c   "linux", but al
5490: 73 6f 20 74 68 6f 73 65 20 74 68 61 74 20 63 6f  so those that co
54a0: 6e 74 61 69 6e 20 74 65 72 6d 73 20 22 6c 69 6e  ntain terms "lin
54b0: 65 61 72 22 2c 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  ear",</i>.  <i>-
54c0: 2d 22 6c 69 6e 6b 65 72 22 2c 20 22 6c 69 6e 67  -"linker", "ling
54d0: 75 69 73 74 69 63 22 20 61 6e 64 20 73 6f 20 6f  uistic" and so o
54e0: 6e 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20  n.</i>.  SELECT 
54f0: 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52  * FROM docs WHER
5500: 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27 6c 69  E docs MATCH 'li
5510: 6e 2a 27 3b 0a 7d 5d 0a 0a 3c 75 6c 3e 0a 20 20  n*';.}]..<ul>.  
5520: 3c 6c 69 20 73 74 79 6c 65 3d 22 6c 69 73 74 2d  <li style="list-
5530: 73 74 79 6c 65 3a 6e 6f 6e 65 22 3e 3c 70 3e 0a  style:none"><p>.
5540: 20 20 20 20 4e 6f 72 6d 61 6c 6c 79 2c 20 61 20      Normally, a 
5550: 74 6f 6b 65 6e 20 6f 72 20 74 6f 6b 65 6e 20 70  token or token p
5560: 72 65 66 69 78 20 71 75 65 72 79 20 69 73 20 6d  refix query is m
5570: 61 74 63 68 65 64 20 61 67 61 69 6e 73 74 20 74  atched against t
5580: 68 65 20 46 54 53 33 20 74 61 62 6c 65 20 0a 20  he FTS3 table . 
5590: 20 20 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66     column specif
55a0: 69 65 64 20 61 73 20 74 68 65 20 72 69 67 68 74  ied as the right
55b0: 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68  -hand side of th
55c0: 65 20 4d 41 54 43 48 20 6f 70 65 72 61 74 6f 72  e MATCH operator
55d0: 2e 20 4f 72 2c 20 69 66 20 74 68 65 0a 20 20 20  . Or, if the.   
55e0: 20 73 70 65 63 69 61 6c 20 63 6f 6c 75 6d 6e 20   special column 
55f0: 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
5600: 6d 65 20 61 73 20 74 68 65 20 46 54 53 33 20 74  me as the FTS3 t
5610: 61 62 6c 65 20 69 74 73 65 6c 66 20 69 73 20 73  able itself is s
5620: 70 65 63 69 66 69 65 64 2c 0a 20 20 20 20 61 67  pecified,.    ag
5630: 61 69 6e 73 74 20 61 6c 6c 20 63 6f 6c 75 6d 6e  ainst all column
5640: 73 2e 20 54 68 69 73 20 6d 61 79 20 62 65 20 6f  s. This may be o
5650: 76 65 72 72 69 64 64 65 6e 20 62 79 20 73 70 65  verridden by spe
5660: 63 69 66 79 69 6e 67 20 61 20 63 6f 6c 75 6d 6e  cifying a column
5670: 2d 6e 61 6d 65 0a 20 20 20 20 66 6f 6c 6c 6f 77  -name.    follow
5680: 65 64 20 62 79 20 61 20 22 3a 22 20 63 68 61 72  ed by a ":" char
5690: 61 63 74 65 72 20 62 65 66 6f 72 65 20 61 20 62  acter before a b
56a0: 61 73 69 63 20 74 65 72 6d 20 71 75 65 72 79 2e  asic term query.
56b0: 20 54 68 65 72 65 20 6d 61 79 20 62 65 20 73 70   There may be sp
56c0: 61 63 65 0a 20 20 20 20 62 65 74 77 65 65 6e 20  ace.    between 
56d0: 74 68 65 20 22 3a 22 20 61 6e 64 20 74 68 65 20  the ":" and the 
56e0: 74 65 72 6d 20 74 6f 20 71 75 65 72 79 20 66 6f  term to query fo
56f0: 72 2c 20 62 75 74 20 6e 6f 74 20 62 65 74 77 65  r, but not betwe
5700: 65 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 6e 61  en the column-na
5710: 6d 65 0a 20 20 20 20 61 6e 64 20 74 68 65 20 22  me.    and the "
5720: 3a 22 20 63 68 61 72 61 63 74 65 72 2e 20 46 6f  :" character. Fo
5730: 72 20 65 78 61 6d 70 6c 65 3a 0a 3c 2f 75 6c 3e  r example:.</ul>
5740: 0a 20 20 20 0a 5b 43 6f 64 65 20 7b 0a 20 20 3c  .   .[Code {.  <
5750: 69 3e 2d 2d 20 51 75 65 72 79 20 74 68 65 20 64  i>-- Query the d
5760: 61 74 61 62 61 73 65 20 66 6f 72 20 64 6f 63 75  atabase for docu
5770: 6d 65 6e 74 73 20 66 6f 72 20 77 68 69 63 68 20  ments for which 
5780: 74 68 65 20 74 65 72 6d 20 22 6c 69 6e 75 78 22  the term "linux"
5790: 20 61 70 70 65 61 72 73 20 69 6e 3c 2f 69 3e 0a   appears in</i>.
57a0: 20 20 3c 69 3e 2d 2d 20 74 68 65 20 64 6f 63 75    <i>-- the docu
57b0: 6d 65 6e 74 20 74 69 74 6c 65 2c 20 61 6e 64 20  ment title, and 
57c0: 74 68 65 20 74 65 72 6d 20 22 70 72 6f 62 6c 65  the term "proble
57d0: 6d 73 22 20 61 70 70 65 61 72 73 20 69 6e 20 65  ms" appears in e
57e0: 69 74 68 65 72 20 74 68 65 20 74 69 74 6c 65 3c  ither the title<
57f0: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 6f 72 20 62  /i>.  <i>-- or b
5800: 6f 64 79 20 6f 66 20 74 68 65 20 64 6f 63 75 6d  ody of the docum
5810: 65 6e 74 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43  ent.</i>.  SELEC
5820: 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48  T * FROM docs WH
5830: 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27  ERE docs MATCH '
5840: 74 69 74 6c 65 3a 6c 69 6e 75 78 20 70 72 6f 62  title:linux prob
5850: 6c 65 6d 73 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20  lems';..  <i>-- 
5860: 51 75 65 72 79 20 74 68 65 20 64 61 74 61 62 61  Query the databa
5870: 73 65 20 66 6f 72 20 64 6f 63 75 6d 65 6e 74 73  se for documents
5880: 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 74   for which the t
5890: 65 72 6d 20 22 6c 69 6e 75 78 22 20 61 70 70 65  erm "linux" appe
58a0: 61 72 73 20 69 6e 3c 2f 69 3e 0a 20 20 3c 69 3e  ars in</i>.  <i>
58b0: 2d 2d 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 20  -- the document 
58c0: 74 69 74 6c 65 2c 20 61 6e 64 20 74 68 65 20 74  title, and the t
58d0: 65 72 6d 20 22 64 72 69 76 65 72 22 20 61 70 70  erm "driver" app
58e0: 65 61 72 73 20 69 6e 20 74 68 65 20 62 6f 64 79  ears in the body
58f0: 20 6f 66 20 74 68 65 20 64 6f 63 75 6d 65 6e 74   of the document
5900: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 28 22 64  </i>.  <i>-- ("d
5910: 72 69 76 65 72 22 20 6d 61 79 20 61 6c 73 6f 20  river" may also 
5920: 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 74 69  appear in the ti
5930: 74 6c 65 2c 20 62 75 74 20 74 68 69 73 20 61 6c  tle, but this al
5940: 6f 6e 65 20 77 69 6c 6c 20 6e 6f 74 20 73 61 74  one will not sat
5950: 69 73 66 79 20 74 68 65 3c 2f 69 3e 2e 0a 20 20  isfy the</i>..  
5960: 3c 69 3e 2d 2d 20 71 75 65 72 79 20 63 72 69 74  <i>-- query crit
5970: 65 72 69 61 29 2e 3c 2f 69 3e 0a 20 20 53 45 4c  eria).</i>.  SEL
5980: 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20  ECT * FROM docs 
5990: 57 48 45 52 45 20 62 6f 64 79 20 4d 41 54 43 48  WHERE body MATCH
59a0: 20 27 74 69 74 6c 65 3a 6c 69 6e 75 78 20 64 72   'title:linux dr
59b0: 69 76 65 72 27 3b 0a 7d 5d 0a 0a 3c 75 6c 3e 0a  iver';.}]..<ul>.
59c0: 20 20 3c 6c 69 3e 3c 70 3e 3c 62 3e 50 68 72 61    <li><p><b>Phra
59d0: 73 65 20 71 75 65 72 69 65 73 3c 2f 62 3e 2e 0a  se queries</b>..
59e0: 20 20 20 20 41 20 70 68 72 61 73 65 20 71 75 65      A phrase que
59f0: 72 79 20 69 73 20 61 20 71 75 65 72 79 20 74 68  ry is a query th
5a00: 61 74 20 72 65 74 72 69 65 76 65 73 20 61 6c 6c  at retrieves all
5a10: 20 64 6f 63 75 6d 65 6e 74 73 20 74 68 61 74 20   documents that 
5a20: 63 6f 6e 74 61 69 6e 20 61 0a 20 20 20 20 6e 6f  contain a.    no
5a30: 6d 69 6e 61 74 65 64 20 73 65 74 20 6f 66 20 74  minated set of t
5a40: 65 72 6d 73 20 6f 72 20 74 65 72 6d 20 70 72 65  erms or term pre
5a50: 66 69 78 65 73 20 69 6e 20 61 20 73 70 65 63 69  fixes in a speci
5a60: 66 69 65 64 20 6f 72 64 65 72 20 77 69 74 68 20  fied order with 
5a70: 6e 6f 0a 20 20 20 20 69 6e 74 65 72 76 65 6e 69  no.    interveni
5a80: 6e 67 20 74 6f 6b 65 6e 73 2e 20 50 68 72 61 73  ng tokens. Phras
5a90: 65 20 71 75 65 72 69 65 73 20 61 72 65 20 73 70  e queries are sp
5aa0: 65 63 69 66 69 65 64 20 62 79 20 65 6e 63 6c 6f  ecified by enclo
5ab0: 73 69 6e 67 20 61 20 73 70 61 63 65 0a 20 20 20  sing a space.   
5ac0: 20 73 65 70 61 72 61 74 65 64 20 73 65 71 75 65   separated seque
5ad0: 6e 63 65 20 6f 66 20 74 65 72 6d 73 20 6f 72 20  nce of terms or 
5ae0: 74 65 72 6d 20 70 72 65 66 69 78 65 73 20 69 6e  term prefixes in
5af0: 20 64 6f 75 62 6c 65 20 71 75 6f 74 65 73 20 28   double quotes (
5b00: 22 29 2e 0a 20 20 20 20 46 6f 72 20 65 78 61 6d  ")..    For exam
5b10: 70 6c 65 3a 0a 3c 2f 75 6c 3e 0a 0a 5b 43 6f 64  ple:.</ul>..[Cod
5b20: 65 20 7b 0a 20 20 3c 69 3e 2d 2d 20 51 75 65 72  e {.  <i>-- Quer
5b30: 79 20 66 6f 72 20 61 6c 6c 20 64 6f 63 75 6d 65  y for all docume
5b40: 6e 74 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  nts that contain
5b50: 20 74 68 65 20 70 68 72 61 73 65 20 22 6c 69 6e   the phrase "lin
5b60: 75 78 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 22  ux applications"
5b70: 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a  .</i>.  SELECT *
5b80: 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45   FROM docs WHERE
5b90: 20 64 6f 63 73 20 4d 41 54 43 48 20 27 22 6c 69   docs MATCH '"li
5ba0: 6e 75 78 20 61 70 70 6c 69 63 61 74 69 6f 6e 73  nux applications
5bb0: 22 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 51 75 65  "';..  <i>-- Que
5bc0: 72 79 20 66 6f 72 20 61 6c 6c 20 64 6f 63 75 6d  ry for all docum
5bd0: 65 6e 74 73 20 74 68 61 74 20 63 6f 6e 74 61 69  ents that contai
5be0: 6e 20 61 20 70 68 72 61 73 65 20 74 68 61 74 20  n a phrase that 
5bf0: 6d 61 74 63 68 65 73 20 22 6c 69 6e 2a 20 61 70  matches "lin* ap
5c00: 70 2a 22 2e 20 41 73 20 77 65 6c 6c 20 61 73 3c  p*". As well as<
5c10: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 22 6c 69 6e  /i>.  <i>-- "lin
5c20: 75 78 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 22  ux applications"
5c30: 2c 20 74 68 69 73 20 77 69 6c 6c 20 6d 61 74 63  , this will matc
5c40: 68 20 63 6f 6d 6d 6f 6e 20 70 68 72 61 73 65 73  h common phrases
5c50: 20 73 75 63 68 20 61 73 20 22 6c 69 6e 6f 6c 65   such as "linole
5c60: 75 6d 20 61 70 70 6c 69 61 6e 63 65 73 22 3c 2f  um appliances"</
5c70: 69 3e 0a 20 20 3c 69 3e 2d 2d 20 6f 72 20 22 6c  i>.  <i>-- or "l
5c80: 69 6e 6b 20 61 70 70 72 65 6e 74 69 63 65 22 2e  ink apprentice".
5c90: 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20  </i>.  SELECT * 
5ca0: 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20  FROM docs WHERE 
5cb0: 64 6f 63 73 20 4d 41 54 43 48 20 27 22 6c 69 6e  docs MATCH '"lin
5cc0: 2a 20 61 70 70 2a 22 27 3b 0a 7d 5d 0a 0a 3c 75  * app*"';.}]..<u
5cd0: 6c 3e 0a 20 20 3c 6c 69 3e 3c 70 3e 3c 62 3e 4e  l>.  <li><p><b>N
5ce0: 45 41 52 20 71 75 65 72 69 65 73 3c 2f 62 3e 2e  EAR queries</b>.
5cf0: 20 0a 20 20 20 20 41 20 4e 45 41 52 20 71 75 65   .    A NEAR que
5d00: 72 79 20 69 73 20 61 20 71 75 65 72 79 20 74 68  ry is a query th
5d10: 61 74 20 72 65 74 75 72 6e 73 20 64 6f 63 75 6d  at returns docum
5d20: 65 6e 74 73 20 74 68 61 74 20 63 6f 6e 74 61 69  ents that contai
5d30: 6e 20 61 20 74 77 6f 20 6f 72 0a 20 20 20 20 6d  n a two or.    m
5d40: 6f 72 65 20 6e 6f 6d 69 6e 61 74 65 64 20 74 65  ore nominated te
5d50: 72 6d 73 20 6f 72 20 70 68 72 61 73 65 73 20 77  rms or phrases w
5d60: 69 74 68 69 6e 20 61 20 73 70 65 63 69 66 69 65  ithin a specifie
5d70: 64 20 70 72 6f 78 69 6d 69 74 79 20 6f 66 20 65  d proximity of e
5d80: 61 63 68 20 0a 20 20 20 20 6f 74 68 65 72 20 28  ach .    other (
5d90: 62 79 20 64 65 66 61 75 6c 74 20 77 69 74 68 20  by default with 
5da0: 31 30 20 6f 72 20 6c 65 73 73 20 69 6e 74 65 72  10 or less inter
5db0: 76 65 6e 69 6e 67 20 74 65 72 6d 73 29 2e 20 41  vening terms). A
5dc0: 20 4e 45 41 52 20 71 75 65 72 79 20 69 73 20 0a   NEAR query is .
5dd0: 20 20 20 20 73 70 65 63 69 66 69 65 64 20 62 79      specified by
5de0: 20 70 75 74 74 69 6e 67 20 74 68 65 20 6b 65 79   putting the key
5df0: 77 6f 72 64 20 22 4e 45 41 52 22 20 62 65 74 77  word "NEAR" betw
5e00: 65 65 6e 20 74 77 6f 20 70 68 72 61 73 65 2c 20  een two phrase, 
5e10: 74 65 72 6d 20 6f 72 20 0a 20 20 20 20 74 65 72  term or .    ter
5e20: 6d 20 70 72 65 66 69 78 20 71 75 65 72 69 65 73  m prefix queries
5e30: 2e 20 54 6f 20 73 70 65 63 69 66 79 20 61 20 70  . To specify a p
5e40: 72 6f 78 69 6d 69 74 79 20 6f 74 68 65 72 20 74  roximity other t
5e50: 68 61 6e 20 74 68 65 20 64 65 66 61 75 6c 74 2c  han the default,
5e60: 0a 20 20 20 20 61 6e 20 6f 70 65 72 61 74 6f 72  .    an operator
5e70: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 4e 45   of the form "NE
5e80: 41 52 2f 3c 69 3e 26 6c 74 3b 4e 26 67 74 3b 3c  AR/<i>&lt;N&gt;<
5e90: 2f 69 3e 22 20 6d 61 79 20 62 65 20 75 73 65 64  /i>" may be used
5ea0: 2c 20 77 68 65 72 65 0a 20 20 20 20 3c 69 3e 26  , where.    <i>&
5eb0: 6c 74 3b 4e 26 67 74 3b 3c 2f 69 3e 20 69 73 20  lt;N&gt;</i> is 
5ec0: 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
5ed0: 65 72 20 6f 66 20 69 6e 74 65 72 76 65 6e 69 6e  er of intervenin
5ee0: 67 20 74 65 72 6d 73 20 61 6c 6c 6f 77 65 64 2e  g terms allowed.
5ef0: 0a 20 20 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  .    For example
5f00: 3a 0a 3c 2f 75 6c 3e 0a 0a 5b 43 6f 64 65 20 7b  :.</ul>..[Code {
5f10: 0a 20 20 3c 69 3e 2d 2d 20 56 69 72 74 75 61 6c  .  <i>-- Virtual
5f20: 20 74 61 62 6c 65 20 64 65 63 6c 61 72 61 74 69   table declarati
5f30: 6f 6e 2e 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45  on.</i>.  CREATE
5f40: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 64   VIRTUAL TABLE d
5f50: 6f 63 73 20 55 53 49 4e 47 20 66 74 73 33 28 29  ocs USING fts3()
5f60: 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 56 69 72 74 75  ;..  <i>-- Virtu
5f70: 61 6c 20 74 61 62 6c 65 20 64 61 74 61 2e 3c 2f  al table data.</
5f80: 69 3e 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  i>.  INSERT INTO
5f90: 20 64 6f 63 73 20 56 41 4c 55 45 53 28 27 53 51   docs VALUES('SQ
5fa0: 4c 69 74 65 20 69 73 20 61 6e 20 41 43 49 44 20  Lite is an ACID 
5fb0: 63 6f 6d 70 6c 69 61 6e 74 20 65 6d 62 65 64 64  compliant embedd
5fc0: 65 64 20 72 65 6c 61 74 69 6f 6e 61 6c 20 64 61  ed relational da
5fd0: 74 61 62 61 73 65 20 6d 61 6e 61 67 65 6d 65 6e  tabase managemen
5fe0: 74 20 73 79 73 74 65 6d 27 29 3b 0a 0a 20 20 3c  t system');..  <
5ff0: 69 3e 2d 2d 20 53 65 61 72 63 68 20 66 6f 72 20  i>-- Search for 
6000: 61 20 64 6f 63 75 6d 65 6e 74 20 74 68 61 74 20  a document that 
6010: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 65 72  contains the ter
6020: 6d 73 20 22 73 71 6c 69 74 65 22 20 61 6e 64 20  ms "sqlite" and 
6030: 22 64 61 74 61 62 61 73 65 22 20 77 69 74 68 3c  "database" with<
6040: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 6e 6f 74 20  /i>.  <i>-- not 
6050: 6d 6f 72 65 20 74 68 61 6e 20 31 30 20 69 6e 74  more than 10 int
6060: 65 72 76 65 6e 69 6e 67 20 74 65 72 6d 73 2e 20  ervening terms. 
6070: 54 68 69 73 20 6d 61 74 63 68 65 73 20 74 68 65  This matches the
6080: 20 6f 6e 6c 79 20 64 6f 63 75 6d 65 6e 74 20 69   only document i
6090: 6e 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 61  n</i>.  <i>-- ta
60a0: 62 6c 65 20 64 6f 63 73 20 28 73 69 6e 63 65 20  ble docs (since 
60b0: 74 68 65 72 65 20 61 72 65 20 6f 6e 6c 79 20 73  there are only s
60c0: 69 78 20 74 65 72 6d 73 20 62 65 74 77 65 65 6e  ix terms between
60d0: 20 22 53 51 4c 69 74 65 22 20 61 6e 64 20 22 64   "SQLite" and "d
60e0: 61 74 61 62 61 73 65 22 3c 2f 69 3e 20 0a 20 20  atabase"</i> .  
60f0: 3c 69 3e 2d 2d 20 69 6e 20 74 68 65 20 64 6f 63  <i>-- in the doc
6100: 75 6d 65 6e 74 29 3c 2f 69 3e 2e 0a 20 20 53 45  ument)</i>..  SE
6110: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73  LECT * FROM docs
6120: 20 57 48 45 52 45 20 64 6f 63 73 20 4d 41 54 43   WHERE docs MATC
6130: 48 20 27 73 71 6c 69 74 65 20 4e 45 41 52 20 64  H 'sqlite NEAR d
6140: 61 74 61 62 61 73 65 27 3b 0a 0a 20 20 3c 69 3e  atabase';..  <i>
6150: 2d 2d 20 53 65 61 72 63 68 20 66 6f 72 20 61 20  -- Search for a 
6160: 64 6f 63 75 6d 65 6e 74 20 74 68 61 74 20 63 6f  document that co
6170: 6e 74 61 69 6e 73 20 74 68 65 20 74 65 72 6d 73  ntains the terms
6180: 20 22 73 71 6c 69 74 65 22 20 61 6e 64 20 22 64   "sqlite" and "d
6190: 61 74 61 62 61 73 65 22 20 77 69 74 68 3c 2f 69  atabase" with</i
61a0: 3e 0a 20 20 3c 69 3e 2d 2d 20 6e 6f 74 20 6d 6f  >.  <i>-- not mo
61b0: 72 65 20 74 68 61 6e 20 36 20 69 6e 74 65 72 76  re than 6 interv
61c0: 65 6e 69 6e 67 20 74 65 72 6d 73 2e 20 54 68 69  ening terms. Thi
61d0: 73 20 61 6c 73 6f 20 6d 61 74 63 68 65 73 20 74  s also matches t
61e0: 68 65 20 6f 6e 6c 79 20 64 6f 63 75 6d 65 6e 74  he only document
61f0: 20 69 6e 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20   in</i>.  <i>-- 
6200: 74 61 62 6c 65 20 64 6f 63 73 2e 20 4e 6f 74 65  table docs. Note
6210: 20 74 68 61 74 20 74 68 65 20 6f 72 64 65 72 20   that the order 
6220: 69 6e 20 77 68 69 63 68 20 74 68 65 20 74 65 72  in which the ter
6230: 6d 73 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  ms appear in the
6240: 20 64 6f 63 75 6d 65 6e 74 3c 2f 69 3e 0a 20 20   document</i>.  
6250: 3c 69 3e 2d 2d 20 64 6f 65 73 20 6e 6f 74 20 68  <i>-- does not h
6260: 61 76 65 20 74 6f 20 62 65 20 74 68 65 20 73 61  ave to be the sa
6270: 6d 65 20 61 73 20 74 68 65 20 6f 72 64 65 72 20  me as the order 
6280: 69 6e 20 77 68 69 63 68 20 74 68 65 79 20 61 70  in which they ap
6290: 70 65 61 72 20 69 6e 20 74 68 65 20 71 75 65 72  pear in the quer
62a0: 79 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20  y.</i>.  SELECT 
62b0: 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52  * FROM docs WHER
62c0: 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27 64 61  E docs MATCH 'da
62d0: 74 61 62 61 73 65 20 4e 45 41 52 2f 36 20 73 71  tabase NEAR/6 sq
62e0: 6c 69 74 65 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20  lite';..  <i>-- 
62f0: 53 65 61 72 63 68 20 66 6f 72 20 61 20 64 6f 63  Search for a doc
6300: 75 6d 65 6e 74 20 74 68 61 74 20 63 6f 6e 74 61  ument that conta
6310: 69 6e 73 20 74 68 65 20 74 65 72 6d 73 20 22 73  ins the terms "s
6320: 71 6c 69 74 65 22 20 61 6e 64 20 22 64 61 74 61  qlite" and "data
6330: 62 61 73 65 22 20 77 69 74 68 3c 2f 69 3e 0a 20  base" with</i>. 
6340: 20 3c 69 3e 2d 2d 20 6e 6f 74 20 6d 6f 72 65 20   <i>-- not more 
6350: 74 68 61 6e 20 35 20 69 6e 74 65 72 76 65 6e 69  than 5 interveni
6360: 6e 67 20 74 65 72 6d 73 2e 20 54 68 69 73 20 71  ng terms. This q
6370: 75 65 72 79 20 6d 61 74 63 68 65 73 20 6e 6f 20  uery matches no 
6380: 64 6f 63 75 6d 65 6e 74 73 2e 3c 2f 69 3e 0a 20  documents.</i>. 
6390: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64   SELECT * FROM d
63a0: 6f 63 73 20 57 48 45 52 45 20 64 6f 63 73 20 4d  ocs WHERE docs M
63b0: 41 54 43 48 20 27 64 61 74 61 62 61 73 65 20 4e  ATCH 'database N
63c0: 45 41 52 2f 35 20 73 71 6c 69 74 65 27 3b 0a 0a  EAR/5 sqlite';..
63d0: 20 20 3c 69 3e 2d 2d 20 53 65 61 72 63 68 20 66    <i>-- Search f
63e0: 6f 72 20 61 20 64 6f 63 75 6d 65 6e 74 20 74 68  or a document th
63f0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
6400: 70 68 72 61 73 65 20 22 41 43 49 44 20 63 6f 6d  phrase "ACID com
6410: 70 6c 69 61 6e 74 22 20 61 6e 64 20 74 68 65 20  pliant" and the 
6420: 74 65 72 6d 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  term</i>.  <i>--
6430: 20 22 64 61 74 61 62 61 73 65 22 20 77 69 74 68   "database" with
6440: 20 6e 6f 74 20 6d 6f 72 65 20 74 68 61 6e 20 32   not more than 2
6450: 20 74 65 72 6d 73 20 73 65 70 61 72 61 74 69 6e   terms separatin
6460: 67 20 74 68 65 20 74 77 6f 2e 20 54 68 69 73 20  g the two. This 
6470: 6d 61 74 63 68 65 73 20 74 68 65 3c 2f 69 3e 0a  matches the</i>.
6480: 20 20 3c 69 3e 2d 2d 20 64 6f 63 75 6d 65 6e 74    <i>-- document
6490: 20 73 74 6f 72 65 64 20 69 6e 20 74 61 62 6c 65   stored in table
64a0: 20 64 6f 63 73 2e 3c 2f 69 3e 0a 20 20 53 45 4c   docs.</i>.  SEL
64b0: 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20  ECT * FROM docs 
64c0: 57 48 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48  WHERE docs MATCH
64d0: 20 27 64 61 74 61 62 61 73 65 20 4e 45 41 52 2f   'database NEAR/
64e0: 32 20 22 41 43 49 44 20 63 6f 6d 70 6c 69 61 6e  2 "ACID complian
64f0: 74 22 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 53 65  t"';..  <i>-- Se
6500: 61 72 63 68 20 66 6f 72 20 61 20 64 6f 63 75 6d  arch for a docum
6510: 65 6e 74 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ent that contain
6520: 73 20 74 68 65 20 70 68 72 61 73 65 20 22 41 43  s the phrase "AC
6530: 49 44 20 63 6f 6d 70 6c 69 61 6e 74 22 20 61 6e  ID compliant" an
6540: 64 20 74 68 65 20 74 65 72 6d 3c 2f 69 3e 0a 20  d the term</i>. 
6550: 20 3c 69 3e 2d 2d 20 22 73 71 6c 69 74 65 22 20   <i>-- "sqlite" 
6560: 77 69 74 68 20 6e 6f 74 20 6d 6f 72 65 20 74 68  with not more th
6570: 61 6e 20 32 20 74 65 72 6d 73 20 73 65 70 61 72  an 2 terms separ
6580: 61 74 69 6e 67 20 74 68 65 20 74 77 6f 2e 20 54  ating the two. T
6590: 68 69 73 20 61 6c 73 6f 20 6d 61 74 63 68 65 73  his also matches
65a0: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 68 65  </i>.  <i>-- the
65b0: 20 6f 6e 6c 79 20 64 6f 63 75 6d 65 6e 74 20 73   only document s
65c0: 74 6f 72 65 64 20 69 6e 20 74 61 62 6c 65 20 64  tored in table d
65d0: 6f 63 73 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43  ocs.</i>.  SELEC
65e0: 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48  T * FROM docs WH
65f0: 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27  ERE docs MATCH '
6600: 22 41 43 49 44 20 63 6f 6d 70 6c 69 61 6e 74 22  "ACID compliant"
6610: 20 4e 45 41 52 2f 32 20 73 71 6c 69 74 65 27 3b   NEAR/2 sqlite';
6620: 0a 7d 5d 0a 0a 3c 75 6c 3e 0a 20 20 3c 6c 69 20  .}]..<ul>.  <li 
6630: 73 74 79 6c 65 3d 22 6c 69 73 74 2d 73 74 79 6c  style="list-styl
6640: 65 3a 20 6e 6f 6e 65 22 3e 3c 70 3e 0a 20 20 20  e: none"><p>.   
6650: 20 4d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 4e   More than one N
6660: 45 41 52 20 6f 70 65 72 61 74 6f 72 20 6d 61 79  EAR operator may
6670: 20 61 70 70 65 61 72 20 69 6e 20 61 20 73 69 6e   appear in a sin
6680: 67 6c 65 20 71 75 65 72 79 2e 20 49 6e 20 74 68  gle query. In th
6690: 69 73 20 63 61 73 65 20 65 61 63 68 0a 20 20 20  is case each.   
66a0: 20 70 61 69 72 20 6f 66 20 74 65 72 6d 73 20 6f   pair of terms o
66b0: 72 20 70 68 72 61 73 65 73 20 73 65 70 61 72 61  r phrases separa
66c0: 74 65 64 20 62 79 20 61 20 4e 45 41 52 20 6f 70  ted by a NEAR op
66d0: 65 72 61 74 6f 72 20 6d 75 73 74 20 61 70 70 65  erator must appe
66e0: 61 72 20 77 69 74 68 69 6e 20 74 68 65 0a 20 20  ar within the.  
66f0: 20 20 73 70 65 63 69 66 69 65 64 20 70 72 6f 78    specified prox
6700: 69 6d 69 74 79 20 6f 66 20 65 61 63 68 20 6f 74  imity of each ot
6710: 68 65 72 20 69 6e 20 74 68 65 20 64 6f 63 75 6d  her in the docum
6720: 65 6e 74 2e 20 55 73 69 6e 67 20 74 68 65 20 73  ent. Using the s
6730: 61 6d 65 20 74 61 62 6c 65 20 61 6e 64 0a 20 20  ame table and.  
6740: 20 20 64 61 74 61 20 61 73 20 69 6e 20 74 68 65    data as in the
6750: 20 62 6c 6f 63 6b 20 6f 66 20 65 78 61 6d 70 6c   block of exampl
6760: 65 73 20 61 62 6f 76 65 3a 0a 3c 2f 75 6c 3e 0a  es above:.</ul>.
6770: 0a 5b 43 6f 64 65 20 7b 20 3c 69 3e 2d 2d 20 54  .[Code { <i>-- T
6780: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65  he following que
6790: 72 79 20 73 65 6c 65 63 74 73 20 64 6f 63 75 6d  ry selects docum
67a0: 65 6e 74 73 20 74 68 61 74 20 63 6f 6e 74 61 69  ents that contai
67b0: 6e 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ns an instance o
67c0: 66 20 74 68 65 20 74 65 72 6d 20 3c 2f 69 3e 0a  f the term </i>.
67d0: 20 20 3c 69 3e 2d 2d 20 22 73 71 6c 69 74 65 22    <i>-- "sqlite"
67e0: 20 73 65 70 61 72 61 74 65 64 20 62 79 20 74 77   separated by tw
67f0: 6f 20 6f 72 20 66 65 77 65 72 20 74 65 72 6d 73  o or fewer terms
6800: 20 66 72 6f 6d 20 61 6e 20 69 6e 73 74 61 6e 63   from an instanc
6810: 65 20 6f 66 20 74 68 65 20 74 65 72 6d 20 22 61  e of the term "a
6820: 63 69 64 22 2c 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  cid",</i>.  <i>-
6830: 2d 20 77 68 69 63 68 20 69 73 20 69 6e 20 74 75  - which is in tu
6840: 72 6e 20 73 65 70 61 72 61 74 65 64 20 62 79 20  rn separated by 
6850: 74 77 6f 20 6f 72 20 66 65 77 65 72 20 74 65 72  two or fewer ter
6860: 6d 73 20 66 72 6f 6d 20 61 6e 20 69 6e 73 74 61  ms from an insta
6870: 6e 63 65 20 6f 66 20 74 68 65 20 74 65 72 6d 3c  nce of the term<
6880: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 22 72 65 6c  /i>.  <i>-- "rel
6890: 61 74 69 6f 6e 61 6c 22 2e 20 41 73 20 69 74 20  ational". As it 
68a0: 68 61 70 70 65 6e 73 2c 20 74 68 65 20 6f 6e 6c  happens, the onl
68b0: 79 20 64 6f 63 75 6d 65 6e 74 20 69 6e 20 74 61  y document in ta
68c0: 62 6c 65 20 64 6f 63 73 20 73 61 74 69 73 66 69  ble docs satisfi
68d0: 65 73 20 74 68 69 73 20 63 72 69 74 65 72 69 61  es this criteria
68e0: 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a  .</i>.  SELECT *
68f0: 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45   FROM docs WHERE
6900: 20 64 6f 63 73 20 4d 41 54 43 48 20 27 73 71 6c   docs MATCH 'sql
6910: 69 74 65 20 4e 45 41 52 2f 32 20 61 63 69 64 20  ite NEAR/2 acid 
6920: 4e 45 41 52 2f 32 20 72 65 6c 61 74 69 6f 6e 61  NEAR/2 relationa
6930: 6c 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68 69  l';..  <i>-- Thi
6940: 73 20 71 75 65 72 79 20 6d 61 74 63 68 65 73 20  s query matches 
6950: 6e 6f 20 64 6f 63 75 6d 65 6e 74 73 2e 20 54 68  no documents. Th
6960: 65 72 65 20 69 73 20 61 6e 20 69 6e 73 74 61 6e  ere is an instan
6970: 63 65 20 6f 66 20 74 68 65 20 74 65 72 6d 20 22  ce of the term "
6980: 73 71 6c 69 74 65 22 20 77 69 74 68 3c 2f 69 3e  sqlite" with</i>
6990: 0a 20 20 3c 69 3e 2d 2d 20 73 75 66 66 69 63 69  .  <i>-- suffici
69a0: 65 6e 74 20 70 72 6f 78 69 6d 69 74 79 20 74 6f  ent proximity to
69b0: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
69c0: 22 61 63 69 64 22 20 62 75 74 20 69 74 20 69 73  "acid" but it is
69d0: 20 6e 6f 74 20 73 75 66 66 69 63 69 65 6e 74 6c   not sufficientl
69e0: 79 20 63 6c 6f 73 65 3c 2f 69 3e 0a 20 20 3c 69  y close</i>.  <i
69f0: 3e 2d 2d 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e  >-- to an instan
6a00: 63 65 20 6f 66 20 74 68 65 20 74 65 72 6d 20 22  ce of the term "
6a10: 72 65 6c 61 74 69 6f 6e 61 6c 22 2e 3c 2f 69 3e  relational".</i>
6a20: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
6a30: 20 64 6f 63 73 20 57 48 45 52 45 20 64 6f 63 73   docs WHERE docs
6a40: 20 4d 41 54 43 48 20 27 61 63 69 64 20 4e 45 41   MATCH 'acid NEA
6a50: 52 2f 32 20 73 71 6c 69 74 65 20 4e 45 41 52 2f  R/2 sqlite NEAR/
6a60: 32 20 72 65 6c 61 74 69 6f 6e 61 6c 27 3b 0a 7d  2 relational';.}
6a70: 5d 0a 0a 3c 70 3e 0a 20 20 50 68 72 61 73 65 20  ]..<p>.  Phrase 
6a80: 61 6e 64 20 4e 45 41 52 20 71 75 65 72 69 65 73  and NEAR queries
6a90: 20 6d 61 79 20 6e 6f 74 20 73 70 61 6e 20 6d 75   may not span mu
6aa0: 6c 74 69 70 6c 65 20 63 6f 6c 75 6d 6e 73 20 77  ltiple columns w
6ab0: 69 74 68 69 6e 20 61 20 72 6f 77 2e 0a 0a 3c 70  ithin a row...<p
6ac0: 3e 0a 20 20 54 68 65 20 74 68 72 65 65 20 62 61  >.  The three ba
6ad0: 73 69 63 20 71 75 65 72 79 20 74 79 70 65 73 20  sic query types 
6ae0: 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 20  described above 
6af0: 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f 20 71  may be used to q
6b00: 75 65 72 79 20 74 68 65 20 66 75 6c 6c 2d 74 65  uery the full-te
6b10: 78 74 0a 20 20 69 6e 64 65 78 20 66 6f 72 20 74  xt.  index for t
6b20: 68 65 20 73 65 74 20 6f 66 20 64 6f 63 75 6d 65  he set of docume
6b30: 6e 74 73 20 74 68 61 74 20 6d 61 74 63 68 20 74  nts that match t
6b40: 68 65 20 73 70 65 63 69 66 69 65 64 20 63 72 69  he specified cri
6b50: 74 65 72 69 61 2e 20 55 73 69 6e 67 20 74 68 65  teria. Using the
6b60: 0a 20 20 46 54 53 33 20 71 75 65 72 79 20 65 78  .  FTS3 query ex
6b70: 70 72 65 73 73 69 6f 6e 20 6c 61 6e 67 75 61 67  pression languag
6b80: 65 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  e it is possible
6b90: 20 74 6f 20 70 65 72 66 6f 72 6d 20 76 61 72 69   to perform vari
6ba0: 6f 75 73 20 73 65 74 20 0a 20 20 6f 70 65 72 61  ous set .  opera
6bb0: 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 72 65 73  tions on the res
6bc0: 75 6c 74 73 20 6f 66 20 62 61 73 69 63 20 71 75  ults of basic qu
6bd0: 65 72 69 65 73 2e 20 54 68 65 72 65 20 61 72 65  eries. There are
6be0: 20 63 75 72 72 65 6e 74 6c 79 20 74 68 72 65 65   currently three
6bf0: 20 0a 20 20 73 75 70 70 6f 72 74 65 64 20 6f 70   .  supported op
6c00: 65 72 61 74 69 6f 6e 73 3a 0a 0a 3c 75 6c 3e 0a  erations:..<ul>.
6c10: 20 20 3c 6c 69 3e 20 54 68 65 20 41 4e 44 20 6f    <li> The AND o
6c20: 70 65 72 61 74 6f 72 20 64 65 74 65 72 6d 69 6e  perator determin
6c30: 65 73 20 74 68 65 20 3c 62 3e 69 6e 74 65 72 73  es the <b>inters
6c40: 65 63 74 69 6f 6e 3c 2f 62 3e 20 6f 66 20 74 77  ection</b> of tw
6c50: 6f 20 73 65 74 73 20 6f 66 20 64 6f 63 75 6d 65  o sets of docume
6c60: 6e 74 73 2e 0a 0a 20 20 3c 6c 69 3e 20 54 68 65  nts...  <li> The
6c70: 20 4f 52 20 6f 70 65 72 61 74 6f 72 20 63 61 6c   OR operator cal
6c80: 63 75 6c 61 74 65 73 20 74 68 65 20 3c 62 3e 75  culates the <b>u
6c90: 6e 69 6f 6e 3c 2f 62 3e 20 6f 66 20 74 77 6f 20  nion</b> of two 
6ca0: 73 65 74 73 20 6f 66 20 64 6f 63 75 6d 65 6e 74  sets of document
6cb0: 73 2e 0a 0a 20 20 3c 6c 69 3e 20 54 68 65 20 4e  s...  <li> The N
6cc0: 4f 54 20 6f 70 65 72 61 74 6f 72 20 28 6f 72 2c  OT operator (or,
6cd0: 20 69 66 20 75 73 69 6e 67 20 74 68 65 20 73 74   if using the st
6ce0: 61 6e 64 61 72 64 20 73 79 6e 74 61 78 2c 20 61  andard syntax, a
6cf0: 20 75 6e 61 72 79 20 22 2d 22 20 6f 70 65 72 61   unary "-" opera
6d00: 74 6f 72 29 0a 20 20 20 20 20 20 20 6d 61 79 20  tor).       may 
6d10: 62 65 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75  be used to compu
6d20: 74 65 20 74 68 65 20 3c 62 3e 72 65 6c 61 74 69  te the <b>relati
6d30: 76 65 20 63 6f 6d 70 6c 65 6d 65 6e 74 3c 2f 62  ve complement</b
6d40: 3e 20 6f 66 20 6f 6e 65 20 73 65 74 20 6f 66 0a  > of one set of.
6d50: 20 20 20 20 20 20 20 64 6f 63 75 6d 65 6e 74 73         documents
6d60: 20 77 69 74 68 20 72 65 73 70 65 63 74 20 74 6f   with respect to
6d70: 20 61 6e 6f 74 68 65 72 2e 0a 3c 2f 75 6c 3e 0a   another..</ul>.
6d80: 0a 3c 70 3e 0a 20 20 54 68 65 20 46 54 53 33 20  .<p>.  The FTS3 
6d90: 6d 6f 64 75 6c 65 20 6d 61 79 20 62 65 20 63 6f  module may be co
6da0: 6d 70 69 6c 65 64 20 74 6f 20 75 73 65 20 6f 6e  mpiled to use on
6db0: 65 20 6f 66 20 74 77 6f 20 73 6c 69 67 68 74 6c  e of two slightl
6dc0: 79 20 64 69 66 66 65 72 65 6e 74 20 76 65 72 73  y different vers
6dd0: 69 6f 6e 73 0a 20 20 6f 66 20 74 68 65 20 66 75  ions.  of the fu
6de0: 6c 6c 2d 74 65 78 74 20 71 75 65 72 79 20 73 79  ll-text query sy
6df0: 6e 74 61 78 2c 20 74 68 65 20 22 73 74 61 6e 64  ntax, the "stand
6e00: 61 72 64 22 20 71 75 65 72 79 20 73 79 6e 74 61  ard" query synta
6e10: 78 20 61 6e 64 20 74 68 65 20 22 65 6e 68 61 6e  x and the "enhan
6e20: 63 65 64 22 20 0a 20 20 71 75 65 72 79 20 73 79  ced" .  query sy
6e30: 6e 74 61 78 2e 20 54 68 65 20 62 61 73 69 63 20  ntax. The basic 
6e40: 74 65 72 6d 2c 20 74 65 72 6d 2d 70 72 65 66 69  term, term-prefi
6e50: 78 2c 20 70 68 72 61 73 65 20 61 6e 64 20 4e 45  x, phrase and NE
6e60: 41 52 20 71 75 65 72 69 65 73 20 64 65 73 63 72  AR queries descr
6e70: 69 62 65 64 20 0a 20 20 61 62 6f 76 65 20 61 72  ibed .  above ar
6e80: 65 20 74 68 65 20 73 61 6d 65 20 69 6e 20 62 6f  e the same in bo
6e90: 74 68 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  th versions of t
6ea0: 68 65 20 73 79 6e 74 61 78 2e 20 54 68 65 20 77  he syntax. The w
6eb0: 61 79 20 69 6e 20 77 68 69 63 68 20 73 65 74 20  ay in which set 
6ec0: 0a 20 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72  .  operations ar
6ed0: 65 20 73 70 65 63 69 66 69 65 64 20 69 73 20 73  e specified is s
6ee0: 6c 69 67 68 74 6c 79 20 64 69 66 66 65 72 65 6e  lightly differen
6ef0: 74 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  t. The following
6f00: 20 74 77 6f 20 73 75 62 2d 73 65 63 74 69 6f 6e   two sub-section
6f10: 73 20 0a 20 20 64 65 73 63 72 69 62 65 20 74 68  s .  describe th
6f20: 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 74 77  e part of the tw
6f30: 6f 20 71 75 65 72 79 20 73 79 6e 74 61 78 65 73  o query syntaxes
6f40: 20 74 68 61 74 20 70 65 72 74 61 69 6e 73 20 74   that pertains t
6f50: 6f 20 73 65 74 20 6f 70 65 72 61 74 69 6f 6e 73  o set operations
6f60: 2e 20 0a 20 20 52 65 66 65 72 20 74 6f 20 74 68  . .  Refer to th
6f70: 65 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  e description of
6f80: 20 68 6f 77 20 74 6f 20 5c 5b 63 6f 6d 70 69 6c   how to \[compil
6f90: 65 20 66 74 73 33 5c 5d 20 66 6f 72 20 63 6f 6d  e fts3\] for com
6fa0: 70 69 6c 61 74 69 6f 6e 20 6e 6f 74 65 73 2e 0a  pilation notes..
6fb0: 0a 5b 68 32 20 22 53 65 74 20 4f 70 65 72 61 74  .[h2 "Set Operat
6fc0: 69 6f 6e 73 20 55 73 69 6e 67 20 54 68 65 20 45  ions Using The E
6fd0: 6e 68 61 6e 63 65 64 20 51 75 65 72 79 20 53 79  nhanced Query Sy
6fe0: 6e 74 61 78 22 20 7b 7d 20 7b 65 6e 68 61 6e 63  ntax" {} {enhanc
6ff0: 65 64 20 71 75 65 72 79 20 73 79 6e 74 61 78 7d  ed query syntax}
7000: 5d 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 65 6e 68  ]..<p>.  The enh
7010: 61 6e 63 65 64 20 71 75 65 72 79 20 73 79 6e 74  anced query synt
7020: 61 78 20 73 75 70 70 6f 72 74 73 20 74 68 65 20  ax supports the 
7030: 41 4e 44 2c 20 4f 52 20 61 6e 64 20 4e 4f 54 20  AND, OR and NOT 
7040: 62 69 6e 61 72 79 20 73 65 74 20 6f 70 65 72 61  binary set opera
7050: 74 6f 72 73 2e 0a 20 20 45 61 63 68 20 6f 66 20  tors..  Each of 
7060: 74 68 65 20 74 77 6f 20 6f 70 65 72 61 6e 64 73  the two operands
7070: 20 74 6f 20 61 6e 20 6f 70 65 72 61 74 6f 72 20   to an operator 
7080: 6d 61 79 20 62 65 20 61 20 62 61 73 69 63 20 46  may be a basic F
7090: 54 53 33 20 71 75 65 72 79 2c 20 6f 72 20 74 68  TS3 query, or th
70a0: 65 0a 20 20 72 65 73 75 6c 74 20 6f 66 20 61 6e  e.  result of an
70b0: 6f 74 68 65 72 20 41 4e 44 2c 20 4f 52 20 6f 72  other AND, OR or
70c0: 20 4e 4f 54 20 73 65 74 20 6f 70 65 72 61 74 69   NOT set operati
70d0: 6f 6e 2e 20 4f 70 65 72 61 74 6f 72 73 20 6d 75  on. Operators mu
70e0: 73 74 20 62 65 20 65 6e 74 65 72 65 64 0a 20 20  st be entered.  
70f0: 75 73 69 6e 67 20 63 61 70 69 74 61 6c 20 6c 65  using capital le
7100: 74 74 65 72 73 2e 20 4f 74 68 65 72 77 69 73 65  tters. Otherwise
7110: 2c 20 74 68 65 79 20 61 72 65 20 69 6e 74 65 72  , they are inter
7120: 70 72 65 74 65 64 20 61 73 20 62 61 73 69 63 20  preted as basic 
7130: 74 65 72 6d 20 71 75 65 72 69 65 73 0a 20 20 69  term queries.  i
7140: 6e 73 74 65 61 64 20 6f 66 20 73 65 74 20 6f 70  nstead of set op
7150: 65 72 61 74 6f 72 73 2e 0a 0a 3c 70 3e 0a 20 20  erators...<p>.  
7160: 54 68 65 20 41 4e 44 20 6f 70 65 72 61 74 6f 72  The AND operator
7170: 20 6d 61 79 20 62 65 20 69 6d 70 6c 69 63 69 74   may be implicit
7180: 6c 79 20 73 70 65 63 69 66 69 65 64 2e 20 49 66  ly specified. If
7190: 20 74 77 6f 20 62 61 73 69 63 20 71 75 65 72 69   two basic queri
71a0: 65 73 20 61 70 70 65 61 72 20 0a 20 20 77 69 74  es appear .  wit
71b0: 68 20 6e 6f 20 6f 70 65 72 61 74 6f 72 20 73 65  h no operator se
71c0: 70 61 72 61 74 69 6e 67 20 74 68 65 6d 20 69 6e  parating them in
71d0: 20 61 6e 20 46 54 53 33 20 71 75 65 72 79 20 73   an FTS3 query s
71e0: 74 72 69 6e 67 2c 20 74 68 65 20 72 65 73 75 6c  tring, the resul
71f0: 74 73 20 61 72 65 0a 20 20 74 68 65 20 73 61 6d  ts are.  the sam
7200: 65 20 61 73 20 69 66 20 74 68 65 20 74 77 6f 20  e as if the two 
7210: 62 61 73 69 63 20 71 75 65 72 69 65 73 20 77 65  basic queries we
7220: 72 65 20 73 65 70 61 72 61 74 65 64 20 62 79 20  re separated by 
7230: 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e  an AND operator.
7240: 0a 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  .  For example, 
7250: 74 68 65 20 71 75 65 72 79 20 65 78 70 72 65 73  the query expres
7260: 73 69 6f 6e 20 22 69 6d 70 6c 69 63 69 74 20 6f  sion "implicit o
7270: 70 65 72 61 74 6f 72 22 20 69 73 20 61 20 6d 6f  perator" is a mo
7280: 72 65 20 73 75 63 63 69 6e 63 74 0a 20 20 76 65  re succinct.  ve
7290: 72 73 69 6f 6e 20 6f 66 20 22 69 6d 70 6c 69 63  rsion of "implic
72a0: 69 74 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 22  it AND operator"
72b0: 2e 0a 0a 5b 43 6f 64 65 20 7b 0a 20 20 3c 69 3e  ...[Code {.  <i>
72c0: 2d 2d 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65  -- Virtual table
72d0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 3c 2f 69 3e   declaration</i>
72e0: 0a 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41  .  CREATE VIRTUA
72f0: 4c 20 54 41 42 4c 45 20 64 6f 63 73 20 55 53 49  L TABLE docs USI
7300: 4e 47 20 66 74 73 33 28 29 3b 0a 0a 20 20 3c 69  NG fts3();..  <i
7310: 3e 2d 2d 20 56 69 72 74 75 61 6c 20 74 61 62 6c  >-- Virtual tabl
7320: 65 20 64 61 74 61 3c 2f 69 3e 0a 20 20 49 4e 53  e data</i>.  INS
7330: 45 52 54 20 49 4e 54 4f 20 64 6f 63 73 28 64 6f  ERT INTO docs(do
7340: 63 69 64 2c 20 63 6f 6e 74 65 6e 74 29 20 56 41  cid, content) VA
7350: 4c 55 45 53 28 31 2c 20 27 61 20 64 61 74 61 62  LUES(1, 'a datab
7360: 61 73 65 20 69 73 20 61 20 73 6f 66 74 77 61 72  ase is a softwar
7370: 65 20 73 79 73 74 65 6d 27 29 3b 0a 20 20 49 4e  e system');.  IN
7380: 53 45 52 54 20 49 4e 54 4f 20 64 6f 63 73 28 64  SERT INTO docs(d
7390: 6f 63 69 64 2c 20 63 6f 6e 74 65 6e 74 29 20 56  ocid, content) V
73a0: 41 4c 55 45 53 28 32 2c 20 27 73 71 6c 69 74 65  ALUES(2, 'sqlite
73b0: 20 69 73 20 61 20 73 6f 66 74 77 61 72 65 20 73   is a software s
73c0: 79 73 74 65 6d 27 29 3b 0a 20 20 49 4e 53 45 52  ystem');.  INSER
73d0: 54 20 49 4e 54 4f 20 64 6f 63 73 28 64 6f 63 69  T INTO docs(doci
73e0: 64 2c 20 63 6f 6e 74 65 6e 74 29 20 56 41 4c 55  d, content) VALU
73f0: 45 53 28 33 2c 20 27 73 71 6c 69 74 65 20 69 73  ES(3, 'sqlite is
7400: 20 61 20 64 61 74 61 62 61 73 65 27 29 3b 0a 0a   a database');..
7410: 20 20 3c 69 3e 2d 2d 20 52 65 74 75 72 6e 20 74    <i>-- Return t
7420: 68 65 20 73 65 74 20 6f 66 20 64 6f 63 75 6d 65  he set of docume
7430: 6e 74 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  nts that contain
7440: 20 74 68 65 20 74 65 72 6d 20 22 73 71 6c 69 74   the term "sqlit
7450: 65 22 2c 20 61 6e 64 20 74 68 65 3c 2f 69 3e 0a  e", and the</i>.
7460: 20 20 3c 69 3e 2d 2d 20 74 65 72 6d 20 22 64 61    <i>-- term "da
7470: 74 61 62 61 73 65 22 2e 20 54 68 69 73 20 71 75  tabase". This qu
7480: 65 72 79 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  ery will return 
7490: 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 77 69 74  the document wit
74a0: 68 20 64 6f 63 69 64 20 33 20 6f 6e 6c 79 2e 3c  h docid 3 only.<
74b0: 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  /i>.  SELECT * F
74c0: 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20 64  ROM docs WHERE d
74d0: 6f 63 73 20 4d 41 54 43 48 20 27 73 71 6c 69 74  ocs MATCH 'sqlit
74e0: 65 20 41 4e 44 20 64 61 74 61 62 61 73 65 27 3b  e AND database';
74f0: 0a 0a 20 20 3c 69 3e 2d 2d 20 41 67 61 69 6e 2c  ..  <i>-- Again,
7500: 20 72 65 74 75 72 6e 20 74 68 65 20 73 65 74 20   return the set 
7510: 6f 66 20 64 6f 63 75 6d 65 6e 74 73 20 74 68 61  of documents tha
7520: 74 20 63 6f 6e 74 61 69 6e 20 62 6f 74 68 20 22  t contain both "
7530: 73 71 6c 69 74 65 22 20 61 6e 64 3c 2f 69 3e 0a  sqlite" and</i>.
7540: 20 20 3c 69 3e 2d 2d 20 22 64 61 74 61 62 61 73    <i>-- "databas
7550: 65 22 2e 20 54 68 69 73 20 74 69 6d 65 2c 20 75  e". This time, u
7560: 73 65 20 61 6e 20 69 6d 70 6c 69 63 69 74 20 41  se an implicit A
7570: 4e 44 20 6f 70 65 72 61 74 6f 72 2e 20 41 67 61  ND operator. Aga
7580: 69 6e 2c 20 64 6f 63 75 6d 65 6e 74 3c 2f 69 3e  in, document</i>
7590: 0a 20 20 3c 69 3e 2d 2d 20 33 20 69 73 20 74 68  .  <i>-- 3 is th
75a0: 65 20 6f 6e 6c 79 20 64 6f 63 75 6d 65 6e 74 20  e only document 
75b0: 6d 61 74 63 68 65 64 20 62 79 20 74 68 69 73 20  matched by this 
75c0: 71 75 65 72 79 2e 20 3c 2f 69 3e 0a 20 20 53 45  query. </i>.  SE
75d0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73  LECT * FROM docs
75e0: 20 57 48 45 52 45 20 64 6f 63 73 20 4d 41 54 43   WHERE docs MATC
75f0: 48 20 27 64 61 74 61 62 61 73 65 20 73 71 6c 69  H 'database sqli
7600: 74 65 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 51 75  te';..  <i>-- Qu
7610: 65 72 79 20 66 6f 72 20 74 68 65 20 73 65 74 20  ery for the set 
7620: 6f 66 20 64 6f 63 75 6d 65 6e 74 73 20 74 68 61  of documents tha
7630: 74 20 63 6f 6e 74 61 69 6e 73 20 65 69 74 68 65  t contains eithe
7640: 72 20 22 73 71 6c 69 74 65 22 20 6f 72 20 22 64  r "sqlite" or "d
7650: 61 74 61 62 61 73 65 22 2e 3c 2f 69 3e 0a 20 20  atabase".</i>.  
7660: 3c 69 3e 2d 2d 20 41 6c 6c 20 74 68 72 65 65 20  <i>-- All three 
7670: 64 6f 63 75 6d 65 6e 74 73 20 69 6e 20 74 68 65  documents in the
7680: 20 64 61 74 61 62 61 73 65 20 61 72 65 20 6d 61   database are ma
7690: 74 63 68 65 64 20 62 79 20 74 68 69 73 20 71 75  tched by this qu
76a0: 65 72 79 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43  ery.</i>.  SELEC
76b0: 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48  T * FROM docs WH
76c0: 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27  ERE docs MATCH '
76d0: 73 71 6c 69 74 65 20 4f 52 20 64 61 74 61 62 61  sqlite OR databa
76e0: 73 65 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 51 75  se';..  <i>-- Qu
76f0: 65 72 79 20 66 6f 72 20 61 6c 6c 20 64 6f 63 75  ery for all docu
7700: 6d 65 6e 74 73 20 74 68 61 74 20 63 6f 6e 74 61  ments that conta
7710: 69 6e 20 74 68 65 20 74 65 72 6d 20 22 64 61 74  in the term "dat
7720: 61 62 61 73 65 22 2c 20 62 75 74 20 64 6f 20 6e  abase", but do n
7730: 6f 74 20 63 6f 6e 74 61 69 6e 3c 2f 69 3e 0a 20  ot contain</i>. 
7740: 20 3c 69 3e 2d 2d 20 74 68 65 20 74 65 72 6d 20   <i>-- the term 
7750: 22 73 71 6c 69 74 65 22 2e 20 44 6f 63 75 6d 65  "sqlite". Docume
7760: 6e 74 20 31 20 69 73 20 74 68 65 20 6f 6e 6c 79  nt 1 is the only
7770: 20 64 6f 63 75 6d 65 6e 74 20 74 68 61 74 20 6d   document that m
7780: 61 74 63 68 65 73 20 74 68 69 73 20 63 72 69 74  atches this crit
7790: 65 72 69 61 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45  eria.</i>.  SELE
77a0: 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57  CT * FROM docs W
77b0: 48 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20  HERE docs MATCH 
77c0: 27 64 61 74 61 62 61 73 65 20 4e 4f 54 20 73 71  'database NOT sq
77d0: 6c 69 74 65 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20  lite';..  <i>-- 
77e0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75  The following qu
77f0: 65 72 79 20 6d 61 74 63 68 65 73 20 6e 6f 20 64  ery matches no d
7800: 6f 63 75 6d 65 6e 74 73 2e 20 42 65 63 61 75 73  ocuments. Becaus
7810: 65 20 22 61 6e 64 22 20 69 73 20 69 6e 20 6c 6f  e "and" is in lo
7820: 77 65 72 63 61 73 65 20 6c 65 74 74 65 72 73 2c  wercase letters,
7830: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 69 74 20  </i>.  <i>-- it 
7840: 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
7850: 73 20 61 20 62 61 73 69 63 20 74 65 72 6d 20 71  s a basic term q
7860: 75 65 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20  uery instead of 
7870: 61 6e 20 6f 70 65 72 61 74 6f 72 2e 20 4f 70 65  an operator. Ope
7880: 72 61 74 6f 72 73 20 6d 75 73 74 3c 2f 69 3e 0a  rators must</i>.
7890: 20 20 3c 69 3e 2d 2d 20 62 65 20 73 70 65 63 69    <i>-- be speci
78a0: 66 69 65 64 20 75 73 69 6e 67 20 63 61 70 69 74  fied using capit
78b0: 61 6c 20 6c 65 74 74 65 72 73 2e 20 49 6e 20 70  al letters. In p
78c0: 72 61 63 74 69 63 65 2c 20 74 68 69 73 20 71 75  ractice, this qu
78d0: 65 72 79 20 77 69 6c 6c 20 6d 61 74 63 68 20 61  ery will match a
78e0: 6e 79 20 64 6f 63 75 6d 65 6e 74 73 3c 2f 69 3e  ny documents</i>
78f0: 0a 20 20 3c 69 3e 2d 2d 20 74 68 61 74 20 63 6f  .  <i>-- that co
7900: 6e 74 61 69 6e 20 65 61 63 68 20 6f 66 20 74 68  ntain each of th
7910: 65 20 74 68 72 65 65 20 74 65 72 6d 73 20 22 64  e three terms "d
7920: 61 74 61 62 61 73 65 22 2c 20 22 61 6e 64 22 20  atabase", "and" 
7930: 61 6e 64 20 22 73 71 6c 69 74 65 22 20 61 74 20  and "sqlite" at 
7940: 6c 65 61 73 74 20 6f 6e 63 65 2e 3c 2f 69 3e 0a  least once.</i>.
7950: 20 20 3c 69 3e 2d 2d 20 4e 6f 20 64 6f 63 75 6d    <i>-- No docum
7960: 65 6e 74 73 20 69 6e 20 74 68 65 20 65 78 61 6d  ents in the exam
7970: 70 6c 65 20 64 61 74 61 20 61 62 6f 76 65 20 6d  ple data above m
7980: 61 74 63 68 20 74 68 69 73 20 63 72 69 74 65 72  atch this criter
7990: 69 61 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54  ia.</i>.  SELECT
79a0: 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45   * FROM docs WHE
79b0: 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27 64  RE docs MATCH 'd
79c0: 61 74 61 62 61 73 65 20 61 6e 64 20 73 71 6c 69  atabase and sqli
79d0: 74 65 27 3b 0a 7d 5d 0a 0a 3c 70 3e 0a 20 20 54  te';.}]..<p>.  T
79e0: 68 65 20 65 78 61 6d 70 6c 65 73 20 61 62 6f 76  he examples abov
79f0: 65 20 61 6c 6c 20 75 73 65 20 62 61 73 69 63 20  e all use basic 
7a00: 66 75 6c 6c 2d 74 65 78 74 20 74 65 72 6d 20 71  full-text term q
7a10: 75 65 72 69 65 73 20 61 73 20 62 6f 74 68 20 6f  ueries as both o
7a20: 70 65 72 61 6e 64 73 20 6f 66 20 0a 20 20 74 68  perands of .  th
7a30: 65 20 73 65 74 20 6f 70 65 72 61 74 69 6f 6e 73  e set operations
7a40: 20 64 65 6d 6f 6e 73 74 72 61 74 65 64 2e 20 50   demonstrated. P
7a50: 68 72 61 73 65 20 61 6e 64 20 4e 45 41 52 20 71  hrase and NEAR q
7a60: 75 65 72 69 65 73 20 6d 61 79 20 61 6c 73 6f 20  ueries may also 
7a70: 62 65 20 75 73 65 64 2c 0a 20 20 61 73 20 6d 61  be used,.  as ma
7a80: 79 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  y the results of
7a90: 20 6f 74 68 65 72 20 73 65 74 20 6f 70 65 72 61   other set opera
7aa0: 74 69 6f 6e 73 2e 20 57 68 65 6e 20 6d 6f 72 65  tions. When more
7ab0: 20 74 68 61 6e 20 6f 6e 65 20 73 65 74 20 6f 70   than one set op
7ac0: 65 72 61 74 69 6f 6e 0a 20 20 69 73 20 70 72 65  eration.  is pre
7ad0: 73 65 6e 74 20 69 6e 20 61 6e 20 46 54 53 33 20  sent in an FTS3 
7ae0: 71 75 65 72 79 2c 20 74 68 65 20 70 72 65 63 65  query, the prece
7af0: 64 65 6e 63 65 20 6f 66 20 6f 70 65 72 61 74 6f  dence of operato
7b00: 72 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  rs is as follows
7b10: 3a 0a 0a 5b 54 61 62 6c 65 5d 0a 20 20 5b 54 72  :..[Table].  [Tr
7b20: 5d 3c 74 68 3e 4f 70 65 72 61 74 6f 72 3c 74 68  ]<th>Operator<th
7b30: 3e 45 6e 68 61 6e 63 65 64 20 51 75 65 72 79 20  >Enhanced Query 
7b40: 53 79 6e 74 61 78 20 50 72 65 63 65 64 65 6e 63  Syntax Precedenc
7b50: 65 0a 20 20 5b 54 72 5d 3c 74 64 3e 4e 4f 54 20  e.  [Tr]<td>NOT 
7b60: 3c 74 64 3e 20 48 69 67 68 65 73 74 20 70 72 65  <td> Highest pre
7b70: 63 65 64 65 6e 63 65 20 28 74 69 67 68 74 65 73  cedence (tightes
7b80: 74 20 67 72 6f 75 70 69 6e 67 29 2e 0a 20 20 5b  t grouping)..  [
7b90: 54 72 5d 3c 74 64 3e 41 4e 44 20 3c 74 64 3e 0a  Tr]<td>AND <td>.
7ba0: 20 20 5b 54 72 5d 3c 74 64 3e 4f 52 20 20 3c 74    [Tr]<td>OR  <t
7bb0: 64 3e 20 4c 6f 77 65 73 74 20 70 72 65 63 65 64  d> Lowest preced
7bc0: 65 6e 63 65 20 28 6c 6f 6f 73 65 73 74 20 67 72  ence (loosest gr
7bd0: 6f 75 70 69 6e 67 29 2e 0a 3c 2f 74 61 62 6c 65  ouping)..</table
7be0: 3e 0a 0a 3c 70 3e 0a 20 20 57 68 65 6e 20 75 73  >..<p>.  When us
7bf0: 69 6e 67 20 74 68 65 20 65 6e 68 61 6e 63 65 64  ing the enhanced
7c00: 20 71 75 65 72 79 20 73 79 6e 74 61 78 2c 20 70   query syntax, p
7c10: 61 72 65 6e 74 68 65 73 69 73 20 6d 61 79 20 62  arenthesis may b
7c20: 65 20 75 73 65 64 20 74 6f 20 6f 76 65 72 72 69  e used to overri
7c30: 64 65 0a 20 20 74 68 65 20 64 65 66 61 75 6c 74  de.  the default
7c40: 20 70 72 65 63 65 64 65 6e 63 65 20 6f 66 20 74   precedence of t
7c50: 68 65 20 76 61 72 69 6f 75 73 20 6f 70 65 72 61  he various opera
7c60: 74 6f 72 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c  tors. For exampl
7c70: 65 3a 0a 0a 5b 43 6f 64 65 20 7b 0a 0a 20 20 3c  e:..[Code {..  <
7c80: 69 3e 2d 2d 20 52 65 74 75 72 6e 20 74 68 65 20  i>-- Return the 
7c90: 64 6f 63 69 64 20 76 61 6c 75 65 73 20 61 73 73  docid values ass
7ca0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 6c 6c  ociated with all
7cb0: 20 64 6f 63 75 6d 65 6e 74 73 20 74 68 61 74 20   documents that 
7cc0: 63 6f 6e 74 61 69 6e 20 74 68 65 3c 2f 69 3e 0a  contain the</i>.
7cd0: 20 20 3c 69 3e 2d 2d 20 74 77 6f 20 74 65 72 6d    <i>-- two term
7ce0: 73 20 22 73 71 6c 69 74 65 22 20 61 6e 64 20 22  s "sqlite" and "
7cf0: 64 61 74 61 62 61 73 65 22 2c 20 61 6e 64 2f 6f  database", and/o
7d00: 72 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 74 65  r contain the te
7d10: 72 6d 20 22 6c 69 62 72 61 72 79 22 2e 3c 2f 69  rm "library".</i
7d20: 3e 0a 20 20 53 45 4c 45 43 54 20 64 6f 63 69 64  >.  SELECT docid
7d30: 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45   FROM docs WHERE
7d40: 20 64 6f 63 73 20 4d 41 54 43 48 20 27 73 71 6c   docs MATCH 'sql
7d50: 69 74 65 20 41 4e 44 20 64 61 74 61 62 61 73 65  ite AND database
7d60: 20 4f 52 20 6c 69 62 72 61 72 79 27 3b 0a 0a 20   OR library';.. 
7d70: 20 3c 69 3e 2d 2d 20 54 68 69 73 20 71 75 65 72   <i>-- This quer
7d80: 79 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  y is equivalent 
7d90: 74 6f 20 74 68 65 20 61 62 6f 76 65 2e 3c 2f 69  to the above.</i
7da0: 3e 0a 20 20 53 45 4c 45 43 54 20 64 6f 63 69 64  >.  SELECT docid
7db0: 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45   FROM docs WHERE
7dc0: 20 64 6f 63 73 20 4d 41 54 43 48 20 27 73 71 6c   docs MATCH 'sql
7dd0: 69 74 65 20 41 4e 44 20 64 61 74 61 62 61 73 65  ite AND database
7de0: 27 0a 20 20 20 20 55 4e 49 4f 4e 0a 20 20 53 45  '.    UNION.  SE
7df0: 4c 45 43 54 20 64 6f 63 69 64 20 46 52 4f 4d 20  LECT docid FROM 
7e00: 64 6f 63 73 20 57 48 45 52 45 20 64 6f 63 73 20  docs WHERE docs 
7e10: 4d 41 54 43 48 20 27 6c 69 62 72 61 72 79 27 3b  MATCH 'library';
7e20: 0a 0a 20 20 3c 69 3e 2d 2d 20 51 75 65 72 79 20  ..  <i>-- Query 
7e30: 66 6f 72 20 74 68 65 20 73 65 74 20 6f 66 20 64  for the set of d
7e40: 6f 63 75 6d 65 6e 74 73 20 74 68 61 74 20 63 6f  ocuments that co
7e50: 6e 74 61 69 6e 73 20 74 68 65 20 74 65 72 6d 20  ntains the term 
7e60: 22 6c 69 6e 75 78 22 2c 20 61 6e 64 20 61 74 20  "linux", and at 
7e70: 6c 65 61 73 74 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  least</i>.  <i>-
7e80: 2d 20 6f 6e 65 20 6f 66 20 74 68 65 20 70 68 72  - one of the phr
7e90: 61 73 65 73 20 22 73 71 6c 69 74 65 20 64 61 74  ases "sqlite dat
7ea0: 61 62 61 73 65 22 20 61 6e 64 20 22 73 71 6c 69  abase" and "sqli
7eb0: 74 65 20 6c 69 62 72 61 72 79 22 2e 3c 2f 69 3e  te library".</i>
7ec0: 0a 20 20 53 45 4c 45 43 54 20 64 6f 63 69 64 20  .  SELECT docid 
7ed0: 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20  FROM docs WHERE 
7ee0: 64 6f 63 73 20 4d 41 54 43 48 20 27 28 22 73 71  docs MATCH '("sq
7ef0: 6c 69 74 65 20 64 61 74 61 62 61 73 65 22 20 4f  lite database" O
7f00: 52 20 22 73 71 6c 69 74 65 20 6c 69 62 72 61 72  R "sqlite librar
7f10: 79 22 29 20 41 4e 44 20 6c 69 6e 75 78 27 3b 0a  y") AND linux';.
7f20: 0a 20 20 3c 69 3e 2d 2d 20 54 68 69 73 20 71 75  .  <i>-- This qu
7f30: 65 72 79 20 69 73 20 65 71 75 69 76 61 6c 65 6e  ery is equivalen
7f40: 74 20 74 6f 20 74 68 65 20 61 62 6f 76 65 2e 3c  t to the above.<
7f50: 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 64 6f 63  /i>.  SELECT doc
7f60: 69 64 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45  id FROM docs WHE
7f70: 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27 6c  RE docs MATCH 'l
7f80: 69 6e 75 78 27 0a 20 20 20 20 49 4e 54 45 52 53  inux'.    INTERS
7f90: 45 43 54 0a 20 20 53 45 4c 45 43 54 20 64 6f 63  ECT.  SELECT doc
7fa0: 69 64 20 46 52 4f 4d 20 28 0a 20 20 20 20 53 45  id FROM (.    SE
7fb0: 4c 45 43 54 20 64 6f 63 69 64 20 46 52 4f 4d 20  LECT docid FROM 
7fc0: 64 6f 63 73 20 57 48 45 52 45 20 64 6f 63 73 20  docs WHERE docs 
7fd0: 4d 41 54 43 48 20 27 22 73 71 6c 69 74 65 20 6c  MATCH '"sqlite l
7fe0: 69 62 72 61 72 79 22 27 0a 20 20 20 20 20 20 55  ibrary"'.      U
7ff0: 4e 49 4f 4e 0a 20 20 20 20 53 45 4c 45 43 54 20  NION.    SELECT 
8000: 64 6f 63 69 64 20 46 52 4f 4d 20 64 6f 63 73 20  docid FROM docs 
8010: 57 48 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48  WHERE docs MATCH
8020: 20 27 22 73 71 6c 69 74 65 20 64 61 74 61 62 61   '"sqlite databa
8030: 73 65 22 27 0a 20 20 29 3b 0a 7d 5d 0a 0a 0a 5b  se"'.  );.}]...[
8040: 68 32 20 22 53 65 74 20 4f 70 65 72 61 74 69 6f  h2 "Set Operatio
8050: 6e 73 20 55 73 69 6e 67 20 54 68 65 20 53 74 61  ns Using The Sta
8060: 6e 64 61 72 64 20 51 75 65 72 79 20 53 79 6e 74  ndard Query Synt
8070: 61 78 22 5d 0a 0a 3c 70 3e 0a 20 20 46 54 53 33  ax"]..<p>.  FTS3
8080: 20 71 75 65 72 79 20 73 65 74 20 6f 70 65 72 61   query set opera
8090: 74 69 6f 6e 73 20 75 73 69 6e 67 20 74 68 65 20  tions using the 
80a0: 73 74 61 6e 64 61 72 64 20 71 75 65 72 79 20 73  standard query s
80b0: 79 6e 74 61 78 20 61 72 65 20 73 69 6d 69 6c 61  yntax are simila
80c0: 72 2c 20 62 75 74 0a 20 20 6e 6f 74 20 69 64 65  r, but.  not ide
80d0: 6e 74 69 63 61 6c 2c 20 74 6f 20 73 65 74 20 6f  ntical, to set o
80e0: 70 65 72 61 74 69 6f 6e 73 20 77 69 74 68 20 74  perations with t
80f0: 68 65 20 65 6e 68 61 6e 63 65 64 20 71 75 65 72  he enhanced quer
8100: 79 20 73 79 6e 74 61 78 2e 20 54 68 65 72 65 0a  y syntax. There.
8110: 20 20 61 72 65 20 66 6f 75 72 20 64 69 66 66 65    are four diffe
8120: 72 65 6e 63 65 73 2c 20 61 73 20 66 6f 6c 6c 6f  rences, as follo
8130: 77 73 3a 0a 0a 3c 6f 6c 3e 0a 20 20 3c 6c 69 20  ws:..<ol>.  <li 
8140: 76 61 6c 75 65 3d 31 3e 3c 70 3e 20 4f 6e 6c 79  value=1><p> Only
8150: 20 74 68 65 20 69 6d 70 6c 69 63 69 74 20 76 65   the implicit ve
8160: 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 41 4e 44  rsion of the AND
8170: 20 6f 70 65 72 61 74 6f 72 20 69 73 20 73 75 70   operator is sup
8180: 70 6f 72 74 65 64 2e 0a 20 20 20 20 53 70 65 63  ported..    Spec
8190: 69 66 79 69 6e 67 20 74 68 65 20 73 74 72 69 6e  ifying the strin
81a0: 67 20 22 41 4e 44 22 20 61 73 20 70 61 72 74 20  g "AND" as part 
81b0: 6f 66 20 61 6e 20 73 74 61 6e 64 61 72 64 20 71  of an standard q
81c0: 75 65 72 79 20 73 79 6e 74 61 78 20 71 75 65 72  uery syntax quer
81d0: 79 20 69 73 0a 20 20 20 20 69 6e 74 65 72 70 72  y is.    interpr
81e0: 65 74 65 64 20 61 73 20 61 20 74 65 72 6d 20 71  eted as a term q
81f0: 75 65 72 79 20 66 6f 72 20 74 68 65 20 73 65 74  uery for the set
8200: 20 6f 66 20 64 6f 63 75 6d 65 6e 74 73 20 63 6f   of documents co
8210: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 65 72  ntaining the ter
8220: 6d 20 0a 20 20 20 20 22 61 6e 64 22 2e 0a 3c 2f  m .    "and"..</
8230: 6f 6c 3e 0a 0a 3c 6f 6c 3e 0a 20 20 3c 6c 69 20  ol>..<ol>.  <li 
8240: 76 61 6c 75 65 3d 32 3e 3c 70 3e 20 50 61 72 65  value=2><p> Pare
8250: 6e 74 68 65 73 69 73 20 61 72 65 20 6e 6f 74 20  nthesis are not 
8260: 73 75 70 70 6f 72 74 65 64 2e 0a 3c 2f 6f 6c 3e  supported..</ol>
8270: 0a 0a 3c 6f 6c 3e 0a 20 20 3c 6c 69 20 76 61 6c  ..<ol>.  <li val
8280: 75 65 3d 33 3e 3c 70 3e 20 54 68 65 20 4e 4f 54  ue=3><p> The NOT
8290: 20 6f 70 65 72 61 74 6f 72 20 69 73 20 6e 6f 74   operator is not
82a0: 20 73 75 70 70 6f 72 74 65 64 2e 20 49 6e 73 74   supported. Inst
82b0: 65 61 64 20 6f 66 20 74 68 65 20 4e 4f 54 20 0a  ead of the NOT .
82c0: 20 20 20 20 6f 70 65 72 61 74 6f 72 2c 20 74 68      operator, th
82d0: 65 20 73 74 61 6e 64 61 72 64 20 71 75 65 72 79  e standard query
82e0: 20 73 79 6e 74 61 78 20 73 75 70 70 6f 72 74 73   syntax supports
82f0: 20 61 20 75 6e 61 72 79 20 22 2d 22 20 6f 70 65   a unary "-" ope
8300: 72 61 74 6f 72 20 74 68 61 74 0a 20 20 20 20 6d  rator that.    m
8310: 61 79 20 62 65 20 61 70 70 6c 69 65 64 20 74 6f  ay be applied to
8320: 20 62 61 73 69 63 20 74 65 72 6d 20 61 6e 64 20   basic term and 
8330: 74 65 72 6d 2d 70 72 65 66 69 78 20 71 75 65 72  term-prefix quer
8340: 69 65 73 20 28 62 75 74 20 6e 6f 74 20 74 6f 20  ies (but not to 
8350: 70 68 72 61 73 65 0a 20 20 20 20 6f 72 20 4e 45  phrase.    or NE
8360: 41 52 20 71 75 65 72 69 65 73 29 2e 20 41 20 74  AR queries). A t
8370: 65 72 6d 20 6f 72 20 74 65 72 6d 2d 70 72 65 66  erm or term-pref
8380: 69 78 20 74 68 61 74 20 68 61 73 20 61 20 75 6e  ix that has a un
8390: 61 72 79 20 22 2d 22 20 6f 70 65 72 61 74 6f 72  ary "-" operator
83a0: 0a 20 20 20 20 61 74 74 61 63 68 65 64 20 74 6f  .    attached to
83b0: 20 69 74 20 6d 61 79 20 6e 6f 74 20 61 70 70 65   it may not appe
83c0: 61 72 20 61 73 20 61 6e 20 6f 70 65 72 61 6e 64  ar as an operand
83d0: 20 74 6f 20 61 6e 20 4f 52 20 6f 70 65 72 61 74   to an OR operat
83e0: 6f 72 2e 20 41 6e 20 46 54 53 33 0a 20 20 20 20  or. An FTS3.    
83f0: 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 63 6f  query may not co
8400: 6e 73 69 73 74 20 65 6e 74 69 72 65 6c 79 20 6f  nsist entirely o
8410: 66 20 74 65 72 6d 73 20 6f 72 20 74 65 72 6d 2d  f terms or term-
8420: 70 72 65 66 69 78 20 71 75 65 72 69 65 73 20 77  prefix queries w
8430: 69 74 68 20 75 6e 61 72 79 0a 20 20 20 20 22 2d  ith unary.    "-
8440: 22 20 6f 70 65 72 61 74 6f 72 73 20 61 74 74 61  " operators atta
8450: 63 68 65 64 20 74 6f 20 74 68 65 6d 2e 0a 3c 2f  ched to them..</
8460: 6f 6c 3e 0a 0a 5b 43 6f 64 65 20 7b 0a 20 20 3c  ol>..[Code {.  <
8470: 69 3e 2d 2d 20 53 65 61 72 63 68 20 66 6f 72 20  i>-- Search for 
8480: 74 68 65 20 73 65 74 20 6f 66 20 64 6f 63 75 6d  the set of docum
8490: 65 6e 74 73 20 74 68 61 74 20 63 6f 6e 74 61 69  ents that contai
84a0: 6e 20 74 68 65 20 74 65 72 6d 20 22 73 71 6c 69  n the term "sqli
84b0: 74 65 22 20 62 75 74 20 64 6f 3c 2f 69 3e 0a 20  te" but do</i>. 
84c0: 20 3c 69 3e 2d 2d 20 6e 6f 74 20 63 6f 6e 74 61   <i>-- not conta
84d0: 69 6e 20 74 68 65 20 74 65 72 6d 20 22 64 61 74  in the term "dat
84e0: 61 62 61 73 65 22 2e 3c 2f 69 3e 0a 20 20 53 45  abase".</i>.  SE
84f0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73  LECT * FROM docs
8500: 20 57 48 45 52 45 20 64 6f 63 73 20 4d 41 54 43   WHERE docs MATC
8510: 48 20 27 73 71 6c 69 74 65 20 2d 64 61 74 61 62  H 'sqlite -datab
8520: 61 73 65 27 3b 0a 7d 5d 0a 0a 3c 6f 6c 3e 0a 20  ase';.}]..<ol>. 
8530: 20 3c 6c 69 20 76 61 6c 75 65 3d 34 3e 3c 70 3e   <li value=4><p>
8540: 20 54 68 65 20 72 65 6c 61 74 69 76 65 20 70 72   The relative pr
8550: 65 63 65 64 65 6e 63 65 20 6f 66 20 74 68 65 20  ecedence of the 
8560: 73 65 74 20 6f 70 65 72 61 74 69 6f 6e 73 20 69  set operations i
8570: 73 20 64 69 66 66 65 72 65 6e 74 2e 20 0a 20 20  s different. .  
8580: 20 49 6e 20 70 61 72 74 69 63 75 6c 61 72 2c 20   In particular, 
8590: 75 73 69 6e 67 20 74 68 65 20 73 74 61 6e 64 61  using the standa
85a0: 72 64 20 71 75 65 72 79 20 73 79 6e 74 61 78 20  rd query syntax 
85b0: 74 68 65 20 22 4f 52 22 20 6f 70 65 72 61 74 6f  the "OR" operato
85c0: 72 20 68 61 73 20 61 0a 20 20 20 68 69 67 68 65  r has a.   highe
85d0: 72 20 70 72 65 63 65 64 65 6e 63 65 20 74 68 61  r precedence tha
85e0: 6e 20 22 41 4e 44 22 2e 20 54 68 65 20 70 72 65  n "AND". The pre
85f0: 63 65 64 65 6e 63 65 20 6f 66 20 6f 70 65 72 61  cedence of opera
8600: 74 6f 72 73 20 77 68 65 6e 20 75 73 69 6e 67 20  tors when using 
8610: 74 68 65 0a 20 20 20 73 74 61 6e 64 61 72 64 20  the.   standard 
8620: 71 75 65 72 79 20 73 79 6e 74 61 78 20 69 73 3a  query syntax is:
8630: 20 0a 3c 2f 6f 6c 3e 0a 0a 5b 54 61 62 6c 65 5d   .</ol>..[Table]
8640: 0a 20 20 5b 54 72 5d 3c 74 68 3e 4f 70 65 72 61  .  [Tr]<th>Opera
8650: 74 6f 72 3c 74 68 3e 53 74 61 6e 64 61 72 64 20  tor<th>Standard 
8660: 51 75 65 72 79 20 53 79 6e 74 61 78 20 50 72 65  Query Syntax Pre
8670: 63 65 64 65 6e 63 65 0a 20 20 5b 54 72 5d 3c 74  cedence.  [Tr]<t
8680: 64 3e 55 6e 61 72 79 20 22 2d 22 20 3c 74 64 3e  d>Unary "-" <td>
8690: 20 48 69 67 68 65 73 74 20 70 72 65 63 65 64 65   Highest precede
86a0: 6e 63 65 20 28 74 69 67 68 74 65 73 74 20 67 72  nce (tightest gr
86b0: 6f 75 70 69 6e 67 29 2e 0a 20 20 5b 54 72 5d 3c  ouping)..  [Tr]<
86c0: 74 64 3e 4f 52 20 20 3c 74 64 3e 0a 20 20 5b 54  td>OR  <td>.  [T
86d0: 72 5d 3c 74 64 3e 41 4e 44 20 3c 74 64 3e 20 4c  r]<td>AND <td> L
86e0: 6f 77 65 73 74 20 70 72 65 63 65 64 65 6e 63 65  owest precedence
86f0: 20 28 6c 6f 6f 73 65 73 74 20 67 72 6f 75 70 69   (loosest groupi
8700: 6e 67 29 2e 0a 3c 2f 74 61 62 6c 65 3e 0a 0a 3c  ng)..</table>..<
8710: 6f 6c 3e 3c 6c 69 20 73 74 79 6c 65 3d 22 6c 69  ol><li style="li
8720: 73 74 2d 73 74 79 6c 65 3a 6e 6f 6e 65 22 3e 0a  st-style:none">.
8730: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
8740: 65 78 61 6d 70 6c 65 20 69 6c 6c 75 73 74 72 61  example illustra
8750: 74 65 73 20 70 72 65 63 65 64 65 6e 63 65 20 6f  tes precedence o
8760: 66 20 6f 70 65 72 61 74 6f 72 73 20 75 73 69 6e  f operators usin
8770: 67 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 0a  g the standard .
8780: 20 20 71 75 65 72 79 20 73 79 6e 74 61 78 3a 0a    query syntax:.
8790: 3c 2f 6f 6c 3e 0a 0a 5b 43 6f 64 65 20 7b 0a 20  </ol>..[Code {. 
87a0: 20 3c 69 3e 2d 2d 20 53 65 61 72 63 68 20 66 6f   <i>-- Search fo
87b0: 72 20 64 6f 63 75 6d 65 6e 74 73 20 74 68 61 74  r documents that
87c0: 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65 61   contains at lea
87d0: 73 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 65  st one of the te
87e0: 72 6d 73 20 22 64 61 74 61 62 61 73 65 22 3c 2f  rms "database"</
87f0: 69 3e 0a 20 20 3c 69 3e 2d 2d 20 61 6e 64 20 22  i>.  <i>-- and "
8800: 73 71 6c 69 74 65 22 2c 20 61 6e 64 20 61 6c 73  sqlite", and als
8810: 6f 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74  o contains the t
8820: 65 72 6d 20 22 6c 69 62 72 61 72 79 22 2e 20 42  erm "library". B
8830: 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 64 69  ecause of the di
8840: 66 66 65 72 65 6e 63 65 73 3c 2f 69 3e 0a 20 20  fferences</i>.  
8850: 3c 69 3e 2d 2d 20 69 6e 20 6f 70 65 72 61 74 6f  <i>-- in operato
8860: 72 20 70 72 65 63 65 64 65 6e 63 65 73 2c 20 74  r precedences, t
8870: 68 69 73 20 71 75 65 72 79 20 77 6f 75 6c 64 20  his query would 
8880: 68 61 76 65 20 61 20 64 69 66 66 65 72 65 6e 74  have a different
8890: 20 69 6e 74 65 72 70 72 65 74 61 74 69 6f 6e 20   interpretation 
88a0: 75 73 69 6e 67 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  using</i>.  <i>-
88b0: 2d 20 74 68 65 20 65 6e 68 61 6e 63 65 64 20 71  - the enhanced q
88c0: 75 65 72 79 20 73 79 6e 74 61 78 2e 3c 2f 69 3e  uery syntax.</i>
88d0: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
88e0: 20 64 6f 63 73 20 57 48 45 52 45 20 64 6f 63 73   docs WHERE docs
88f0: 20 4d 41 54 43 48 20 27 73 71 6c 69 74 65 20 4f   MATCH 'sqlite O
8900: 52 20 64 61 74 61 62 61 73 65 20 6c 69 62 72 61  R database libra
8910: 72 79 27 3b 0a 7d 5d 0a 0a 5b 68 31 20 22 41 75  ry';.}]..[h1 "Au
8920: 78 69 6c 6c 61 72 79 20 66 75 6e 63 74 69 6f 6e  xillary function
8930: 73 20 2d 20 53 6e 69 70 70 65 74 2c 20 4f 66 66  s - Snippet, Off
8940: 73 65 74 73 20 61 6e 64 20 4d 61 74 63 68 69 6e  sets and Matchin
8950: 66 6f 22 20 7b 7d 20 73 6e 69 70 70 65 74 20 6f  fo" {} snippet o
8960: 66 66 73 65 74 73 5d 0a 0a 3c 70 3e 0a 20 20 54  ffsets]..<p>.  T
8970: 68 65 20 46 54 53 33 20 6d 6f 64 75 6c 65 20 70  he FTS3 module p
8980: 72 6f 76 69 64 65 73 20 74 68 72 65 65 20 73 70  rovides three sp
8990: 65 63 69 61 6c 20 53 51 4c 20 73 63 61 6c 61 72  ecial SQL scalar
89a0: 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   functions that 
89b0: 6d 61 79 20 62 65 20 75 73 65 66 75 6c 0a 20 20  may be useful.  
89c0: 74 6f 20 74 68 65 20 64 65 76 65 6c 6f 70 65 72  to the developer
89d0: 73 20 6f 66 20 66 75 6c 6c 2d 74 65 78 74 20 71  s of full-text q
89e0: 75 65 72 79 20 73 79 73 74 65 6d 73 3a 20 22 73  uery systems: "s
89f0: 6e 69 70 70 65 74 22 2c 20 22 6f 66 66 73 65 74  nippet", "offset
8a00: 73 22 20 61 6e 64 0a 20 20 22 6d 61 74 63 68 69  s" and.  "matchi
8a10: 6e 66 6f 22 2e 20 54 68 65 20 70 75 72 70 6f 73  nfo". The purpos
8a20: 65 20 6f 66 20 74 68 65 20 22 73 6e 69 70 70 65  e of the "snippe
8a30: 74 22 20 61 6e 64 20 22 6f 66 66 73 65 74 73 22  t" and "offsets"
8a40: 20 66 75 6e 63 74 69 6f 6e 73 20 69 73 20 74 6f   functions is to
8a50: 20 61 6c 6c 6f 77 0a 20 20 74 68 65 20 75 73 65   allow.  the use
8a60: 72 20 74 6f 20 69 64 65 6e 74 69 66 79 20 74 68  r to identify th
8a70: 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 71 75  e location of qu
8a80: 65 72 69 65 64 20 74 65 72 6d 73 20 69 6e 20 74  eried terms in t
8a90: 68 65 20 72 65 74 75 72 6e 65 64 20 64 6f 63 75  he returned docu
8aa0: 6d 65 6e 74 73 2e 0a 20 20 54 68 65 20 22 6d 61  ments..  The "ma
8ab0: 74 63 68 69 6e 66 6f 22 20 66 75 6e 63 74 69 6f  tchinfo" functio
8ac0: 6e 20 70 72 6f 76 69 64 65 73 20 74 68 65 20 75  n provides the u
8ad0: 73 65 72 20 77 69 74 68 20 6d 65 74 72 69 63 73  ser with metrics
8ae0: 20 74 68 61 74 20 6d 61 79 20 62 65 20 75 73 65   that may be use
8af0: 66 75 6c 0a 20 20 66 6f 72 20 66 69 6c 74 65 72  ful.  for filter
8b00: 69 6e 67 20 6f 72 20 73 6f 72 74 69 6e 67 20 71  ing or sorting q
8b10: 75 65 72 79 20 72 65 73 75 6c 74 73 20 61 63 63  uery results acc
8b20: 6f 72 64 69 6e 67 20 74 6f 20 72 65 6c 65 76 61  ording to releva
8b30: 6e 63 65 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20  nce...<p>.  The 
8b40: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  first argument t
8b50: 6f 20 61 6c 6c 20 74 68 72 65 65 20 73 70 65 63  o all three spec
8b60: 69 61 6c 20 53 51 4c 20 73 63 61 6c 61 72 20 66  ial SQL scalar f
8b70: 75 6e 63 74 69 6f 6e 73 0a 20 20 6d 75 73 74 20  unctions.  must 
8b80: 62 65 20 74 68 65 20 74 68 65 20 73 70 65 63 69  be the the speci
8b90: 61 6c 20 68 69 64 64 65 6e 20 63 6f 6c 75 6d 6e  al hidden column
8ba0: 20 6f 66 20 61 6e 20 46 54 53 33 20 74 61 62 6c   of an FTS3 tabl
8bb0: 65 20 74 68 61 74 20 68 61 73 20 74 68 65 20 73  e that has the s
8bc0: 61 6d 65 0a 20 20 6e 61 6d 65 20 61 73 20 74 68  ame.  name as th
8bd0: 65 20 74 61 62 6c 65 20 28 73 65 65 20 61 62 6f  e table (see abo
8be0: 76 65 29 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  ve). For example
8bf0: 2c 20 67 69 76 65 6e 20 61 6e 20 46 54 53 33 20  , given an FTS3 
8c00: 74 61 62 6c 65 20 6e 61 6d 65 64 20 0a 20 20 22  table named .  "
8c10: 6d 61 69 6c 22 3a 0a 0a 5b 43 6f 64 65 20 7b 0a  mail":..[Code {.
8c20: 20 20 53 45 4c 45 43 54 20 6f 66 66 73 65 74 73    SELECT offsets
8c30: 28 6d 61 69 6c 29 20 46 52 4f 4d 20 6d 61 69 6c  (mail) FROM mail
8c40: 20 57 48 45 52 45 20 6d 61 69 6c 20 4d 41 54 43   WHERE mail MATC
8c50: 48 20 26 6c 74 3b 66 75 6c 6c 2d 74 65 78 74 20  H &lt;full-text 
8c60: 71 75 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e  query expression
8c70: 26 67 74 3b 3b 0a 20 20 53 45 4c 45 43 54 20 73  &gt;;.  SELECT s
8c80: 6e 69 70 70 65 74 28 6d 61 69 6c 29 20 46 52 4f  nippet(mail) FRO
8c90: 4d 20 6d 61 69 6c 20 57 48 45 52 45 20 6d 61 69  M mail WHERE mai
8ca0: 6c 20 4d 41 54 43 48 20 26 6c 74 3b 66 75 6c 6c  l MATCH &lt;full
8cb0: 2d 74 65 78 74 20 71 75 65 72 79 20 65 78 70 72  -text query expr
8cc0: 65 73 73 69 6f 6e 26 67 74 3b 3b 0a 20 20 53 45  ession&gt;;.  SE
8cd0: 4c 45 43 54 20 6d 61 74 63 68 69 6e 66 6f 28 6d  LECT matchinfo(m
8ce0: 61 69 6c 29 20 46 52 4f 4d 20 6d 61 69 6c 20 57  ail) FROM mail W
8cf0: 48 45 52 45 20 6d 61 69 6c 20 4d 41 54 43 48 20  HERE mail MATCH 
8d00: 26 6c 74 3b 66 75 6c 6c 2d 74 65 78 74 20 71 75  &lt;full-text qu
8d10: 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 26 67  ery expression&g
8d20: 74 3b 3b 0a 7d 5d 0a 0a 3c 70 3e 0a 20 20 54 68  t;;.}]..<p>.  Th
8d30: 65 20 74 68 72 65 65 20 61 75 78 69 6c 6c 61 72  e three auxillar
8d40: 79 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20  y functions are 
8d50: 6f 6e 6c 79 20 75 73 65 66 75 6c 20 77 69 74 68  only useful with
8d60: 69 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  in a SELECT stat
8d70: 65 6d 65 6e 74 20 74 68 61 74 0a 20 20 75 73 65  ement that.  use
8d80: 73 20 74 68 65 20 46 54 53 33 20 74 61 62 6c 65  s the FTS3 table
8d90: 27 73 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64  's full-text ind
8da0: 65 78 2e 20 49 66 20 75 73 65 64 20 77 69 74 68  ex. If used with
8db0: 69 6e 20 61 20 53 45 4c 45 43 54 20 74 68 61 74  in a SELECT that
8dc0: 20 75 73 65 73 0a 20 20 74 68 65 20 22 71 75 65   uses.  the "que
8dd0: 72 79 20 62 79 20 72 6f 77 69 64 22 20 6f 72 20  ry by rowid" or 
8de0: 22 6c 69 6e 65 61 72 20 73 63 61 6e 22 20 73 74  "linear scan" st
8df0: 72 61 74 65 67 69 65 73 2c 20 74 68 65 6e 20 74  rategies, then t
8e00: 68 65 20 73 6e 69 70 70 65 74 20 61 6e 64 0a 20  he snippet and. 
8e10: 20 6f 66 66 73 65 74 73 20 62 6f 74 68 20 72 65   offsets both re
8e20: 74 75 72 6e 20 61 6e 20 61 6e 20 65 6d 70 74 79  turn an an empty
8e30: 20 73 74 72 69 6e 67 2c 20 61 6e 64 20 74 68 65   string, and the
8e40: 20 6d 61 74 63 68 69 6e 66 6f 20 66 75 6e 63 74   matchinfo funct
8e50: 69 6f 6e 20 72 65 74 75 72 6e 73 0a 20 20 61 20  ion returns.  a 
8e60: 62 6c 6f 62 20 76 61 6c 75 65 20 7a 65 72 6f 20  blob value zero 
8e70: 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 0a  bytes in size...
8e80: 3c 70 20 69 64 3d 6d 61 74 63 68 61 62 6c 65 3e  <p id=matchable>
8e90: 0a 20 20 41 6c 6c 20 74 68 72 65 65 20 61 75 78  .  All three aux
8ea0: 69 6c 6c 61 72 79 20 66 75 6e 63 74 69 6f 6e 73  illary functions
8eb0: 20 65 78 74 72 61 63 74 20 61 20 73 65 74 20 6f   extract a set o
8ec0: 66 20 22 6d 61 74 63 68 61 62 6c 65 20 70 68 72  f "matchable phr
8ed0: 61 73 65 73 22 20 66 72 6f 6d 0a 20 20 74 68 65  ases" from.  the
8ee0: 20 46 54 53 33 20 71 75 65 72 79 20 65 78 70 72   FTS3 query expr
8ef0: 65 73 73 69 6f 6e 20 74 6f 20 77 6f 72 6b 20 77  ession to work w
8f00: 69 74 68 2e 20 54 68 65 20 73 65 74 20 6f 66 20  ith. The set of 
8f10: 6d 61 74 63 68 61 62 6c 65 20 70 68 72 61 73 65  matchable phrase
8f20: 73 20 66 6f 72 0a 20 20 61 20 67 69 76 65 6e 20  s for.  a given 
8f30: 71 75 65 72 79 20 63 6f 6e 73 69 73 74 73 20 6f  query consists o
8f40: 66 20 61 6c 6c 20 70 68 72 61 73 65 73 20 28 69  f all phrases (i
8f50: 6e 63 6c 75 64 69 6e 67 20 75 6e 71 75 6f 74 65  ncluding unquote
8f60: 64 20 74 6f 6b 65 6e 73 20 61 6e 64 0a 20 20 74  d tokens and.  t
8f70: 6f 6b 65 6e 20 70 72 65 66 69 78 65 73 29 20 69  oken prefixes) i
8f80: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
8f90: 20 65 78 63 65 70 74 20 74 68 6f 73 65 20 74 68   except those th
8fa0: 61 74 20 61 72 65 20 70 72 65 66 69 78 65 64 20  at are prefixed 
8fb0: 77 69 74 68 0a 20 20 61 20 75 6e 61 72 79 20 22  with.  a unary "
8fc0: 2d 22 20 6f 70 65 72 61 74 6f 72 20 28 73 74 61  -" operator (sta
8fd0: 6e 64 61 72 64 20 73 79 6e 74 61 78 29 20 6f 72  ndard syntax) or
8fe0: 20 61 72 65 20 70 61 72 74 20 6f 66 20 61 20 73   are part of a s
8ff0: 75 62 2d 65 78 70 72 65 73 73 69 6f 6e 20 0a 20  ub-expression . 
9000: 20 74 68 61 74 20 69 73 20 75 73 65 64 20 61 73   that is used as
9010: 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   the right-hand 
9020: 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4e 4f 54  operand of a NOT
9030: 20 6f 70 65 72 61 74 6f 72 2e 0a 0a 3c 70 3e 0a   operator...<p>.
9040: 20 20 57 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f    With the follo
9050: 77 69 6e 67 20 70 72 6f 76 69 73 6f 73 2c 20 65  wing provisos, e
9060: 61 63 68 20 73 65 72 69 65 73 20 6f 66 20 74 6f  ach series of to
9070: 6b 65 6e 73 20 69 6e 20 74 68 65 20 46 54 53 33  kens in the FTS3
9080: 20 74 61 62 6c 65 20 74 68 61 74 0a 20 20 6d 61   table that.  ma
9090: 74 63 68 65 73 20 6f 6e 65 20 6f 66 20 74 68 65  tches one of the
90a0: 20 6d 61 74 63 68 61 62 6c 65 20 70 68 72 61 73   matchable phras
90b0: 65 73 20 69 6e 20 74 68 65 20 71 75 65 72 79 20  es in the query 
90c0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6b 6e  expression is kn
90d0: 6f 77 6e 20 61 73 20 61 0a 20 20 22 70 68 72 61  own as a.  "phra
90e0: 73 65 20 6d 61 74 63 68 22 3a 0a 0a 3c 6f 6c 3e  se match":..<ol>
90f0: 0a 20 20 3c 6c 69 3e 20 49 66 20 61 20 6d 61 74  .  <li> If a mat
9100: 63 68 61 62 6c 65 20 70 68 72 61 73 65 20 69 73  chable phrase is
9110: 20 70 61 72 74 20 6f 66 20 61 20 73 65 72 69 65   part of a serie
9120: 73 20 6f 66 20 70 68 72 61 73 65 73 20 63 6f 6e  s of phrases con
9130: 6e 65 63 74 65 64 20 62 79 0a 20 20 20 20 20 20  nected by.      
9140: 20 4e 45 41 52 20 6f 70 65 72 61 74 6f 72 73 20   NEAR operators 
9150: 69 6e 20 74 68 65 20 46 54 53 33 20 71 75 65 72  in the FTS3 quer
9160: 79 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  y expression, th
9170: 65 6e 20 65 61 63 68 20 70 68 72 61 73 65 20 6d  en each phrase m
9180: 61 74 63 68 0a 20 20 20 20 20 20 20 6d 75 73 74  atch.       must
9190: 20 62 65 20 73 75 66 66 69 63 69 65 6e 74 6c 79   be sufficiently
91a0: 20 63 6c 6f 73 65 20 74 6f 20 6f 74 68 65 72 20   close to other 
91b0: 70 68 72 61 73 65 20 6d 61 74 63 68 65 73 20 6f  phrase matches o
91c0: 66 20 74 68 65 20 72 65 6c 65 76 61 6e 74 0a 20  f the relevant. 
91d0: 20 20 20 20 20 20 74 79 70 65 73 20 74 6f 20 73        types to s
91e0: 61 74 69 73 66 79 20 74 68 65 20 4e 45 41 52 20  atisfy the NEAR 
91f0: 63 6f 6e 64 69 74 69 6f 6e 2e 0a 0a 20 20 3c 6c  condition...  <l
9200: 69 3e 20 49 66 20 74 68 65 20 6d 61 74 63 68 61  i> If the matcha
9210: 62 6c 65 20 70 68 72 61 73 65 20 69 6e 20 74 68  ble phrase in th
9220: 65 20 46 54 53 33 20 71 75 65 72 79 20 69 73 20  e FTS3 query is 
9230: 72 65 73 74 72 69 63 74 65 64 20 74 6f 20 6d 61  restricted to ma
9240: 74 63 68 69 6e 67 0a 20 20 20 20 20 20 20 64 61  tching.       da
9250: 74 61 20 69 6e 20 61 20 73 70 65 63 69 66 69 65  ta in a specifie
9260: 64 20 46 54 53 33 20 74 61 62 6c 65 20 63 6f 6c  d FTS3 table col
9270: 75 6d 6e 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 70  umn, then only p
9280: 68 72 61 73 65 20 6d 61 74 63 68 65 73 20 74 68  hrase matches th
9290: 61 74 20 0a 20 20 20 20 20 20 20 6f 63 63 75 72  at .       occur
92a0: 20 77 69 74 68 69 6e 20 74 68 61 74 20 63 6f 6c   within that col
92b0: 75 6d 6e 20 61 72 65 20 63 6f 6e 73 69 64 65 72  umn are consider
92c0: 65 64 2e 0a 3c 2f 6f 6c 3e 0a 20 0a 0a 5b 68 32  ed..</ol>. ..[h2
92d0: 20 22 54 68 65 20 4f 66 66 73 65 74 73 20 46 75   "The Offsets Fu
92e0: 6e 63 74 69 6f 6e 22 5d 0a 0a 3c 70 3e 0a 20 20  nction"]..<p>.  
92f0: 46 6f 72 20 61 20 53 45 4c 45 43 54 20 71 75 65  For a SELECT que
9300: 72 79 20 74 68 61 74 20 75 73 65 73 20 74 68 65  ry that uses the
9310: 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78   full-text index
9320: 2c 20 74 68 65 20 6f 66 66 73 65 74 73 28 29 20  , the offsets() 
9330: 66 75 6e 63 74 69 6f 6e 20 0a 20 20 72 65 74 75  function .  retu
9340: 72 6e 73 20 61 20 74 65 78 74 20 76 61 6c 75 65  rns a text value
9350: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 73 65   containing a se
9360: 72 69 65 73 20 6f 66 20 73 70 61 63 65 2d 73 65  ries of space-se
9370: 70 61 72 61 74 65 64 20 69 6e 74 65 67 65 72 73  parated integers
9380: 2e 20 46 6f 72 0a 20 20 65 61 63 68 20 74 65 72  . For.  each ter
9390: 6d 20 69 6e 20 65 61 63 68 20 3c 61 20 68 72 65  m in each <a hre
93a0: 66 3d 23 6d 61 74 63 68 61 62 6c 65 3e 70 68 72  f=#matchable>phr
93b0: 61 73 65 20 6d 61 74 63 68 3c 2f 61 3e 20 6f 66  ase match</a> of
93c0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
93d0: 2c 20 0a 20 20 74 68 65 72 65 20 61 72 65 20 66  , .  there are f
93e0: 6f 75 72 20 69 6e 74 65 67 65 72 73 20 69 6e 20  our integers in 
93f0: 74 68 65 20 72 65 74 75 72 6e 65 64 20 6c 69 73  the returned lis
9400: 74 2e 20 45 61 63 68 20 73 65 74 20 6f 66 20 66  t. Each set of f
9410: 6f 75 72 20 69 6e 74 65 67 65 72 73 20 69 73 20  our integers is 
9420: 0a 20 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  .  interpreted a
9430: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 0a 5b 54 61 62  s follows:..[Tab
9440: 6c 65 5d 0a 20 20 5b 54 72 5d 3c 74 68 3e 49 6e  le].  [Tr]<th>In
9450: 74 65 67 65 72 20 3c 74 68 3e 49 6e 74 65 72 70  teger <th>Interp
9460: 72 65 74 61 74 69 6f 6e 0a 20 20 5b 54 72 5d 3c  retation.  [Tr]<
9470: 74 64 3e 30 20 0a 20 20 20 20 20 20 3c 74 64 3e  td>0 .      <td>
9480: 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  The column numbe
9490: 72 20 74 68 61 74 20 74 68 65 20 74 65 72 6d 20  r that the term 
94a0: 69 6e 73 74 61 6e 63 65 20 6f 63 63 75 72 73 20  instance occurs 
94b0: 69 6e 20 28 30 20 66 6f 72 20 74 68 65 0a 20 20  in (0 for the.  
94c0: 20 20 20 20 20 20 20 20 6c 65 66 74 6d 6f 73 74          leftmost
94d0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 46   column of the F
94e0: 54 53 33 20 74 61 62 6c 65 2c 20 31 20 66 6f 72  TS3 table, 1 for
94f0: 20 74 68 65 20 6e 65 78 74 20 6c 65 66 74 6d 6f   the next leftmo
9500: 73 74 2c 20 65 74 63 2e 29 2e 0a 20 20 5b 54 72  st, etc.)..  [Tr
9510: 5d 3c 74 64 3e 31 0a 20 20 20 20 20 20 3c 74 64  ]<td>1.      <td
9520: 3e 54 68 65 20 74 65 72 6d 20 6e 75 6d 62 65 72  >The term number
9530: 20 6f 66 20 74 68 65 20 6d 61 74 63 68 69 6e 67   of the matching
9540: 20 74 65 72 6d 20 77 69 74 68 69 6e 20 74 68 65   term within the
9550: 20 66 75 6c 6c 2d 74 65 78 74 20 71 75 65 72 79   full-text query
9560: 0a 20 20 20 20 20 20 20 20 20 20 65 78 70 72 65  .          expre
9570: 73 73 69 6f 6e 2e 20 54 65 72 6d 73 20 77 69 74  ssion. Terms wit
9580: 68 69 6e 20 61 20 71 75 65 72 79 20 65 78 70 72  hin a query expr
9590: 65 73 73 69 6f 6e 20 61 72 65 20 6e 75 6d 62 65  ession are numbe
95a0: 72 65 64 20 73 74 61 72 74 69 6e 67 0a 20 20 20  red starting.   
95b0: 20 20 20 20 20 20 20 66 72 6f 6d 20 30 20 69 6e         from 0 in
95c0: 20 74 68 65 20 6f 72 64 65 72 20 74 68 61 74 20   the order that 
95d0: 74 68 65 79 20 6f 63 63 75 72 2e 0a 20 20 5b 54  they occur..  [T
95e0: 72 5d 3c 74 64 3e 32 0a 20 20 20 20 20 20 3c 74  r]<td>2.      <t
95f0: 64 3e 54 68 65 20 62 79 74 65 20 6f 66 66 73 65  d>The byte offse
9600: 74 20 6f 66 20 74 68 65 20 6d 61 74 63 68 69 6e  t of the matchin
9610: 67 20 74 65 72 6d 20 77 69 74 68 69 6e 20 74 68  g term within th
9620: 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 5b 54 72 5d  e column..  [Tr]
9630: 3c 74 64 3e 33 0a 20 20 20 20 20 20 3c 74 64 3e  <td>3.      <td>
9640: 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  The size of the 
9650: 6d 61 74 63 68 69 6e 67 20 74 65 72 6d 20 69 6e  matching term in
9660: 20 62 79 74 65 73 2e 0a 3c 2f 74 61 62 6c 65 3e   bytes..</table>
9670: 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 66 6f 6c 6c  ..<p>.  The foll
9680: 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 63 6f 6e 74  owing block cont
9690: 61 69 6e 73 20 65 78 61 6d 70 6c 65 73 20 74 68  ains examples th
96a0: 61 74 20 75 73 65 20 74 68 65 20 6f 66 66 73 65  at use the offse
96b0: 74 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 0a 5b 43  ts function...[C
96c0: 6f 64 65 20 7b 0a 20 20 43 52 45 41 54 45 20 56  ode {.  CREATE V
96d0: 49 52 54 55 41 4c 20 54 41 42 4c 45 20 6d 61 69  IRTUAL TABLE mai
96e0: 6c 20 55 53 49 4e 47 20 66 74 73 33 28 73 75 62  l USING fts3(sub
96f0: 6a 65 63 74 2c 20 62 6f 64 79 29 3b 0a 20 20 49  ject, body);.  I
9700: 4e 53 45 52 54 20 49 4e 54 4f 20 6d 61 69 6c 20  NSERT INTO mail 
9710: 56 41 4c 55 45 53 28 27 68 65 6c 6c 6f 20 77 6f  VALUES('hello wo
9720: 72 6c 64 27 2c 20 27 54 68 69 73 20 6d 65 73 73  rld', 'This mess
9730: 61 67 65 20 69 73 20 61 20 68 65 6c 6c 6f 20 77  age is a hello w
9740: 6f 72 6c 64 20 6d 65 73 73 61 67 65 2e 27 29 3b  orld message.');
9750: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6d  .  INSERT INTO m
9760: 61 69 6c 20 56 41 4c 55 45 53 28 27 75 72 67 65  ail VALUES('urge
9770: 6e 74 3a 20 73 65 72 69 6f 75 73 27 2c 20 27 54  nt: serious', 'T
9780: 68 69 73 20 6d 61 69 6c 20 69 73 20 73 65 65 6e  his mail is seen
9790: 20 61 73 20 61 20 6d 6f 72 65 20 73 65 72 69 6f   as a more serio
97a0: 75 73 20 6d 61 69 6c 27 29 3b 0a 0a 20 20 3c 69  us mail');..  <i
97b0: 3e 2d 2d 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  >-- The followin
97c0: 67 20 71 75 65 72 79 20 72 65 74 75 72 6e 73 20  g query returns 
97d0: 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 28 61 73  a single row (as
97e0: 20 69 74 20 6d 61 74 63 68 65 73 20 6f 6e 6c 79   it matches only
97f0: 20 74 68 65 20 66 69 72 73 74 3c 2f 69 3e 0a 20   the first</i>. 
9800: 20 3c 69 3e 2d 2d 20 65 6e 74 72 79 20 69 6e 20   <i>-- entry in 
9810: 74 61 62 6c 65 20 22 6d 61 69 6c 22 2e 20 54 68  table "mail". Th
9820: 65 20 74 65 78 74 20 72 65 74 75 72 6e 65 64 20  e text returned 
9830: 62 79 20 74 68 65 20 6f 66 66 73 65 74 73 20 66  by the offsets f
9840: 75 6e 63 74 69 6f 6e 20 69 73 3c 2f 69 3e 0a 20  unction is</i>. 
9850: 20 3c 69 3e 2d 2d 20 22 30 20 30 20 36 20 35 20   <i>-- "0 0 6 5 
9860: 31 20 30 20 32 34 20 35 22 2e 3c 2f 69 3e 0a 20  1 0 24 5".</i>. 
9870: 20 3c 69 3e 2d 2d 3c 2f 69 3e 0a 20 20 3c 69 3e   <i>--</i>.  <i>
9880: 2d 2d 20 54 68 65 20 66 69 72 73 74 20 73 65 74  -- The first set
9890: 20 6f 66 20 66 6f 75 72 20 69 6e 74 65 67 65 72   of four integer
98a0: 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
98b0: 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 63 6f  indicate that co
98c0: 6c 75 6d 6e 20 30 3c 2f 69 3e 0a 20 20 3c 69 3e  lumn 0</i>.  <i>
98d0: 2d 2d 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69  -- contains an i
98e0: 6e 73 74 61 6e 63 65 20 6f 66 20 74 65 72 6d 20  nstance of term 
98f0: 30 20 28 22 77 6f 72 6c 64 22 29 20 61 74 20 62  0 ("world") at b
9900: 79 74 65 20 6f 66 66 73 65 74 20 36 2e 20 54 68  yte offset 6. Th
9910: 65 20 74 65 72 6d 20 69 6e 73 74 61 6e 63 65 3c  e term instance<
9920: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 69 73 20 35  /i>.  <i>-- is 5
9930: 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20   bytes in size. 
9940: 54 68 65 20 73 65 63 6f 6e 64 20 73 65 74 20 6f  The second set o
9950: 66 20 66 6f 75 72 20 69 6e 74 65 67 65 72 73 20  f four integers 
9960: 73 68 6f 77 73 20 74 68 61 74 20 63 6f 6c 75 6d  shows that colum
9970: 6e 20 31 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20  n 1</i>.  <i>-- 
9980: 6f 66 20 74 68 65 20 6d 61 74 63 68 65 64 20 72  of the matched r
9990: 6f 77 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69  ow contains an i
99a0: 6e 73 74 61 6e 63 65 20 6f 66 20 74 65 72 6d 20  nstance of term 
99b0: 30 20 28 22 77 6f 72 6c 64 22 29 20 61 74 20 62  0 ("world") at b
99c0: 79 74 65 20 6f 66 66 73 65 74 3c 2f 69 3e 0a 20  yte offset</i>. 
99d0: 20 3c 69 3e 2d 2d 20 32 34 2e 20 41 67 61 69 6e   <i>-- 24. Again
99e0: 2c 20 74 68 65 20 74 65 72 6d 20 69 6e 73 74 61  , the term insta
99f0: 6e 63 65 20 69 73 20 35 20 62 79 74 65 73 20 69  nce is 5 bytes i
9a00: 6e 20 73 69 7a 65 2e 3c 2f 69 3e 0a 20 20 53 45  n size.</i>.  SE
9a10: 4c 45 43 54 20 6f 66 66 73 65 74 73 28 6d 61 69  LECT offsets(mai
9a20: 6c 29 20 46 52 4f 4d 20 6d 61 69 6c 20 57 48 45  l) FROM mail WHE
9a30: 52 45 20 6d 61 69 6c 20 4d 41 54 43 48 20 27 77  RE mail MATCH 'w
9a40: 6f 72 6c 64 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20  orld';..  <i>-- 
9a50: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75  The following qu
9a60: 65 72 79 20 72 65 74 75 72 6e 73 20 61 6c 73 6f  ery returns also
9a70: 20 6d 61 74 63 68 65 73 20 6f 6e 6c 79 20 74 68   matches only th
9a80: 65 20 66 69 72 73 74 20 72 6f 77 20 69 6e 20 74  e first row in t
9a90: 61 62 6c 65 20 22 6d 61 69 6c 22 2e 3c 2f 69 3e  able "mail".</i>
9aa0: 0a 20 20 3c 69 3e 2d 2d 20 49 6e 20 74 68 69 73  .  <i>-- In this
9ab0: 20 63 61 73 65 20 74 68 65 20 72 65 74 75 72 6e   case the return
9ac0: 65 64 20 74 65 78 74 20 69 73 20 22 31 20 30 20  ed text is "1 0 
9ad0: 35 20 37 20 31 20 30 20 33 30 20 37 22 2e 3c 2f  5 7 1 0 30 7".</
9ae0: 69 3e 0a 20 20 53 45 4c 45 43 54 20 6f 66 66 73  i>.  SELECT offs
9af0: 65 74 73 28 6d 61 69 6c 29 20 46 52 4f 4d 20 6d  ets(mail) FROM m
9b00: 61 69 6c 20 57 48 45 52 45 20 6d 61 69 6c 20 4d  ail WHERE mail M
9b10: 41 54 43 48 20 27 6d 65 73 73 61 67 65 27 3b 0a  ATCH 'message';.
9b20: 0a 20 20 3c 69 3e 2d 2d 20 54 68 65 20 66 6f 6c  .  <i>-- The fol
9b30: 6c 6f 77 69 6e 67 20 71 75 65 72 79 20 6d 61 74  lowing query mat
9b40: 63 68 65 73 20 74 68 65 20 73 65 63 6f 6e 64 20  ches the second 
9b50: 72 6f 77 20 69 6e 20 74 61 62 6c 65 20 22 6d 61  row in table "ma
9b60: 69 6c 22 2e 20 49 74 20 72 65 74 75 72 6e 73 20  il". It returns 
9b70: 74 68 65 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20  the</i>.  <i>-- 
9b80: 74 65 78 74 20 22 31 20 30 20 32 38 20 37 20 31  text "1 0 28 7 1
9b90: 20 31 20 33 36 20 34 22 2e 20 4f 6e 6c 79 20 74   1 36 4". Only t
9ba0: 68 6f 73 65 20 6f 63 63 75 72 65 6e 63 65 73 20  hose occurences 
9bb0: 6f 66 20 74 65 72 6d 73 20 22 73 65 72 69 6f 75  of terms "seriou
9bc0: 73 22 20 61 6e 64 20 22 6d 61 69 6c 22 3c 2f 69  s" and "mail"</i
9bd0: 3e 0a 20 20 3c 69 3e 2d 2d 20 74 68 61 74 20 61  >.  <i>-- that a
9be0: 72 65 20 70 61 72 74 20 6f 66 20 61 6e 20 69 6e  re part of an in
9bf0: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 70 68  stance of the ph
9c00: 72 61 73 65 20 22 73 65 72 69 6f 75 73 20 6d 61  rase "serious ma
9c10: 69 6c 22 20 61 72 65 20 69 64 65 6e 74 69 66 69  il" are identifi
9c20: 65 64 3b 20 74 68 65 3c 2f 69 3e 0a 20 20 3c 69  ed; the</i>.  <i
9c30: 3e 2d 2d 20 6f 74 68 65 72 20 6f 63 63 75 72 65  >-- other occure
9c40: 6e 63 65 73 20 6f 66 20 22 73 65 72 69 6f 75 73  nces of "serious
9c50: 22 20 61 6e 64 20 22 6d 61 69 6c 22 20 61 72 65  " and "mail" are
9c60: 20 69 67 6e 6f 72 65 64 2e 3c 2f 69 3e 0a 20 20   ignored.</i>.  
9c70: 53 45 4c 45 43 54 20 6f 66 66 73 65 74 73 28 6d  SELECT offsets(m
9c80: 61 69 6c 29 20 46 52 4f 4d 20 6d 61 69 6c 20 57  ail) FROM mail W
9c90: 48 45 52 45 20 6d 61 69 6c 20 4d 41 54 43 48 20  HERE mail MATCH 
9ca0: 27 22 73 65 72 69 6f 75 73 20 6d 61 69 6c 22 27  '"serious mail"'
9cb0: 3b 0a 7d 5d 0a 0a 5b 68 32 20 22 54 68 65 20 53  ;.}]..[h2 "The S
9cc0: 6e 69 70 70 65 74 20 46 75 6e 63 74 69 6f 6e 22  nippet Function"
9cd0: 5d 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 73 6e 69  ]..<p>.  The sni
9ce0: 70 70 65 74 20 66 75 6e 63 74 69 6f 6e 20 69 73  ppet function is
9cf0: 20 75 73 65 64 20 74 6f 20 63 72 65 61 74 65 20   used to create 
9d00: 66 6f 72 6d 61 74 74 65 64 20 66 72 61 67 6d 65  formatted fragme
9d10: 6e 74 73 20 6f 66 20 64 6f 63 75 6d 65 6e 74 20  nts of document 
9d20: 74 65 78 74 0a 20 20 66 6f 72 20 64 69 73 70 6c  text.  for displ
9d30: 61 79 20 61 73 20 70 61 72 74 20 6f 66 20 61 20  ay as part of a 
9d40: 66 75 6c 6c 2d 74 65 78 74 20 71 75 65 72 79 20  full-text query 
9d50: 72 65 73 75 6c 74 73 20 72 65 70 6f 72 74 2e 20  results report. 
9d60: 54 68 65 20 73 6e 69 70 70 65 74 20 66 75 6e 63  The snippet func
9d70: 74 69 6f 6e 20 0a 20 20 6d 61 79 20 62 65 20 70  tion .  may be p
9d80: 61 73 73 65 64 20 62 65 74 77 65 65 6e 20 6f 6e  assed between on
9d90: 65 20 61 6e 64 20 66 6f 75 72 20 61 72 67 75 6d  e and four argum
9da0: 65 6e 74 73 2c 20 61 73 20 66 6f 6c 6c 6f 77 73  ents, as follows
9db0: 3a 0a 0a 5b 54 61 62 6c 65 5d 0a 20 20 5b 54 72  :..[Table].  [Tr
9dc0: 5d 3c 74 68 3e 41 72 67 75 6d 65 6e 74 20 3c 74  ]<th>Argument <t
9dd0: 68 3e 44 65 66 61 75 6c 74 20 56 61 6c 75 65 20  h>Default Value 
9de0: 3c 74 68 3e 44 65 73 63 72 69 70 74 69 6f 6e 0a  <th>Description.
9df0: 20 20 5b 54 72 5d 3c 74 64 3e 30 20 3c 74 64 3e    [Tr]<td>0 <td>
9e00: 4e 2f 41 0a 20 20 20 20 20 20 3c 74 64 3e 20 54  N/A.      <td> T
9e10: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
9e20: 74 20 74 6f 20 74 68 65 20 73 6e 69 70 70 65 74  t to the snippet
9e30: 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 61   function must a
9e40: 6c 77 61 79 73 20 62 65 20 74 68 65 20 73 70 65  lways be the spe
9e50: 63 69 61 6c 0a 20 20 20 20 20 20 20 20 20 20 20  cial.           
9e60: 68 69 64 64 65 6e 20 63 6f 6c 75 6d 6e 20 6f 66  hidden column of
9e70: 20 74 68 65 20 46 54 53 33 20 74 61 62 6c 65 20   the FTS3 table 
9e80: 74 68 61 74 20 74 61 6b 65 73 20 74 68 65 20 73  that takes the s
9e90: 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20  ame name as the 
9ea0: 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20  table.          
9eb0: 20 69 74 73 65 6c 66 2e 0a 20 20 5b 54 72 5d 3c   itself..  [Tr]<
9ec0: 74 64 3e 31 20 3c 74 64 3e 22 26 6c 74 3b 62 26  td>1 <td>"&lt;b&
9ed0: 67 74 3b 22 0a 20 20 20 20 20 20 3c 74 64 3e 20  gt;".      <td> 
9ee0: 54 68 65 20 22 73 74 61 72 74 20 6d 61 74 63 68  The "start match
9ef0: 22 20 74 65 78 74 2e 0a 20 20 5b 54 72 5d 3c 74  " text..  [Tr]<t
9f00: 64 3e 32 20 3c 74 64 3e 22 26 6c 74 3b 62 26 67  d>2 <td>"&lt;b&g
9f10: 74 3b 22 0a 20 20 20 20 20 20 3c 74 64 3e 20 54  t;".      <td> T
9f20: 68 65 20 22 65 6e 64 20 6d 61 74 63 68 22 20 74  he "end match" t
9f30: 65 78 74 2e 0a 20 20 5b 54 72 5d 3c 74 64 3e 33  ext..  [Tr]<td>3
9f40: 20 3c 74 64 3e 22 26 6c 74 3b 62 26 67 74 3b 2e   <td>"&lt;b&gt;.
9f50: 2e 2e 26 6c 74 3b 2f 62 26 67 74 3b 22 0a 20 20  ..&lt;/b&gt;".  
9f60: 20 20 20 20 3c 74 64 3e 20 54 68 65 20 22 65 6c      <td> The "el
9f70: 6c 69 70 73 65 73 22 20 74 65 78 74 2e 0a 20 20  lipses" text..  
9f80: 5b 54 72 5d 3c 74 64 3e 34 20 3c 74 64 3e 2d 31  [Tr]<td>4 <td>-1
9f90: 0a 20 20 20 20 20 20 3c 74 64 3e 20 54 68 65 20  .      <td> The 
9fa0: 46 54 53 33 20 74 61 62 6c 65 20 63 6f 6c 75 6d  FTS3 table colum
9fb0: 6e 20 6e 75 6d 62 65 72 20 74 6f 20 65 78 74 72  n number to extr
9fc0: 61 63 74 20 74 68 65 20 72 65 74 75 72 6e 65 64  act the returned
9fd0: 20 66 72 61 67 6d 65 6e 74 73 20 6f 66 0a 20 20   fragments of.  
9fe0: 20 20 20 20 20 20 20 20 20 74 65 78 74 20 66 72           text fr
9ff0: 6f 6d 2e 20 43 6f 6c 75 6d 6e 73 20 61 72 65 20  om. Columns are 
a000: 6e 75 6d 62 65 72 65 64 20 66 72 6f 6d 20 6c 65  numbered from le
a010: 66 74 20 74 6f 20 72 69 67 68 74 20 73 74 61 72  ft to right star
a020: 74 69 6e 67 20 77 69 74 68 0a 20 20 20 20 20 20  ting with.      
a030: 20 20 20 20 20 7a 65 72 6f 2e 20 41 20 6e 65 67       zero. A neg
a040: 61 74 69 76 65 20 76 61 6c 75 65 20 69 6e 64 69  ative value indi
a050: 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20 74  cates that the t
a060: 65 78 74 20 6d 61 79 20 62 65 20 65 78 74 72 61  ext may be extra
a070: 63 74 65 64 0a 20 20 20 20 20 20 20 20 20 20 20  cted.           
a080: 66 72 6f 6d 20 61 6e 79 20 63 6f 6c 75 6d 6e 2e  from any column.
a090: 0a 20 20 5b 54 72 5d 3c 74 64 3e 35 20 3c 74 64  .  [Tr]<td>5 <td
a0a0: 3e 2d 31 35 0a 20 20 20 20 20 20 3c 74 64 3e 20  >-15.      <td> 
a0b0: 54 68 65 20 61 62 73 6f 6c 75 74 65 20 76 61 6c  The absolute val
a0c0: 75 65 20 6f 66 20 74 68 69 73 20 69 6e 74 65 67  ue of this integ
a0d0: 65 72 20 61 72 67 75 6d 65 6e 74 20 69 73 20 75  er argument is u
a0e0: 73 65 64 20 61 73 20 74 68 65 20 0a 20 20 20 20  sed as the .    
a0f0: 20 20 20 20 20 20 20 28 61 70 70 72 6f 78 69 6d         (approxim
a100: 61 74 65 29 20 6e 75 6d 62 65 72 20 6f 66 20 74  ate) number of t
a110: 6f 6b 65 6e 73 20 74 6f 20 69 6e 63 6c 75 64 65  okens to include
a120: 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64   in the returned
a130: 20 74 65 78 74 20 0a 20 20 20 20 20 20 20 20 20   text .         
a140: 20 20 76 61 6c 75 65 2e 20 54 68 65 20 6d 61 78    value. The max
a150: 69 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20 61  imum allowable a
a160: 62 73 6f 6c 75 74 65 20 76 61 6c 75 65 20 69 73  bsolute value is
a170: 20 36 34 2e 20 54 68 65 20 76 61 6c 75 65 20 6f   64. The value o
a180: 66 0a 20 20 20 20 20 20 20 20 20 20 20 74 68 69  f.           thi
a190: 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20 72 65  s argument is re
a1a0: 66 65 72 65 64 20 74 6f 20 61 73 20 3c 69 3e 4e  fered to as <i>N
a1b0: 3c 2f 69 3e 20 69 6e 20 74 68 65 20 64 69 73 63  </i> in the disc
a1c0: 75 73 73 69 6f 6e 20 62 65 6c 6f 77 2e 0a 3c 2f  ussion below..</
a1d0: 74 61 62 6c 65 3e 0a 0a 3c 70 3e 0a 20 20 54 68  table>..<p>.  Th
a1e0: 65 20 73 6e 69 70 70 65 74 20 66 75 6e 63 74 69  e snippet functi
a1f0: 6f 6e 20 66 69 72 73 74 20 61 74 74 65 6d 70 74  on first attempt
a200: 73 20 74 6f 20 66 69 6e 64 20 61 20 66 72 61 67  s to find a frag
a210: 6d 65 6e 74 20 6f 66 20 74 65 78 74 20 63 6f 6e  ment of text con
a220: 73 69 73 74 69 6e 67 0a 20 20 6f 66 20 3c 69 3e  sisting.  of <i>
a230: 7c 4e 7c 3c 2f 69 3e 20 74 6f 6b 65 6e 73 20 77  |N|</i> tokens w
a240: 69 74 68 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ithin the curren
a250: 74 20 72 6f 77 20 74 68 61 74 20 63 6f 6e 74 61  t row that conta
a260: 69 6e 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  ins at least one
a270: 20 70 68 72 61 73 65 20 0a 20 20 6d 61 74 63 68   phrase .  match
a280: 20 66 6f 72 20 65 61 63 68 20 6d 61 74 63 68 61   for each matcha
a290: 62 6c 65 20 70 68 72 61 73 65 20 6d 61 74 63 68  ble phrase match
a2a0: 65 64 20 73 6f 6d 65 77 68 65 72 65 20 69 6e 20  ed somewhere in 
a2b0: 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 2c  the current row,
a2c0: 20 0a 20 20 77 68 65 72 65 20 3c 69 3e 7c 4e 7c   .  where <i>|N|
a2d0: 3c 2f 69 3e 20 69 73 20 74 68 65 20 61 62 73 6f  </i> is the abso
a2e0: 6c 75 74 65 20 76 61 6c 75 65 20 6f 66 20 74 68  lute value of th
a2f0: 65 20 73 69 78 74 68 20 61 72 67 75 6d 65 6e 74  e sixth argument
a300: 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 0a 20   passed to the. 
a310: 20 73 6e 69 70 70 65 74 20 66 75 6e 63 74 69 6f   snippet functio
a320: 6e 2e 20 49 66 20 74 68 65 20 74 65 78 74 20 73  n. If the text s
a330: 74 6f 72 65 64 20 69 6e 20 61 20 73 69 6e 67 6c  tored in a singl
a340: 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e  e column contain
a350: 73 20 6c 65 73 73 20 74 68 61 6e 0a 20 20 3c 69  s less than.  <i
a360: 3e 7c 4e 7c 3c 2f 69 3e 20 74 6f 6b 65 6e 73 2c  >|N|</i> tokens,
a370: 20 74 68 65 6e 20 74 68 65 20 65 6e 74 69 72 65   then the entire
a380: 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 73   column value is
a390: 20 63 6f 6e 73 69 64 65 72 65 64 2e 20 54 65 78   considered. Tex
a3a0: 74 20 66 72 61 67 6d 65 6e 74 73 20 0a 20 20 6d  t fragments .  m
a3b0: 61 79 20 6e 6f 74 20 73 70 61 6e 20 6d 75 6c 74  ay not span mult
a3c0: 69 70 6c 65 20 63 6f 6c 75 6d 6e 73 2e 0a 0a 3c  iple columns...<
a3d0: 70 3e 0a 20 20 49 66 20 73 75 63 68 20 61 20 74  p>.  If such a t
a3e0: 65 78 74 20 66 72 61 67 6d 65 6e 74 20 63 61 6e  ext fragment can
a3f0: 20 62 65 20 66 6f 75 6e 64 2c 20 69 74 20 69 73   be found, it is
a400: 20 72 65 74 75 72 6e 65 64 20 77 69 74 68 20 74   returned with t
a410: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 6d  he following.  m
a420: 6f 64 69 66 69 63 61 74 69 6f 6e 73 3a 0a 0a 3c  odifications:..<
a430: 75 6c 3e 0a 20 20 3c 6c 69 3e 20 49 66 20 74 68  ul>.  <li> If th
a440: 65 20 74 65 78 74 20 66 72 61 67 6d 65 6e 74 20  e text fragment 
a450: 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 61  does not begin a
a460: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61  t the start of a
a470: 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 0a 20   column value,. 
a480: 20 20 20 20 20 20 74 68 65 20 22 65 6c 6c 69 70        the "ellip
a490: 73 65 73 22 20 74 65 78 74 20 69 73 20 70 72 65  ses" text is pre
a4a0: 70 65 6e 64 65 64 20 74 6f 20 69 74 2e 0a 20 20  pended to it..  
a4b0: 3c 6c 69 3e 20 49 66 20 74 68 65 20 74 65 78 74  <li> If the text
a4c0: 20 66 72 61 67 6d 65 6e 74 20 64 6f 65 73 20 6e   fragment does n
a4d0: 6f 74 20 66 69 6e 69 73 68 20 61 74 20 74 68 65  ot finish at the
a4e0: 20 65 6e 64 20 6f 66 20 61 20 63 6f 6c 75 6d 6e   end of a column
a4f0: 20 76 61 6c 75 65 2c 0a 20 20 20 20 20 20 20 74   value,.       t
a500: 68 65 20 22 65 6c 6c 69 70 73 65 73 22 20 74 65  he "ellipses" te
a510: 78 74 20 69 73 20 61 70 70 65 6e 64 65 64 20 74  xt is appended t
a520: 6f 20 69 74 2e 0a 20 20 3c 6c 69 3e 20 46 6f 72  o it..  <li> For
a530: 20 65 61 63 68 20 74 6f 6b 65 6e 20 69 6e 20 74   each token in t
a540: 68 65 20 74 65 78 74 20 66 72 61 67 6d 65 6e 74  he text fragment
a550: 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
a560: 20 61 20 70 68 72 61 73 65 20 6d 61 74 63 68 2c   a phrase match,
a570: 0a 20 20 20 20 20 20 20 74 68 65 20 22 73 74 61  .       the "sta
a580: 72 74 20 6d 61 74 63 68 22 20 74 65 78 74 20 69  rt match" text i
a590: 73 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  s inserted into 
a5a0: 74 68 65 20 66 72 61 67 6d 65 6e 74 20 62 65 66  the fragment bef
a5b0: 6f 72 65 20 74 68 65 20 74 6f 6b 65 6e 2c 0a 20  ore the token,. 
a5c0: 20 20 20 20 20 20 61 6e 64 20 74 68 65 20 22 65        and the "e
a5d0: 6e 64 20 6d 61 74 63 68 22 20 74 65 78 74 20 69  nd match" text i
a5e0: 73 20 69 6e 73 65 72 74 65 64 20 69 6d 6d 65 64  s inserted immed
a5f0: 69 61 74 65 6c 79 20 61 66 74 65 72 20 69 74 2e  iately after it.
a600: 0a 3c 2f 75 6c 3e 0a 0a 3c 70 3e 0a 20 20 49 66  .</ul>..<p>.  If
a610: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 73   more than one s
a620: 75 63 68 20 66 72 61 67 6d 65 6e 74 20 63 61 6e  uch fragment can
a630: 20 62 65 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20   be found, then 
a640: 66 72 61 67 6d 65 6e 74 73 20 74 68 61 74 20 63  fragments that c
a650: 6f 6e 74 61 69 6e 0a 20 20 61 20 6c 61 72 67 65  ontain.  a large
a660: 72 20 6e 75 6d 62 65 72 20 6f 66 20 22 65 78 74  r number of "ext
a670: 72 61 22 20 70 68 72 61 73 65 20 6d 61 74 63 68  ra" phrase match
a680: 65 73 20 61 72 65 20 66 61 76 6f 75 72 65 64 2e  es are favoured.
a690: 20 54 68 65 20 73 74 61 72 74 20 6f 66 0a 20 20   The start of.  
a6a0: 74 68 65 20 73 65 6c 65 63 74 65 64 20 74 65 78  the selected tex
a6b0: 74 20 66 72 61 67 6d 65 6e 74 20 6d 61 79 20 62  t fragment may b
a6c0: 65 20 6d 6f 76 65 64 20 61 20 66 65 77 20 74 6f  e moved a few to
a6d0: 6b 65 6e 73 20 66 6f 72 77 61 72 64 20 6f 72 20  kens forward or 
a6e0: 62 61 63 6b 77 61 72 64 0a 20 20 74 6f 20 61 74  backward.  to at
a6f0: 74 65 6d 70 74 20 74 6f 20 63 6f 6e 63 65 6e 74  tempt to concent
a700: 72 61 74 65 20 74 68 65 20 70 68 72 61 73 65 20  rate the phrase 
a710: 6d 61 74 63 68 65 73 20 74 6f 77 61 72 64 20 74  matches toward t
a720: 68 65 20 63 65 6e 74 65 72 20 6f 66 20 74 68 65  he center of the
a730: 0a 20 20 66 72 61 67 6d 65 6e 74 2e 0a 0a 3c 70  .  fragment...<p
a740: 3e 0a 20 20 41 73 73 75 6d 69 6e 67 20 3c 69 3e  >.  Assuming <i>
a750: 4e 3c 2f 69 3e 20 69 73 20 61 20 70 6f 73 69 74  N</i> is a posit
a760: 69 76 65 20 76 61 6c 75 65 2c 20 69 66 20 6e 6f  ive value, if no
a770: 20 66 72 61 67 6d 65 6e 74 73 20 63 61 6e 20 62   fragments can b
a780: 65 20 66 6f 75 6e 64 20 74 68 61 74 0a 20 20 63  e found that.  c
a790: 6f 6e 74 61 69 6e 20 61 6e 20 70 68 72 61 73 65  ontain an phrase
a7a0: 20 6d 61 74 63 68 20 63 6f 72 72 65 73 70 6f 6e   match correspon
a7b0: 64 69 6e 67 20 74 6f 20 65 61 63 68 20 6d 61 74  ding to each mat
a7c0: 63 68 61 62 6c 65 20 70 68 72 61 73 65 2c 20 74  chable phrase, t
a7d0: 68 65 20 73 6e 69 70 70 65 74 0a 20 20 66 75 6e  he snippet.  fun
a7e0: 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
a7f0: 6f 20 66 69 6e 64 20 74 77 6f 20 66 72 61 67 6d  o find two fragm
a800: 65 6e 74 73 20 6f 66 20 61 70 70 72 6f 78 69 6d  ents of approxim
a810: 61 74 65 6c 79 20 3c 69 3e 4e 3c 2f 69 3e 2f 32  ately <i>N</i>/2
a820: 20 74 6f 6b 65 6e 73 0a 20 20 74 68 61 74 20 62   tokens.  that b
a830: 65 74 77 65 65 6e 20 74 68 65 6d 20 63 6f 6e 74  etween them cont
a840: 61 69 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  ain at least one
a850: 20 70 68 72 61 73 65 20 6d 61 74 63 68 20 66 6f   phrase match fo
a860: 72 20 65 61 63 68 20 6d 61 74 63 68 61 62 6c 65  r each matchable
a870: 20 70 68 72 61 73 65 0a 20 20 6d 61 74 63 68 65   phrase.  matche
a880: 64 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74  d by the current
a890: 20 72 6f 77 2e 20 49 66 20 74 68 69 73 20 66 61   row. If this fa
a8a0: 69 6c 73 2c 20 61 74 74 65 6d 70 74 73 20 61 72  ils, attempts ar
a8b0: 65 20 6d 61 64 65 20 74 6f 20 66 69 6e 64 20 74  e made to find t
a8c0: 68 72 65 65 0a 20 20 66 72 61 67 6d 65 6e 74 73  hree.  fragments
a8d0: 20 6f 66 20 3c 69 3e 4e 3c 2f 69 3e 2f 33 20 74   of <i>N</i>/3 t
a8e0: 6f 6b 65 6e 73 20 65 61 63 68 20 61 6e 64 20 66  okens each and f
a8f0: 69 6e 61 6c 6c 79 20 66 6f 75 72 20 3c 69 3e 4e  inally four <i>N
a900: 3c 2f 69 3e 2f 34 20 74 6f 6b 65 6e 0a 20 20 66  </i>/4 token.  f
a910: 72 61 67 6d 65 6e 74 73 2e 20 49 66 20 61 20 73  ragments. If a s
a920: 65 74 20 6f 66 20 66 6f 75 72 20 66 72 61 67 6d  et of four fragm
a930: 65 6e 74 73 20 63 61 6e 6e 6f 74 20 62 65 20 66  ents cannot be f
a940: 6f 75 6e 64 20 74 68 61 74 20 65 6e 63 6f 6d 70  ound that encomp
a950: 61 73 73 65 73 20 74 68 65 0a 20 20 72 65 71 75  asses the.  requ
a960: 69 72 65 64 20 70 68 72 61 73 65 20 6d 61 74 63  ired phrase matc
a970: 68 65 73 2c 20 74 68 65 20 66 6f 75 72 20 66 72  hes, the four fr
a980: 61 67 6d 65 6e 74 73 20 6f 66 20 3c 69 3e 4e 3c  agments of <i>N<
a990: 2f 69 3e 2f 34 20 74 6f 6b 65 6e 73 20 74 68 61  /i>/4 tokens tha
a9a0: 74 20 70 72 6f 76 69 64 65 0a 20 20 74 68 65 20  t provide.  the 
a9b0: 62 65 73 74 20 63 6f 76 65 72 61 67 65 20 61 72  best coverage ar
a9c0: 65 20 73 65 6c 65 63 74 65 64 2e 0a 0a 3c 70 3e  e selected...<p>
a9d0: 0a 20 20 49 66 20 3c 69 3e 4e 3c 2f 69 3e 20 69  .  If <i>N</i> i
a9e0: 73 20 61 20 6e 65 67 61 74 69 76 65 20 76 61 6c  s a negative val
a9f0: 75 65 2c 20 61 6e 64 20 6e 6f 20 73 69 6e 67 6c  ue, and no singl
aa00: 65 20 66 72 61 67 6d 65 6e 74 20 63 61 6e 20 62  e fragment can b
aa10: 65 20 66 6f 75 6e 64 20 0a 20 20 63 6f 6e 74 61  e found .  conta
aa20: 69 6e 69 6e 67 20 74 68 65 20 72 65 71 75 69 72  ining the requir
aa30: 65 64 20 70 68 72 61 73 65 20 6d 61 74 63 68 65  ed phrase matche
aa40: 73 2c 20 74 68 65 20 73 6e 69 70 70 65 74 20 66  s, the snippet f
aa50: 75 6e 63 74 69 6f 6e 20 73 65 61 72 63 68 65 73  unction searches
aa60: 0a 20 20 66 6f 72 20 74 77 6f 20 66 72 61 67 6d  .  for two fragm
aa70: 65 6e 74 73 20 6f 66 20 3c 69 3e 7c 4e 7c 3c 2f  ents of <i>|N|</
aa80: 69 3e 20 74 6f 6b 65 6e 73 20 65 61 63 68 2c 20  i> tokens each, 
aa90: 74 68 65 6e 20 74 68 72 65 65 2c 20 74 68 65 6e  then three, then
aaa0: 20 66 6f 75 72 2e 20 49 6e 0a 20 20 6f 74 68 65   four. In.  othe
aab0: 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68 65 20  r words, if the 
aac0: 73 70 65 63 69 66 69 65 64 20 76 61 6c 75 65 20  specified value 
aad0: 6f 66 20 3c 69 3e 4e 3c 2f 69 3e 20 69 73 20 6e  of <i>N</i> is n
aae0: 65 67 61 74 69 76 65 2c 20 74 68 65 20 73 69 7a  egative, the siz
aaf0: 65 73 0a 20 20 6f 66 20 74 68 65 20 66 72 61 67  es.  of the frag
ab00: 6d 65 6e 74 73 20 69 73 20 6e 6f 74 20 64 65 63  ments is not dec
ab10: 72 65 61 73 65 64 20 69 66 20 6d 6f 72 65 20 74  reased if more t
ab20: 68 61 6e 20 6f 6e 65 20 66 72 61 67 6d 65 6e 74  han one fragment
ab30: 20 69 73 20 72 65 71 75 69 72 65 64 0a 20 20 74   is required.  t
ab40: 6f 20 70 72 6f 76 69 64 65 20 74 68 65 20 64 65  o provide the de
ab50: 73 69 72 65 64 20 70 68 72 61 73 65 20 6d 61 74  sired phrase mat
ab60: 63 68 20 63 6f 76 65 72 61 67 65 2e 0a 0a 3c 70  ch coverage...<p
ab70: 3e 0a 20 20 41 66 74 65 72 20 74 68 65 20 3c 69  >.  After the <i
ab80: 3e 4d 3c 2f 69 3e 20 66 72 61 67 6d 65 6e 74 73  >M</i> fragments
ab90: 20 68 61 76 65 20 62 65 65 6e 20 6c 6f 63 61 74   have been locat
aba0: 65 64 2c 20 77 68 65 72 65 20 3c 69 3e 4d 3c 2f  ed, where <i>M</
abb0: 69 3e 20 69 73 20 62 65 74 77 65 65 6e 0a 20 20  i> is between.  
abc0: 74 77 6f 20 61 6e 64 20 66 6f 75 72 20 61 73 20  two and four as 
abd0: 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65  described in the
abe0: 20 70 61 72 61 67 72 61 70 68 73 20 61 62 6f 76   paragraphs abov
abf0: 65 2c 20 74 68 65 79 20 61 72 65 20 6a 6f 69 6e  e, they are join
ac00: 65 64 20 74 6f 67 65 74 68 65 72 0a 20 20 69 6e  ed together.  in
ac10: 20 73 6f 72 74 65 64 20 6f 72 64 65 72 20 77 69   sorted order wi
ac20: 74 68 20 74 68 65 20 22 65 6c 6c 69 70 73 65 73  th the "ellipses
ac30: 22 20 74 65 78 74 20 73 65 70 61 72 61 74 69 6e  " text separatin
ac40: 67 20 74 68 65 6d 2e 20 54 68 65 20 74 68 72 65  g them. The thre
ac50: 65 20 0a 20 20 6d 6f 64 69 66 69 63 61 74 69 6f  e .  modificatio
ac60: 6e 73 20 65 6e 75 6d 65 72 61 74 65 64 20 65 61  ns enumerated ea
ac70: 72 6c 69 65 72 20 61 72 65 20 70 65 72 66 6f 72  rlier are perfor
ac80: 6d 65 64 20 6f 6e 20 74 68 65 20 74 65 78 74 20  med on the text 
ac90: 62 65 66 6f 72 65 20 69 74 20 69 73 20 0a 20 20  before it is .  
aca0: 72 65 74 75 72 6e 65 64 2e 0a 0a 5b 43 6f 64 65  returned...[Code
acb0: 20 7b 0a 20 20 3c 62 3e 4e 6f 74 65 3a 20 49 6e   {.  <b>Note: In
acc0: 20 74 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20 65   this block of e
acd0: 78 61 6d 70 6c 65 73 2c 20 6e 65 77 6c 69 6e 65  xamples, newline
ace0: 73 20 61 6e 64 20 77 68 69 74 65 73 70 61 63 65  s and whitespace
acf0: 20 63 68 61 72 61 63 74 65 72 73 20 68 61 76 65   characters have
ad00: 0a 20 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64  .  been inserted
ad10: 20 69 6e 74 6f 20 74 68 65 20 64 6f 63 75 6d 65   into the docume
ad20: 6e 74 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  nt inserted into
ad30: 20 74 68 65 20 46 54 53 33 20 74 61 62 6c 65 2c   the FTS3 table,
ad40: 20 61 6e 64 20 74 68 65 20 65 78 70 65 63 74 65   and the expecte
ad50: 64 0a 20 20 72 65 73 75 6c 74 73 20 64 65 73 63  d.  results desc
ad60: 72 69 62 65 64 20 69 6e 20 53 51 4c 20 63 6f 6d  ribed in SQL com
ad70: 6d 65 6e 74 73 2e 20 54 68 69 73 20 69 73 20 64  ments. This is d
ad80: 6f 6e 65 20 74 6f 20 65 6e 68 61 6e 63 65 20 72  one to enhance r
ad90: 65 61 64 61 62 69 6c 69 74 79 20 6f 6e 6c 79 2c  eadability only,
ada0: 0a 20 20 74 68 65 79 20 77 6f 75 6c 64 20 6e 6f  .  they would no
adb0: 74 20 62 65 20 70 72 65 73 65 6e 74 20 69 6e 20  t be present in 
adc0: 61 63 74 75 61 6c 20 53 51 4c 69 74 65 20 63 6f  actual SQLite co
add0: 6d 6d 61 6e 64 73 20 6f 72 20 6f 75 74 70 75 74  mmands or output
ade0: 2e 3c 2f 62 3e 0a 0a 20 20 3c 69 3e 2d 2d 20 43  .</b>..  <i>-- C
adf0: 72 65 61 74 65 20 61 6e 64 20 70 6f 70 75 6c 61  reate and popula
ae00: 74 65 20 61 6e 20 46 54 53 33 20 74 61 62 6c 65  te an FTS3 table
ae10: 2e 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45 20 56  .</i>.  CREATE V
ae20: 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74 65 78  IRTUAL TABLE tex
ae30: 74 20 55 53 49 4e 47 20 66 74 73 33 28 29 3b 0a  t USING fts3();.
ae40: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 65    INSERT INTO te
ae50: 78 74 20 56 41 4c 55 45 53 28 27 0a 20 20 20 20  xt VALUES('.    
ae60: 44 75 72 69 6e 67 20 33 30 20 4e 6f 76 2d 31 20  During 30 Nov-1 
ae70: 44 65 63 2c 20 32 2d 33 6f 43 20 64 72 6f 70 73  Dec, 2-3oC drops
ae80: 2e 20 43 6f 6f 6c 20 69 6e 20 74 68 65 20 75 70  . Cool in the up
ae90: 70 65 72 20 70 6f 72 74 69 6f 6e 2c 20 6d 69 6e  per portion, min
aea0: 69 6d 75 6d 20 74 65 6d 70 65 72 61 74 75 72 65  imum temperature
aeb0: 20 31 34 2d 31 36 6f 43 20 0a 20 20 20 20 61 6e   14-16oC .    an
aec0: 64 20 63 6f 6f 6c 20 65 6c 73 65 77 68 65 72 65  d cool elsewhere
aed0: 2c 20 6d 69 6e 69 6d 75 6d 20 74 65 6d 70 65 72  , minimum temper
aee0: 61 74 75 72 65 20 31 37 2d 32 30 6f 43 2e 20 43  ature 17-20oC. C
aef0: 6f 6c 64 20 74 6f 20 76 65 72 79 20 63 6f 6c 64  old to very cold
af00: 20 6f 6e 20 6d 6f 75 6e 74 61 69 6e 74 6f 70 73   on mountaintops
af10: 2c 20 0a 20 20 20 20 6d 69 6e 69 6d 75 6d 20 74  , .    minimum t
af20: 65 6d 70 65 72 61 74 75 72 65 20 36 2d 31 32 6f  emperature 6-12o
af30: 43 2e 20 4e 6f 72 74 68 65 61 73 74 65 72 6c 79  C. Northeasterly
af40: 20 77 69 6e 64 73 20 31 35 2d 33 30 20 6b 6d 2f   winds 15-30 km/
af50: 68 72 2e 20 41 66 74 65 72 20 74 68 61 74 2c 20  hr. After that, 
af60: 74 65 6d 70 65 72 61 74 75 72 65 20 0a 20 20 20  temperature .   
af70: 20 69 6e 63 72 65 61 73 65 73 2e 20 4e 6f 72 74   increases. Nort
af80: 68 65 61 73 74 65 72 6c 79 20 77 69 6e 64 73 20  heasterly winds 
af90: 31 35 2d 33 30 20 6b 6d 2f 68 72 2e 20 20 20 20  15-30 km/hr.    
afa0: 20 0a 20 20 27 29 3b 0a 0a 20 20 3c 69 3e 2d 2d   .  ');..  <i>--
afb0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71   The following q
afc0: 75 65 72 79 20 72 65 74 75 72 6e 73 20 74 68 65  uery returns the
afd0: 20 74 65 78 74 20 76 61 6c 75 65 3a 3c 2f 69 3e   text value:</i>
afe0: 0a 20 20 3c 69 3e 2d 2d 3c 2f 69 3e 0a 20 20 3c  .  <i>--</i>.  <
aff0: 69 3e 2d 2d 20 20 20 22 26 6c 74 3b 62 26 67 74  i>--   "&lt;b&gt
b000: 3b 2e 2e 2e 26 6c 74 3b 2f 62 26 67 74 3b 63 6f  ;...&lt;/b&gt;co
b010: 6f 6c 20 65 6c 73 65 77 68 65 72 65 2c 20 6d 69  ol elsewhere, mi
b020: 6e 69 6d 75 6d 20 74 65 6d 70 65 72 61 74 75 72  nimum temperatur
b030: 65 20 31 37 2d 32 30 6f 43 2e 20 26 6c 74 3b 62  e 17-20oC. &lt;b
b040: 26 67 74 3b 43 6f 6c 64 26 6c 74 3b 2f 62 26 67  &gt;Cold&lt;/b&g
b050: 74 3b 20 74 6f 20 76 65 72 79 20 3c 2f 69 3e 0a  t; to very </i>.
b060: 20 20 3c 69 3e 2d 2d 20 20 20 20 26 6c 74 3b 62    <i>--    &lt;b
b070: 26 67 74 3b 63 6f 6c 64 26 6c 74 3b 2f 62 26 67  &gt;cold&lt;/b&g
b080: 74 3b 20 6f 6e 20 6d 6f 75 6e 74 61 69 6e 74 6f  t; on mountainto
b090: 70 73 2c 20 6d 69 6e 69 6d 75 6d 20 74 65 6d 70  ps, minimum temp
b0a0: 65 72 61 74 75 72 65 20 36 26 6c 74 3b 62 26 67  erature 6&lt;b&g
b0b0: 74 3b 2e 2e 2e 26 6c 74 3b 2f 62 26 67 74 3b 22  t;...&lt;/b&gt;"
b0c0: 2e 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 3c 2f 69  .</i>.  <i>--</i
b0d0: 3e 0a 20 20 53 45 4c 45 43 54 20 73 6e 69 70 70  >.  SELECT snipp
b0e0: 65 74 28 74 65 78 74 29 20 46 52 4f 4d 20 74 65  et(text) FROM te
b0f0: 78 74 20 57 48 45 52 45 20 74 65 78 74 20 4d 41  xt WHERE text MA
b100: 54 43 48 20 27 63 6f 6c 64 27 3b 0a 0a 20 20 3c  TCH 'cold';..  <
b110: 69 3e 2d 2d 20 54 68 65 20 66 6f 6c 6c 6f 77 69  i>-- The followi
b120: 6e 67 20 71 75 65 72 79 20 72 65 74 75 72 6e 73  ng query returns
b130: 20 74 68 65 20 74 65 78 74 20 76 61 6c 75 65 3a   the text value:
b140: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 3c 2f 69 3e  </i>.  <i>--</i>
b150: 0a 20 20 3c 69 3e 2d 2d 20 20 20 22 2e 2e 2e 74  .  <i>--   "...t
b160: 68 65 20 75 70 70 65 72 20 70 6f 72 74 69 6f 6e  he upper portion
b170: 2c 20 26 23 39 31 3b 6d 69 6e 69 6d 75 6d 26 23  , &#91;minimum&#
b180: 39 33 3b 20 26 23 39 31 3b 74 65 6d 70 65 72 61  93; &#91;tempera
b190: 74 75 72 65 26 23 39 33 3b 20 31 34 2d 31 36 6f  ture&#93; 14-16o
b1a0: 43 20 61 6e 64 20 63 6f 6f 6c 20 65 6c 73 65 77  C and cool elsew
b1b0: 68 65 72 65 2c 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  here,</i>.  <i>-
b1c0: 2d 20 20 20 20 26 23 39 31 3b 6d 69 6e 69 6d 75  -    &#91;minimu
b1d0: 6d 26 23 39 33 3b 20 26 23 39 31 3b 74 65 6d 70  m&#93; &#91;temp
b1e0: 65 72 61 74 75 72 65 26 23 39 33 3b 20 31 37 2d  erature&#93; 17-
b1f0: 32 30 6f 43 2e 20 43 6f 6c 64 2e 2e 2e 22 3c 2f  20oC. Cold..."</
b200: 69 3e 0a 20 20 3c 69 3e 2d 2d 3c 2f 69 3e 0a 20  i>.  <i>--</i>. 
b210: 20 53 45 4c 45 43 54 20 73 6e 69 70 70 65 74 28   SELECT snippet(
b220: 74 65 78 74 2c 20 27 26 23 39 31 3b 20 27 26 23  text, '&#91; '&#
b230: 39 33 3b 27 2c 20 27 2e 2e 2e 27 29 20 46 52 4f  93;', '...') FRO
b240: 4d 20 74 65 78 74 20 57 48 45 52 45 20 74 65 78  M text WHERE tex
b250: 74 20 4d 41 54 43 48 20 27 22 6d 69 6e 2a 20 74  t MATCH '"min* t
b260: 65 6d 2a 22 27 0a 7d 5d 0a 0a 5b 68 32 20 22 54  em*"'.}]..[h2 "T
b270: 68 65 20 4d 61 74 63 68 69 6e 66 6f 20 46 75 6e  he Matchinfo Fun
b280: 63 74 69 6f 6e 22 20 6d 61 74 63 68 69 6e 66 6f  ction" matchinfo
b290: 20 6d 61 74 63 68 69 6e 66 6f 5d 0a 0a 3c 70 3e   matchinfo]..<p>
b2a0: 0a 20 20 54 68 65 20 6d 61 74 63 68 69 6e 66 6f  .  The matchinfo
b2b0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
b2c0: 73 20 61 20 62 6c 6f 62 20 76 61 6c 75 65 2e 20  s a blob value. 
b2d0: 49 66 20 75 73 65 64 20 77 69 74 68 69 6e 20 61  If used within a
b2e0: 20 71 75 65 72 79 20 74 68 61 74 0a 20 20 75 73   query that.  us
b2f0: 65 73 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74  es the full-text
b300: 20 69 6e 64 65 78 20 28 6e 6f 74 20 61 20 22 71   index (not a "q
b310: 75 65 72 79 20 62 79 20 72 6f 77 69 64 22 20 6f  uery by rowid" o
b320: 72 20 22 6c 69 6e 65 61 72 20 73 63 61 6e 22 29  r "linear scan")
b330: 2c 20 74 68 65 6e 0a 20 20 74 68 65 20 62 6c 6f  , then.  the blo
b340: 62 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 28 32  b consists of (2
b350: 20 2b 20 3c 69 3e 43 3c 2f 69 3e 20 2a 20 3c 69   + <i>C</i> * <i
b360: 3e 50 3c 2f 69 3e 20 2a 20 33 29 20 33 32 2d 62  >P</i> * 3) 32-b
b370: 69 74 20 75 6e 73 69 67 6e 65 64 20 0a 20 20 69  it unsigned .  i
b380: 6e 74 65 67 65 72 73 20 69 6e 20 6d 61 63 68 69  ntegers in machi
b390: 6e 65 20 62 79 74 65 2d 6f 72 64 65 72 2c 20 77  ne byte-order, w
b3a0: 68 65 72 65 20 3c 69 3e 43 3c 2f 69 3e 20 69 73  here <i>C</i> is
b3b0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
b3c0: 6f 6c 75 6d 6e 73 20 0a 20 20 69 6e 20 74 68 65  olumns .  in the
b3d0: 20 46 54 53 33 20 74 61 62 6c 65 20 62 65 69 6e   FTS3 table bein
b3e0: 67 20 71 75 65 72 69 65 64 2c 20 61 6e 64 20 3c  g queried, and <
b3f0: 69 3e 50 3c 2f 69 3e 20 69 73 20 74 68 65 20 6e  i>P</i> is the n
b400: 75 6d 62 65 72 20 6f 66 20 0a 20 20 3c 61 20 68  umber of .  <a h
b410: 72 65 66 3d 23 6d 61 74 63 68 61 62 6c 65 3e 6d  ref=#matchable>m
b420: 61 74 63 68 61 62 6c 65 20 70 68 72 61 73 65 73  atchable phrases
b430: 3c 2f 61 3e 20 69 6e 20 74 68 65 20 71 75 65 72  </a> in the quer
b440: 79 2e 20 0a 0a 20 20 3c 70 3e 0a 20 20 20 20 50  y. ..  <p>.    P
b450: 68 72 61 73 65 73 20 61 6e 64 20 63 6f 6c 75 6d  hrases and colum
b460: 6e 73 20 61 72 65 20 62 6f 74 68 20 6e 75 6d 62  ns are both numb
b470: 65 72 65 64 20 66 72 6f 6d 20 6c 65 66 74 20 74  ered from left t
b480: 6f 20 72 69 67 68 74 20 73 74 61 72 74 69 6e 67  o right starting
b490: 20 66 72 6f 6d 20 0a 20 20 20 20 7a 65 72 6f 2e   from .    zero.
b4a0: 0a 0a 5b 54 61 62 6c 65 5d 0a 20 20 5b 54 72 5d  ..[Table].  [Tr]
b4b0: 3c 74 68 3e 41 72 72 61 79 20 45 6c 65 6d 65 6e  <th>Array Elemen
b4c0: 74 20 3c 74 68 3e 49 6e 74 65 72 70 72 65 74 61  t <th>Interpreta
b4d0: 74 69 6f 6e 0a 20 20 5b 54 72 5d 3c 74 64 3e 30  tion.  [Tr]<td>0
b4e0: 20 3c 74 64 3e 20 0a 20 20 20 20 4e 75 6d 62 65   <td> .    Numbe
b4f0: 72 20 6f 66 20 6d 61 74 63 68 61 62 6c 65 20 70  r of matchable p
b500: 68 72 61 73 65 73 20 69 6e 20 74 68 65 20 71 75  hrases in the qu
b510: 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 28  ery expression (
b520: 76 61 6c 75 65 20 3c 69 3e 50 3c 2f 69 3e 20 69  value <i>P</i> i
b530: 6e 20 0a 20 20 20 20 74 68 65 20 66 6f 72 6d 75  n .    the formu
b540: 6c 61 20 62 65 6c 6f 77 29 2e 0a 20 20 5b 54 72  la below)..  [Tr
b550: 5d 3c 74 64 3e 31 20 3c 74 64 3e 0a 20 20 20 20  ]<td>1 <td>.    
b560: 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
b570: 73 20 69 6e 20 74 68 65 20 46 54 53 33 20 74 61  s in the FTS3 ta
b580: 62 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69 65  ble being querie
b590: 64 20 28 76 61 6c 75 65 20 3c 69 3e 43 3c 2f 69  d (value <i>C</i
b5a0: 3e 20 69 6e 20 0a 20 20 20 20 74 68 65 20 66 6f  > in .    the fo
b5b0: 72 6d 75 6c 61 20 62 65 6c 6f 77 29 2e 0a 0a 20  rmula below)... 
b5c0: 20 5b 54 72 5d 3c 74 64 20 73 74 79 6c 65 3d 22   [Tr]<td style="
b5d0: 77 68 69 74 65 2d 73 70 61 63 65 3a 6e 6f 77 72  white-space:nowr
b5e0: 61 70 22 3e 32 20 2b 20 33 20 2a 20 28 3c 69 3e  ap">2 + 3 * (<i>
b5f0: 63 3c 2f 69 3e 20 2b 20 3c 69 3e 43 3c 2f 69 3e  c</i> + <i>C</i>
b600: 2a 3c 69 3e 70 3c 2f 69 3e 29 20 2b 20 30 3c 74  *<i>p</i>) + 0<t
b610: 64 3e 0a 20 20 20 20 4e 75 6d 62 65 72 20 6f 66  d>.    Number of
b620: 20 70 68 72 61 73 65 20 6d 61 74 63 68 65 73 20   phrase matches 
b630: 66 6f 72 20 6d 61 74 63 68 61 62 6c 65 20 70 68  for matchable ph
b640: 72 61 73 65 20 3c 69 3e 70 3c 2f 69 3e 20 69 6e  rase <i>p</i> in
b650: 20 63 6f 6c 75 6d 6e 20 0a 20 20 20 20 3c 69 3e   column .    <i>
b660: 63 3c 2f 69 3e 20 6f 66 20 74 68 65 20 63 75 72  c</i> of the cur
b670: 72 65 6e 74 20 46 54 53 33 20 74 61 62 6c 65 20  rent FTS3 table 
b680: 72 6f 77 2e 0a 20 20 5b 54 72 5d 3c 74 64 20 73  row..  [Tr]<td s
b690: 74 79 6c 65 3d 22 77 68 69 74 65 2d 73 70 61 63  tyle="white-spac
b6a0: 65 3a 6e 6f 77 72 61 70 22 3e 32 20 2b 20 33 20  e:nowrap">2 + 3 
b6b0: 2a 20 28 3c 69 3e 63 3c 2f 69 3e 20 2b 20 3c 69  * (<i>c</i> + <i
b6c0: 3e 43 3c 2f 69 3e 2a 3c 69 3e 70 3c 2f 69 3e 29  >C</i>*<i>p</i>)
b6d0: 20 2b 20 31 3c 74 64 3e 0a 20 20 20 20 53 75 6d   + 1<td>.    Sum
b6e0: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
b6f0: 66 20 70 68 72 61 73 65 20 6d 61 74 63 68 65 73  f phrase matches
b700: 20 66 6f 72 20 6d 61 74 63 68 61 62 6c 65 20 70   for matchable p
b710: 68 72 61 73 65 20 3c 69 3e 70 3c 2f 69 3e 20 69  hrase <i>p</i> i
b720: 6e 20 0a 20 20 20 20 63 6f 6c 75 6d 6e 20 3c 69  n .    column <i
b730: 3e 63 3c 2f 69 3e 20 66 6f 72 20 61 6c 6c 20 72  >c</i> for all r
b740: 6f 77 73 20 6f 66 20 74 68 65 20 46 54 53 33 20  ows of the FTS3 
b750: 74 61 62 6c 65 2e 0a 20 20 5b 54 72 5d 3c 74 64  table..  [Tr]<td
b760: 20 73 74 79 6c 65 3d 22 77 68 69 74 65 2d 73 70   style="white-sp
b770: 61 63 65 3a 6e 6f 77 72 61 70 22 3e 32 20 2b 20  ace:nowrap">2 + 
b780: 33 20 2a 20 28 3c 69 3e 63 3c 2f 69 3e 20 2b 20  3 * (<i>c</i> + 
b790: 3c 69 3e 43 3c 2f 69 3e 2a 3c 69 3e 70 3c 2f 69  <i>C</i>*<i>p</i
b7a0: 3e 29 20 2b 20 32 3c 74 64 3e 0a 20 20 20 20 4e  >) + 2<td>.    N
b7b0: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6f 66  umber of rows of
b7c0: 20 74 68 65 20 46 54 53 33 20 74 61 62 6c 65 20   the FTS3 table 
b7d0: 66 6f 72 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e  for which column
b7e0: 20 3c 69 3e 63 3c 2f 69 3e 20 63 6f 6e 74 61 69   <i>c</i> contai
b7f0: 6e 73 20 61 74 20 0a 20 20 20 20 6c 65 61 73 74  ns at .    least
b800: 20 6f 6e 65 20 70 68 72 61 73 65 20 6d 61 74 63   one phrase matc
b810: 68 20 66 6f 72 20 6d 61 74 63 68 61 62 6c 65 20  h for matchable 
b820: 70 68 72 61 73 65 20 3c 69 3e 70 3c 2f 69 3e 2e  phrase <i>p</i>.
b830: 0a 3c 2f 74 61 62 6c 65 3e 0a 0a 3c 70 3e 0a 20  .</table>..<p>. 
b840: 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 0a 5b   For example:..[
b850: 43 6f 64 65 20 7b 0a 20 20 3c 69 3e 2d 2d 20 43  Code {.  <i>-- C
b860: 72 65 61 74 65 20 61 6e 64 20 70 6f 70 75 6c 61  reate and popula
b870: 74 65 20 61 6e 20 46 54 53 33 20 74 61 62 6c 65  te an FTS3 table
b880: 20 77 69 74 68 20 74 77 6f 20 63 6f 6c 75 6d 6e   with two column
b890: 73 3a 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45 20  s:</i>.  CREATE 
b8a0: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74 31  VIRTUAL TABLE t1
b8b0: 20 55 53 49 4e 47 20 66 74 73 33 28 61 2c 20 62   USING fts3(a, b
b8c0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
b8d0: 20 74 31 20 56 41 4c 55 45 53 28 27 74 72 61 6e   t1 VALUES('tran
b8e0: 73 61 63 74 69 6f 6e 20 64 65 66 61 75 6c 74 20  saction default 
b8f0: 6d 6f 64 65 6c 73 20 64 65 66 61 75 6c 74 27 2c  models default',
b900: 20 27 4e 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f   'Non transactio
b910: 6e 20 72 65 61 64 73 27 29 3b 0a 20 20 49 4e 53  n reads');.  INS
b920: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
b930: 45 53 28 27 74 68 65 20 64 65 66 61 75 6c 74 20  ES('the default 
b940: 74 72 61 6e 73 61 63 74 69 6f 6e 27 2c 20 27 74  transaction', 't
b950: 68 65 73 65 20 73 65 6d 61 6e 74 69 63 73 20 70  hese semantics p
b960: 72 65 73 65 6e 74 27 29 3b 0a 20 20 49 4e 53 45  resent');.  INSE
b970: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
b980: 53 28 27 73 69 6e 67 6c 65 20 72 65 71 75 65 73  S('single reques
b990: 74 27 2c 20 27 64 65 66 61 75 6c 74 20 64 61 74  t', 'default dat
b9a0: 61 27 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68  a');..  <i>-- Th
b9b0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72  e following quer
b9c0: 79 20 72 65 74 75 72 6e 73 20 61 20 73 69 6e 67  y returns a sing
b9d0: 6c 65 20 72 6f 77 20 63 6f 6e 73 69 73 74 69 6e  le row consistin
b9e0: 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 62 6c  g of a single bl
b9f0: 6f 62 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 76  ob</i>.  <i>-- v
ba00: 61 6c 75 65 20 38 30 20 62 79 74 65 73 20 69 6e  alue 80 bytes in
ba10: 20 73 69 7a 65 20 28 32 30 20 33 32 2d 62 69 74   size (20 32-bit
ba20: 20 69 6e 74 65 67 65 72 73 29 2e 20 49 66 20 65   integers). If e
ba30: 61 63 68 20 62 6c 6f 63 6b 20 6f 66 20 34 20 62  ach block of 4 b
ba40: 79 74 65 73 20 69 6e 3c 2f 69 3e 0a 20 20 3c 69  ytes in</i>.  <i
ba50: 3e 2d 2d 20 74 68 65 20 62 6c 6f 62 20 69 73 20  >-- the blob is 
ba60: 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61  interpreted as a
ba70: 6e 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67  n unsigned integ
ba80: 65 72 20 69 6e 20 6d 61 63 68 69 6e 65 20 62 79  er in machine by
ba90: 74 65 2d 6f 72 64 65 72 2c 3c 2f 69 3e 0a 20 20  te-order,</i>.  
baa0: 3c 69 3e 2d 2d 20 74 68 65 20 69 6e 74 65 67 65  <i>-- the intege
bab0: 72 73 20 77 69 6c 6c 20 62 65 3a 3c 2f 69 3e 0a  rs will be:</i>.
bac0: 20 20 3c 69 3e 2d 2d 3c 2f 69 3e 0a 20 20 3c 69    <i>--</i>.  <i
bad0: 3e 2d 2d 20 20 20 20 20 33 20 32 20 20 31 20 33  >--     3 2  1 3
bae0: 20 32 20 20 30 20 31 20 31 20 20 31 20 32 20 32   2  0 1 1  1 2 2
baf0: 20 20 30 20 31 20 31 20 20 30 20 30 20 30 20 20    0 1 1  0 0 0  
bb00: 31 20 31 20 31 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  1 1 1</i>.  <i>-
bb10: 2d 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 54 68  -</i>.  <i>-- Th
bb20: 65 20 72 6f 77 20 72 65 74 75 72 6e 65 64 20 63  e row returned c
bb30: 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68  orresponds to th
bb40: 65 20 73 65 63 6f 6e 64 20 65 6e 74 72 79 20 69  e second entry i
bb50: 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74 61 62  nserted into tab
bb60: 6c 65 20 74 31 2e 3c 2f 69 3e 0a 20 20 3c 69 3e  le t1.</i>.  <i>
bb70: 2d 2d 20 54 68 65 20 66 69 72 73 74 20 74 77 6f  -- The first two
bb80: 20 69 6e 74 65 67 65 72 73 20 69 6e 20 74 68 65   integers in the
bb90: 20 62 6c 6f 62 20 73 68 6f 77 20 74 68 61 74 20   blob show that 
bba0: 74 68 65 20 71 75 65 72 79 20 63 6f 6e 74 61 69  the query contai
bbb0: 6e 65 64 20 74 68 72 65 65 3c 2f 69 3e 0a 20 20  ned three</i>.  
bbc0: 3c 69 3e 2d 2d 20 70 68 72 61 73 65 73 20 61 6e  <i>-- phrases an
bbd0: 64 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  d the table bein
bbe0: 67 20 71 75 65 72 69 65 64 20 68 61 73 20 74 77  g queried has tw
bbf0: 6f 20 63 6f 6c 75 6d 6e 73 2e 20 54 68 65 20 6e  o columns. The n
bc00: 65 78 74 20 62 6c 6f 63 6b 20 6f 66 3c 2f 69 3e  ext block of</i>
bc10: 0a 20 20 3c 69 3e 2d 2d 20 74 68 72 65 65 20 69  .  <i>-- three i
bc20: 6e 74 65 67 65 72 73 20 64 65 73 63 72 69 62 65  ntegers describe
bc30: 73 20 63 6f 6c 75 6d 6e 20 30 20 28 69 6e 20 74  s column 0 (in t
bc40: 68 69 73 20 63 61 73 65 20 63 6f 6c 75 6d 6e 20  his case column 
bc50: 22 61 22 29 20 61 6e 64 20 70 68 72 61 73 65 3c  "a") and phrase<
bc60: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 30 20 28 69  /i>.  <i>-- 0 (i
bc70: 6e 20 74 68 69 73 20 63 61 73 65 20 22 64 65 66  n this case "def
bc80: 61 75 6c 74 22 29 2e 20 54 68 65 20 63 75 72 72  ault"). The curr
bc90: 65 6e 74 20 72 6f 77 20 63 6f 6e 74 61 69 6e 73  ent row contains
bca0: 20 31 20 68 69 74 20 66 6f 72 20 22 64 65 66 61   1 hit for "defa
bcb0: 75 6c 74 22 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  ult"</i>.  <i>--
bcc0: 20 69 6e 20 63 6f 6c 75 6d 6e 20 30 2c 20 6f 66   in column 0, of
bcd0: 20 61 20 74 6f 74 61 6c 20 6f 66 20 33 20 68 69   a total of 3 hi
bce0: 74 73 20 66 6f 72 20 22 64 65 66 61 75 6c 74 22  ts for "default"
bcf0: 20 74 68 61 74 20 6f 63 63 75 72 20 69 6e 20 63   that occur in c
bd00: 6f 6c 75 6d 6e 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  olumn</i>.  <i>-
bd10: 2d 20 30 20 6f 66 20 61 6e 79 20 74 61 62 6c 65  - 0 of any table
bd20: 20 72 6f 77 2e 20 54 68 65 20 33 20 68 69 74 73   row. The 3 hits
bd30: 20 61 72 65 20 73 70 72 65 61 64 20 61 63 72 6f   are spread acro
bd40: 73 73 20 32 20 64 69 66 66 65 72 65 6e 74 20 72  ss 2 different r
bd50: 6f 77 73 2e 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  ows.</i>.  <i>--
bd60: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 54 68 65  </i>.  <i>-- The
bd70: 20 6e 65 78 74 20 73 65 74 20 6f 66 20 74 68 72   next set of thr
bd80: 65 65 20 69 6e 74 65 67 65 72 73 20 28 30 20 31  ee integers (0 1
bd90: 20 31 29 20 70 65 72 74 61 69 6e 20 74 6f 20 74   1) pertain to t
bda0: 68 65 20 68 69 74 73 20 66 6f 72 20 22 64 65 66  he hits for "def
bdb0: 61 75 6c 74 22 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  ault"</i>.  <i>-
bdc0: 2d 20 69 6e 20 63 6f 6c 75 6d 6e 20 31 20 6f 66  - in column 1 of
bdd0: 20 74 68 65 20 74 61 62 6c 65 20 28 30 20 69 6e   the table (0 in
bde0: 20 74 68 69 73 20 72 6f 77 2c 20 31 20 69 6e 20   this row, 1 in 
bdf0: 61 6c 6c 20 72 6f 77 73 2c 20 73 70 72 65 61 64  all rows, spread
be00: 20 61 63 72 6f 73 73 20 3c 2f 69 3e 0a 20 20 3c   across </i>.  <
be10: 69 3e 2d 2d 20 31 20 72 6f 77 73 29 2e 3c 2f 69  i>-- 1 rows).</i
be20: 3e 0a 20 20 3c 69 3e 2d 2d 3c 2f 69 3e 0a 20 20  >.  <i>--</i>.  
be30: 53 45 4c 45 43 54 20 6d 61 74 63 68 69 6e 66 6f  SELECT matchinfo
be40: 28 74 31 29 20 46 52 4f 4d 20 74 31 20 57 48 45  (t1) FROM t1 WHE
be50: 52 45 20 74 31 20 4d 41 54 43 48 20 27 64 65 66  RE t1 MATCH 'def
be60: 61 75 6c 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ault transaction
be70: 20 22 74 68 65 73 65 20 73 65 6d 61 6e 74 69 63   "these semantic
be80: 73 22 27 3b 0a 7d 5d 0a 0a 3c 70 3e 0a 20 20 54  s"';.}]..<p>.  T
be90: 68 65 20 6d 61 74 63 68 69 6e 66 6f 20 66 75 6e  he matchinfo fun
bea0: 63 74 69 6f 6e 20 69 73 20 6d 75 63 68 20 66 61  ction is much fa
beb0: 73 74 65 72 20 74 68 61 6e 20 65 69 74 68 65 72  ster than either
bec0: 20 74 68 65 20 73 6e 69 70 70 65 74 20 6f 72 20   the snippet or 
bed0: 6f 66 66 73 65 74 73 0a 20 20 66 75 6e 63 74 69  offsets.  functi
bee0: 6f 6e 73 2e 20 54 68 69 73 20 69 73 20 62 65 63  ons. This is bec
bef0: 61 75 73 65 20 74 68 65 20 69 6d 70 6c 65 6d 65  ause the impleme
bf00: 6e 74 61 74 69 6f 6e 20 6f 66 20 62 6f 74 68 20  ntation of both 
bf10: 73 6e 69 70 70 65 74 20 61 6e 64 20 6f 66 66 73  snippet and offs
bf20: 65 74 73 0a 20 20 69 73 20 72 65 71 75 69 72 65  ets.  is require
bf30: 64 20 74 6f 20 72 65 74 72 69 65 76 65 20 74 68  d to retrieve th
bf40: 65 20 64 6f 63 75 6d 65 6e 74 73 20 62 65 69 6e  e documents bein
bf50: 67 20 61 6e 61 6c 79 7a 65 64 20 66 72 6f 6d 20  g analyzed from 
bf60: 64 69 73 6b 2c 20 77 68 65 72 65 61 73 0a 20 20  disk, whereas.  
bf70: 61 6c 6c 20 64 61 74 61 20 72 65 71 75 69 72 65  all data require
bf80: 64 20 62 79 20 6d 61 74 63 68 69 6e 66 6f 20 69  d by matchinfo i
bf90: 73 20 61 76 61 69 6c 61 62 6c 65 20 61 73 20 70  s available as p
bfa0: 61 72 74 20 6f 66 20 74 68 65 20 73 61 6d 65 20  art of the same 
bfb0: 70 6f 72 74 69 6f 6e 73 0a 20 20 6f 66 20 74 68  portions.  of th
bfc0: 65 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65  e full-text inde
bfd0: 78 20 74 68 61 74 20 61 72 65 20 72 65 71 75 69  x that are requi
bfe0: 72 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  red to implement
bff0: 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 71   the full-text q
c000: 75 65 72 79 0a 20 20 69 74 73 65 6c 66 2e 20 54  uery.  itself. T
c010: 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 6f  his means that o
c020: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
c030: 74 77 6f 20 71 75 65 72 69 65 73 2c 20 74 68 65  two queries, the
c040: 20 66 69 72 73 74 20 6d 61 79 20 62 65 0a 20 20   first may be.  
c050: 61 6e 20 6f 72 64 65 72 20 6f 66 20 6d 61 67 6e  an order of magn
c060: 69 74 75 64 65 20 66 61 73 74 65 72 20 74 68 61  itude faster tha
c070: 6e 20 74 68 65 20 73 65 63 6f 6e 64 3a 0a 0a 5b  n the second:..[
c080: 43 6f 64 65 20 7b 0a 20 20 53 45 4c 45 43 54 20  Code {.  SELECT 
c090: 64 6f 63 69 64 2c 20 6d 61 74 63 68 69 6e 66 6f  docid, matchinfo
c0a0: 28 74 62 6c 29 20 46 52 4f 4d 20 74 62 6c 20 57  (tbl) FROM tbl W
c0b0: 48 45 52 45 20 74 62 6c 20 4d 41 54 43 48 20 26  HERE tbl MATCH &
c0c0: 6c 74 3b 71 75 65 72 79 20 65 78 70 72 65 73 73  lt;query express
c0d0: 69 6f 6e 26 67 74 3b 3b 0a 20 20 53 45 4c 45 43  ion&gt;;.  SELEC
c0e0: 54 20 64 6f 63 69 64 2c 20 6f 66 66 73 65 74 73  T docid, offsets
c0f0: 28 74 62 6c 29 20 46 52 4f 4d 20 74 62 6c 20 57  (tbl) FROM tbl W
c100: 48 45 52 45 20 74 62 6c 20 4d 41 54 43 48 20 26  HERE tbl MATCH &
c110: 6c 74 3b 71 75 65 72 79 20 65 78 70 72 65 73 73  lt;query express
c120: 69 6f 6e 26 67 74 3b 3b 0a 7d 5d 0a 0a 3c 70 3e  ion&gt;;.}]..<p>
c130: 0a 20 20 54 68 65 20 6d 61 74 63 68 69 6e 66 6f  .  The matchinfo
c140: 20 66 75 6e 63 74 69 6f 6e 20 70 72 6f 76 69 64   function provid
c150: 65 73 20 6d 75 63 68 20 6f 66 20 74 68 65 20 69  es much of the i
c160: 6e 66 6f 72 6d 61 74 69 6f 6e 20 72 65 71 75 69  nformation requi
c170: 72 65 64 20 74 6f 20 63 61 6c 63 75 6c 61 74 65  red to calculate
c180: 0a 20 20 70 72 6f 62 61 62 61 6c 69 73 74 69 63  .  probabalistic
c190: 20 22 62 61 67 2d 6f 66 2d 77 6f 72 64 73 22 20   "bag-of-words" 
c1a0: 72 65 6c 65 76 61 6e 63 79 20 73 63 6f 72 65 73  relevancy scores
c1b0: 20 73 75 63 68 20 61 73 20 0a 20 20 3c 61 20 68   such as .  <a h
c1c0: 72 65 66 3d 68 74 74 70 3a 2f 2f 65 6e 2e 77 69  ref=http://en.wi
c1d0: 6b 69 70 65 64 69 61 2e 6f 72 67 2f 77 69 6b 69  kipedia.org/wiki
c1e0: 2f 4f 6b 61 70 69 5f 42 4d 32 35 3e 4f 6b 61 70  /Okapi_BM25>Okap
c1f0: 69 20 42 4d 32 35 2f 42 4d 32 35 46 3c 2f 61 3e  i BM25/BM25F</a>
c200: 20 74 68 61 74 20 6d 61 79 0a 20 20 62 65 20 75   that may.  be u
c210: 73 65 64 20 74 6f 20 6f 72 64 65 72 20 72 65 73  sed to order res
c220: 75 6c 74 73 20 69 6e 20 61 20 66 75 6c 6c 2d 74  ults in a full-t
c230: 65 78 74 20 73 65 61 72 63 68 20 61 70 70 6c 69  ext search appli
c240: 63 61 74 69 6f 6e 2e 20 41 6c 73 6f 20 6f 66 74  cation. Also oft
c250: 65 6e 0a 20 20 75 73 65 64 20 69 6e 20 73 75 63  en.  used in suc
c260: 68 20 66 75 6e 63 74 69 6f 6e 73 20 69 73 20 74  h functions is t
c270: 68 65 20 6c 65 6e 67 74 68 20 6f 72 20 72 65 6c  he length or rel
c280: 61 74 69 76 65 20 6c 65 6e 67 74 68 20 6f 66 20  ative length of 
c290: 65 61 63 68 20 64 6f 63 75 6d 65 6e 74 0a 20 20  each document.  
c2a0: 6f 72 20 64 6f 63 75 6d 65 6e 74 20 66 69 65 6c  or document fiel
c2b0: 64 2e 20 55 6e 66 6f 72 74 75 6e 61 74 65 6c 79  d. Unfortunately
c2c0: 2c 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  , this informati
c2d0: 6f 6e 20 69 73 20 6e 6f 74 20 6d 61 64 65 20 61  on is not made a
c2e0: 76 61 69 6c 61 62 6c 65 0a 20 20 62 79 20 74 68  vailable.  by th
c2f0: 65 20 6d 61 74 63 68 69 6e 66 6f 20 66 75 6e 63  e matchinfo func
c300: 74 69 6f 6e 20 61 73 20 69 74 20 77 6f 75 6c 64  tion as it would
c310: 20 72 65 71 75 69 72 65 20 6c 6f 61 64 69 6e 67   require loading
c320: 20 65 78 74 72 61 20 64 61 74 61 20 66 72 6f 6d   extra data from
c330: 20 74 68 65 0a 20 20 64 61 74 61 62 61 73 65 2c   the.  database,
c340: 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 73 6c 6f   potentially slo
c350: 77 69 6e 67 20 6d 61 74 63 68 69 6e 66 6f 28 29  wing matchinfo()
c360: 20 64 6f 77 6e 20 62 79 20 61 6e 20 6f 72 64 65   down by an orde
c370: 72 20 6f 66 20 6d 61 67 6e 69 74 75 64 65 2e 0a  r of magnitude..
c380: 20 20 4f 6e 65 20 73 6f 6c 75 74 69 6f 6e 20 69    One solution i
c390: 73 20 66 6f 72 20 74 68 65 20 61 70 70 6c 69 63  s for the applic
c3a0: 61 74 69 6f 6e 20 74 6f 20 73 74 6f 72 65 20 74  ation to store t
c3b0: 68 65 20 6c 65 6e 67 74 68 73 20 6f 66 20 65 61  he lengths of ea
c3c0: 63 68 20 64 6f 63 75 6d 65 6e 74 0a 20 20 6f 72  ch document.  or
c3d0: 20 64 6f 63 75 6d 65 6e 74 20 66 69 65 6c 64 20   document field 
c3e0: 69 6e 20 61 20 73 65 70 61 72 61 74 65 20 74 61  in a separate ta
c3f0: 62 6c 65 20 66 6f 72 20 75 73 65 20 69 6e 20 63  ble for use in c
c400: 61 6c 63 75 6c 61 74 69 6e 67 20 72 65 6c 65 76  alculating relev
c410: 61 6e 63 79 0a 20 20 73 63 6f 72 65 73 2e 20 41  ancy.  scores. A
c420: 70 70 65 6e 64 69 78 20 41 20 6f 66 20 74 68 69  ppendix A of thi
c430: 73 20 64 6f 63 75 6d 65 6e 74 2c 20 22 5c 5b 73  s document, "\[s
c440: 65 61 72 63 68 20 61 70 70 6c 69 63 61 74 69 6f  earch applicatio
c450: 6e 20 74 69 70 73 5c 5d 22 2c 20 63 6f 6e 74 61  n tips\]", conta
c460: 69 6e 73 0a 20 20 61 6e 20 65 78 61 6d 70 6c 65  ins.  an example
c470: 20 6f 66 20 75 73 69 6e 67 20 74 68 65 20 6d 61   of using the ma
c480: 74 63 68 69 6e 66 6f 28 29 20 66 75 6e 63 74 69  tchinfo() functi
c490: 6f 6e 20 65 66 66 69 63 69 65 6e 74 6c 79 2e 0a  on efficiently..
c4a0: 0a 5b 68 31 20 22 54 6f 6b 65 6e 69 7a 65 72 73  .[h1 "Tokenizers
c4b0: 22 20 74 6f 6b 65 6e 69 7a 65 72 20 7b 74 6f 6b  " tokenizer {tok
c4c0: 65 6e 69 7a 65 72 7d 5d 0a 0a 3c 70 3e 0a 20 20  enizer}]..<p>.  
c4d0: 41 6e 20 46 54 53 33 20 74 6f 6b 65 6e 69 7a 65  An FTS3 tokenize
c4e0: 72 20 69 73 20 61 20 73 65 74 20 6f 66 20 72 75  r is a set of ru
c4f0: 6c 65 73 20 66 6f 72 20 65 78 74 72 61 63 74 69  les for extracti
c500: 6e 67 20 74 65 72 6d 73 20 66 72 6f 6d 20 61 20  ng terms from a 
c510: 64 6f 63 75 6d 65 6e 74 20 0a 20 20 6f 72 20 62  document .  or b
c520: 61 73 69 63 20 46 54 53 33 20 66 75 6c 6c 2d 74  asic FTS3 full-t
c530: 65 78 74 20 71 75 65 72 79 2e 20 0a 0a 3c 70 3e  ext query. ..<p>
c540: 0a 20 20 55 6e 6c 65 73 73 20 61 20 73 70 65 63  .  Unless a spec
c550: 69 66 69 63 20 74 6f 6b 65 6e 69 7a 65 72 20 69  ific tokenizer i
c560: 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20 70  s specified as p
c570: 61 72 74 20 6f 66 20 74 68 65 20 43 52 45 41 54  art of the CREAT
c580: 45 20 0a 20 20 56 49 52 54 55 41 4c 20 54 41 42  E .  VIRTUAL TAB
c590: 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 75 73 65  LE statement use
c5a0: 64 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20  d to create the 
c5b0: 46 54 53 33 20 74 61 62 6c 65 2c 20 74 68 65 20  FTS3 table, the 
c5c0: 64 65 66 61 75 6c 74 20 0a 20 20 74 6f 6b 65 6e  default .  token
c5d0: 69 7a 65 72 2c 20 22 73 69 6d 70 6c 65 22 2c 20  izer, "simple", 
c5e0: 69 73 20 75 73 65 64 2e 20 54 68 65 20 73 69 6d  is used. The sim
c5f0: 70 6c 65 20 74 6f 6b 65 6e 69 7a 65 72 20 65 78  ple tokenizer ex
c600: 74 72 61 63 74 73 20 74 6f 6b 65 6e 73 20 66 72  tracts tokens fr
c610: 6f 6d 0a 20 20 61 20 64 6f 63 75 6d 65 6e 74 20  om.  a document 
c620: 6f 72 20 62 61 73 69 63 20 46 54 53 33 20 66 75  or basic FTS3 fu
c630: 6c 6c 2d 74 65 78 74 20 71 75 65 72 79 20 61 63  ll-text query ac
c640: 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 66  cording to the f
c650: 6f 6c 6c 6f 77 69 6e 67 20 0a 20 20 72 75 6c 65  ollowing .  rule
c660: 73 3a 0a 0a 3c 75 6c 3e 0a 20 20 3c 6c 69 3e 3c  s:..<ul>.  <li><
c670: 70 3e 20 41 20 74 65 72 6d 20 69 73 20 61 20 63  p> A term is a c
c680: 6f 6e 74 69 67 75 6f 75 73 20 73 65 71 75 65 6e  ontiguous sequen
c690: 63 65 20 6f 66 20 65 6c 69 67 69 62 6c 65 20 63  ce of eligible c
c6a0: 68 61 72 61 63 74 65 72 73 2c 20 77 68 65 72 65  haracters, where
c6b0: 20 0a 20 20 20 20 65 6c 69 67 69 62 6c 65 20 63   .    eligible c
c6c0: 68 61 72 61 63 74 65 72 73 20 61 72 65 20 61 6c  haracters are al
c6d0: 6c 20 61 6c 70 68 61 6e 75 6d 65 72 69 63 20 63  l alphanumeric c
c6e0: 68 61 72 61 63 74 65 72 73 2c 20 74 68 65 20 22  haracters, the "
c6f0: 5f 22 20 63 68 61 72 61 63 74 65 72 2c 0a 20 20  _" character,.  
c700: 20 20 61 6e 64 20 61 6c 6c 20 63 68 61 72 61 63    and all charac
c710: 74 65 72 73 20 77 69 74 68 20 55 54 46 20 63 6f  ters with UTF co
c720: 64 65 70 6f 69 6e 74 73 20 67 72 65 61 74 65 72  depoints greater
c730: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
c740: 6f 20 31 32 38 2e 0a 20 20 20 20 41 6c 6c 20 6f  o 128..    All o
c750: 74 68 65 72 20 63 68 61 72 61 63 74 65 72 73 20  ther characters 
c760: 61 72 65 20 64 69 73 63 61 72 64 65 64 20 77 68  are discarded wh
c770: 65 6e 20 73 70 6c 69 74 74 69 6e 67 20 61 20 64  en splitting a d
c780: 6f 63 75 6d 65 6e 74 20 69 6e 74 6f 20 74 65 72  ocument into ter
c790: 6d 73 2e 0a 20 20 20 20 54 68 65 79 20 73 65 72  ms..    They ser
c7a0: 76 65 20 6f 6e 6c 79 20 74 6f 20 73 65 70 61 72  ve only to separ
c7b0: 61 74 65 20 61 64 6a 61 63 65 6e 74 20 74 65 72  ate adjacent ter
c7c0: 6d 73 2e 0a 0a 20 20 3c 6c 69 3e 3c 70 3e 20 41  ms...  <li><p> A
c7d0: 6c 6c 20 75 70 70 65 72 63 61 73 65 20 63 68 61  ll uppercase cha
c7e0: 72 61 63 74 65 72 73 20 77 69 74 68 69 6e 20 74  racters within t
c7f0: 68 65 20 41 53 43 49 49 20 72 61 6e 67 65 20 28  he ASCII range (
c800: 55 54 46 20 63 6f 64 65 70 6f 69 6e 74 73 20 6c  UTF codepoints l
c810: 65 73 73 20 0a 20 20 20 20 74 68 61 6e 20 31 32  ess .    than 12
c820: 38 29 2c 20 61 72 65 20 74 72 61 6e 73 66 6f 72  8), are transfor
c830: 6d 65 64 20 74 6f 20 74 68 65 69 72 20 6c 6f 77  med to their low
c840: 65 72 63 61 73 65 20 65 71 75 69 76 61 6c 65 6e  ercase equivalen
c850: 74 73 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ts as part of th
c860: 65 0a 20 20 20 20 74 6f 6b 65 6e 69 7a 61 74 69  e.    tokenizati
c870: 6f 6e 20 70 72 6f 63 65 73 73 2e 20 54 68 75 73  on process. Thus
c880: 2c 20 66 75 6c 6c 2d 74 65 78 74 20 71 75 65 72  , full-text quer
c890: 69 65 73 20 61 72 65 20 63 61 73 65 2d 69 6e 73  ies are case-ins
c8a0: 65 6e 73 69 74 69 76 65 20 77 68 65 6e 0a 20 20  ensitive when.  
c8b0: 20 20 75 73 69 6e 67 20 74 68 65 20 73 69 6d 70    using the simp
c8c0: 6c 65 20 74 6f 6b 65 6e 69 7a 65 72 2e 0a 3c 2f  le tokenizer..</
c8d0: 75 6c 3e 0a 0a 3c 70 3e 0a 20 20 46 6f 72 20 65  ul>..<p>.  For e
c8e0: 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20 64  xample, when a d
c8f0: 6f 63 75 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 69  ocument containi
c900: 6e 67 20 74 68 65 20 74 65 78 74 20 22 52 69 67  ng the text "Rig
c910: 68 74 20 6e 6f 77 2c 20 74 68 65 79 27 72 65 20  ht now, they're 
c920: 76 65 72 79 0a 20 20 66 72 75 73 74 72 61 74 65  very.  frustrate
c930: 64 2e 22 2c 20 74 68 65 20 74 65 72 6d 73 20 65  d.", the terms e
c940: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68  xtracted from th
c950: 65 20 64 6f 63 75 6d 65 6e 74 20 61 6e 64 20 61  e document and a
c960: 64 64 65 64 20 74 6f 20 74 68 65 20 0a 20 20 66  dded to the .  f
c970: 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 20 61  ull-text index a
c980: 72 65 2c 20 69 6e 20 6f 72 64 65 72 2c 20 22 72  re, in order, "r
c990: 69 67 68 74 20 6e 6f 77 20 74 68 65 79 20 72 65  ight now they re
c9a0: 20 76 65 72 79 20 66 72 75 73 74 72 61 74 65 64   very frustrated
c9b0: 22 2e 20 53 75 63 68 0a 20 20 61 20 64 6f 63 75  ". Such.  a docu
c9c0: 6d 65 6e 74 20 77 6f 75 6c 64 20 6d 61 74 63 68  ment would match
c9d0: 20 61 20 66 75 6c 6c 2d 74 65 78 74 20 71 75 65   a full-text que
c9e0: 72 79 20 73 75 63 68 20 61 73 20 22 4d 41 54 43  ry such as "MATC
c9f0: 48 20 27 46 72 75 73 74 72 61 74 65 64 27 22 2c  H 'Frustrated'",
ca00: 20 0a 20 20 61 73 20 74 68 65 20 73 69 6d 70 6c   .  as the simpl
ca10: 65 20 74 6f 6b 65 6e 69 7a 65 72 20 74 72 61 6e  e tokenizer tran
ca20: 73 66 6f 72 6d 73 20 74 68 65 20 74 65 72 6d 20  sforms the term 
ca30: 69 6e 20 74 68 65 20 71 75 65 72 79 20 74 6f 20  in the query to 
ca40: 6c 6f 77 65 72 63 61 73 65 0a 20 20 62 65 66 6f  lowercase.  befo
ca50: 72 65 20 73 65 61 72 63 68 69 6e 67 20 74 68 65  re searching the
ca60: 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78   full-text index
ca70: 2e 0a 0a 3c 70 3e 0a 20 20 41 73 20 77 65 6c 6c  ...<p>.  As well
ca80: 20 61 73 20 74 68 65 20 22 73 69 6d 70 6c 65 22   as the "simple"
ca90: 20 74 6f 6b 65 6e 69 7a 65 72 2c 20 74 68 65 20   tokenizer, the 
caa0: 46 54 53 33 20 73 6f 75 72 63 65 20 63 6f 64 65  FTS3 source code
cab0: 20 66 65 61 74 75 72 65 73 20 61 20 74 6f 6b 65   features a toke
cac0: 6e 69 7a 65 72 20 0a 20 20 74 68 61 74 20 75 73  nizer .  that us
cad0: 65 73 20 74 68 65 20 3c 61 20 68 72 65 66 3d 22  es the <a href="
cae0: 68 74 74 70 3a 2f 2f 74 61 72 74 61 72 75 73 2e  http://tartarus.
caf0: 6f 72 67 2f 7e 6d 61 72 74 69 6e 2f 50 6f 72 74  org/~martin/Port
cb00: 65 72 53 74 65 6d 6d 65 72 2f 22 3e 50 6f 72 74  erStemmer/">Port
cb10: 65 72 20 0a 20 20 53 74 65 6d 6d 69 6e 67 20 61  er .  Stemming a
cb20: 6c 67 6f 72 69 74 68 6d 3c 2f 61 3e 2e 20 54 68  lgorithm</a>. Th
cb30: 69 73 20 74 6f 6b 65 6e 69 7a 65 72 20 75 73 65  is tokenizer use
cb40: 73 20 74 68 65 20 73 61 6d 65 20 72 75 6c 65 73  s the same rules
cb50: 20 74 6f 20 73 65 70 61 72 61 74 65 0a 20 20 74   to separate.  t
cb60: 68 65 20 69 6e 70 75 74 20 64 6f 63 75 6d 65 6e  he input documen
cb70: 74 20 69 6e 74 6f 20 74 65 72 6d 73 2c 20 62 75  t into terms, bu
cb80: 74 20 61 73 20 77 65 6c 6c 20 61 73 20 66 6f 6c  t as well as fol
cb90: 64 69 6e 67 20 61 6c 6c 20 74 65 72 6d 73 20 74  ding all terms t
cba0: 6f 20 6c 6f 77 65 72 0a 20 20 63 61 73 65 20 69  o lower.  case i
cbb0: 74 20 75 73 65 73 20 74 68 65 20 50 6f 72 74 65  t uses the Porte
cbc0: 72 20 53 74 65 6d 6d 69 6e 67 20 61 6c 67 6f 72  r Stemming algor
cbd0: 69 74 68 6d 20 74 6f 20 72 65 64 75 63 65 20 72  ithm to reduce r
cbe0: 65 6c 61 74 65 64 20 45 6e 67 6c 69 73 68 20 6c  elated English l
cbf0: 61 6e 67 75 61 67 65 0a 20 20 77 6f 72 64 73 20  anguage.  words 
cc00: 74 6f 20 61 20 63 6f 6d 6d 6f 6e 20 72 6f 6f 74  to a common root
cc10: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 75  . For example, u
cc20: 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 69 6e  sing the same in
cc30: 70 75 74 20 64 6f 63 75 6d 65 6e 74 20 61 73 20  put document as 
cc40: 69 6e 20 74 68 65 0a 20 20 70 61 72 61 67 72 61  in the.  paragra
cc50: 70 68 20 61 62 6f 76 65 2c 20 74 68 65 20 70 6f  ph above, the po
cc60: 72 74 65 72 20 74 6f 6b 65 6e 69 7a 65 72 20 65  rter tokenizer e
cc70: 78 74 72 61 63 74 73 20 74 68 65 20 66 6f 6c 6c  xtracts the foll
cc80: 6f 77 69 6e 67 20 74 6f 6b 65 6e 73 3a 0a 20 20  owing tokens:.  
cc90: 22 72 69 67 68 74 20 6e 6f 77 20 74 68 65 69 20  "right now thei 
cca0: 76 65 72 69 20 66 72 75 73 74 72 61 74 22 2e 20  veri frustrat". 
ccb0: 45 76 65 6e 20 74 68 6f 75 67 68 20 73 6f 6d 65  Even though some
ccc0: 20 6f 66 20 74 68 65 73 65 20 74 65 72 6d 73 20   of these terms 
ccd0: 61 72 65 20 6e 6f 74 20 65 76 65 6e 0a 20 20 45  are not even.  E
cce0: 6e 67 6c 69 73 68 20 77 6f 72 64 73 2c 20 69 6e  nglish words, in
ccf0: 20 73 6f 6d 65 20 63 61 73 65 73 20 75 73 69 6e   some cases usin
cd00: 67 20 74 68 65 6d 20 74 6f 20 62 75 69 6c 64 20  g them to build 
cd10: 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e  the full-text in
cd20: 64 65 78 20 69 73 20 6d 6f 72 65 0a 20 20 75 73  dex is more.  us
cd30: 65 66 75 6c 20 74 68 61 6e 20 74 68 65 20 6d 6f  eful than the mo
cd40: 72 65 20 69 6e 74 65 6c 6c 69 67 69 62 6c 65 20  re intelligible 
cd50: 6f 75 74 70 75 74 20 70 72 6f 64 75 63 65 64 20  output produced 
cd60: 62 79 20 74 68 65 20 73 69 6d 70 6c 65 20 74 6f  by the simple to
cd70: 6b 65 6e 69 7a 65 72 2e 0a 20 20 55 73 69 6e 67  kenizer..  Using
cd80: 20 74 68 65 20 70 6f 72 74 65 72 20 74 6f 6b 65   the porter toke
cd90: 6e 69 7a 65 72 2c 20 74 68 65 20 64 6f 63 75 6d  nizer, the docum
cda0: 65 6e 74 20 6e 6f 74 20 6f 6e 6c 79 20 6d 61 74  ent not only mat
cdb0: 63 68 65 73 20 66 75 6c 6c 2d 74 65 78 74 20 71  ches full-text q
cdc0: 75 65 72 69 65 73 0a 20 20 73 75 63 68 20 61 73  ueries.  such as
cdd0: 20 22 4d 41 54 43 48 20 27 46 72 75 73 74 72 61   "MATCH 'Frustra
cde0: 74 65 64 27 22 2c 20 62 75 74 20 61 6c 73 6f 20  ted'", but also 
cdf0: 71 75 65 72 69 65 73 20 73 75 63 68 20 61 73 20  queries such as 
ce00: 22 4d 41 54 43 48 20 27 46 72 75 73 74 72 61 74  "MATCH 'Frustrat
ce10: 69 6f 6e 27 22 2c 0a 20 20 61 73 20 74 68 65 20  ion'",.  as the 
ce20: 74 65 72 6d 20 22 46 72 75 73 74 72 61 74 69 6f  term "Frustratio
ce30: 6e 22 20 69 73 20 72 65 64 75 63 65 64 20 62 79  n" is reduced by
ce40: 20 74 68 65 20 50 6f 72 74 65 72 20 73 74 65 6d   the Porter stem
ce50: 6d 65 72 20 61 6c 67 6f 72 69 74 68 6d 20 74 6f  mer algorithm to
ce60: 20 0a 20 20 22 66 72 75 73 74 72 61 74 22 20 2d   .  "frustrat" -
ce70: 20 6a 75 73 74 20 61 73 20 22 46 72 75 73 74 72   just as "Frustr
ce80: 61 74 65 64 22 20 69 73 2e 20 53 6f 2c 20 77 68  ated" is. So, wh
ce90: 65 6e 20 75 73 69 6e 67 20 74 68 65 20 70 6f 72  en using the por
cea0: 74 65 72 20 74 6f 6b 65 6e 69 7a 65 72 2c 0a 20  ter tokenizer,. 
ceb0: 20 46 54 53 33 20 69 73 20 61 62 6c 65 20 74 6f   FTS3 is able to
cec0: 20 66 69 6e 64 20 6e 6f 74 20 6a 75 73 74 20 65   find not just e
ced0: 78 61 63 74 20 6d 61 74 63 68 65 73 20 66 6f 72  xact matches for
cee0: 20 71 75 65 72 69 65 64 20 74 65 72 6d 73 2c 20   queried terms, 
cef0: 62 75 74 20 6d 61 74 63 68 65 73 0a 20 20 61 67  but matches.  ag
cf00: 61 69 6e 73 74 20 73 69 6d 69 6c 61 72 20 45 6e  ainst similar En
cf10: 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 74  glish language t
cf20: 65 72 6d 73 2e 20 46 6f 72 20 6d 6f 72 65 20 69  erms. For more i
cf30: 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 74 68  nformation on th
cf40: 65 20 0a 20 20 50 6f 72 74 65 72 20 53 74 65 6d  e .  Porter Stem
cf50: 6d 65 72 20 61 6c 67 6f 72 69 74 68 6d 2c 20 70  mer algorithm, p
cf60: 6c 65 61 73 65 20 72 65 66 65 72 20 74 6f 20 74  lease refer to t
cf70: 68 65 20 70 61 67 65 20 6c 69 6e 6b 65 64 20 61  he page linked a
cf80: 62 6f 76 65 2e 0a 0a 3c 70 3e 0a 20 20 45 78 61  bove...<p>.  Exa
cf90: 6d 70 6c 65 20 69 6c 6c 75 73 74 72 61 74 69 6e  mple illustratin
cfa0: 67 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65  g the difference
cfb0: 20 62 65 74 77 65 65 6e 20 74 68 65 20 22 73 69   between the "si
cfc0: 6d 70 6c 65 22 20 61 6e 64 20 22 70 6f 72 74 65  mple" and "porte
cfd0: 72 22 0a 20 20 74 6f 6b 65 6e 69 7a 65 72 73 3a  r".  tokenizers:
cfe0: 0a 0a 5b 43 6f 64 65 20 7b 0a 20 20 3c 69 3e 2d  ..[Code {.  <i>-
cff0: 2d 20 43 72 65 61 74 65 20 61 20 74 61 62 6c 65  - Create a table
d000: 20 75 73 69 6e 67 20 74 68 65 20 73 69 6d 70 6c   using the simpl
d010: 65 20 74 6f 6b 65 6e 69 7a 65 72 2e 20 49 6e 73  e tokenizer. Ins
d020: 65 72 74 20 61 20 64 6f 63 75 6d 65 6e 74 20 69  ert a document i
d030: 6e 74 6f 20 69 74 2e 3c 2f 69 3e 0a 20 20 43 52  nto it.</i>.  CR
d040: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
d050: 4c 45 20 73 69 6d 70 6c 65 20 55 53 49 4e 47 20  LE simple USING 
d060: 66 74 73 33 28 74 6f 6b 65 6e 69 7a 65 3d 73 69  fts3(tokenize=si
d070: 6d 70 6c 65 29 3b 0a 20 20 49 4e 53 45 52 54 20  mple);.  INSERT 
d080: 49 4e 54 4f 20 73 69 6d 70 6c 65 20 56 41 4c 55  INTO simple VALU
d090: 45 53 28 27 52 69 67 68 74 20 6e 6f 77 20 74 68  ES('Right now th
d0a0: 65 79 27 27 72 65 20 76 65 72 79 20 66 72 75 73  ey''re very frus
d0b0: 74 72 61 74 65 64 27 29 3b 0a 0a 20 20 3c 69 3e  trated');..  <i>
d0c0: 2d 2d 20 54 68 65 20 66 69 72 73 74 20 6f 66 20  -- The first of 
d0d0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77  the following tw
d0e0: 6f 20 71 75 65 72 69 65 73 20 6d 61 74 63 68 65  o queries matche
d0f0: 73 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 73  s the document s
d100: 74 6f 72 65 64 20 69 6e 3c 2f 69 3e 0a 20 20 3c  tored in</i>.  <
d110: 69 3e 2d 2d 20 74 61 62 6c 65 20 22 73 69 6d 70  i>-- table "simp
d120: 6c 65 22 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  le". The second 
d130: 64 6f 65 73 20 6e 6f 74 2e 3c 2f 69 3e 0a 20 20  does not.</i>.  
d140: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 69  SELECT * FROM si
d150: 6d 70 6c 65 20 57 48 45 52 45 20 73 69 6d 70 6c  mple WHERE simpl
d160: 65 20 4d 41 54 43 48 20 27 46 72 75 73 74 72 61  e MATCH 'Frustra
d170: 74 65 64 27 29 3b 0a 20 20 53 45 4c 45 43 54 20  ted');.  SELECT 
d180: 2a 20 46 52 4f 4d 20 73 69 6d 70 6c 65 20 57 48  * FROM simple WH
d190: 45 52 45 20 73 69 6d 70 6c 65 20 4d 41 54 43 48  ERE simple MATCH
d1a0: 20 27 46 72 75 73 74 72 61 74 69 6f 6e 27 29 3b   'Frustration');
d1b0: 0a 0a 20 20 3c 69 3e 2d 2d 20 43 72 65 61 74 65  ..  <i>-- Create
d1c0: 20 61 20 74 61 62 6c 65 20 75 73 69 6e 67 20 74   a table using t
d1d0: 68 65 20 70 6f 72 74 65 72 20 74 6f 6b 65 6e 69  he porter tokeni
d1e0: 7a 65 72 2e 20 49 6e 73 65 72 74 20 74 68 65 20  zer. Insert the 
d1f0: 73 61 6d 65 20 64 6f 63 75 6d 65 6e 74 20 69 6e  same document in
d200: 74 6f 20 69 74 3c 2f 69 3e 0a 20 20 43 52 45 41  to it</i>.  CREA
d210: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
d220: 20 70 6f 72 74 65 72 20 55 53 49 4e 47 20 66 74   porter USING ft
d230: 73 33 28 74 6f 6b 65 6e 69 7a 65 3d 70 6f 72 74  s3(tokenize=port
d240: 65 72 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  er);.  INSERT IN
d250: 54 4f 20 70 6f 72 74 65 72 20 56 41 4c 55 45 53  TO porter VALUES
d260: 28 27 52 69 67 68 74 20 6e 6f 77 20 74 68 65 79  ('Right now they
d270: 27 27 72 65 20 76 65 72 79 20 66 72 75 73 74 72  ''re very frustr
d280: 61 74 65 64 27 29 3b 0a 0a 20 20 3c 69 3e 2d 2d  ated');..  <i>--
d290: 20 42 6f 74 68 20 6f 66 20 74 68 65 20 66 6f 6c   Both of the fol
d2a0: 6c 6f 77 69 6e 67 20 71 75 65 72 69 65 73 20 6d  lowing queries m
d2b0: 61 74 63 68 20 74 68 65 20 64 6f 63 75 6d 65 6e  atch the documen
d2c0: 74 20 73 74 6f 72 65 64 20 69 6e 20 74 61 62 6c  t stored in tabl
d2d0: 65 20 22 70 6f 72 74 65 72 22 2e 3c 2f 69 3e 0a  e "porter".</i>.
d2e0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
d2f0: 70 6f 72 74 65 72 20 57 48 45 52 45 20 70 6f 72  porter WHERE por
d300: 74 65 72 20 4d 41 54 43 48 20 27 46 72 75 73 74  ter MATCH 'Frust
d310: 72 61 74 65 64 27 29 3b 0a 20 20 53 45 4c 45 43  rated');.  SELEC
d320: 54 20 2a 20 46 52 4f 4d 20 70 6f 72 74 65 72 20  T * FROM porter 
d330: 57 48 45 52 45 20 70 6f 72 74 65 72 20 4d 41 54  WHERE porter MAT
d340: 43 48 20 27 46 72 75 73 74 72 61 74 69 6f 6e 27  CH 'Frustration'
d350: 29 3b 0a 7d 5d 0a 0a 3c 70 3e 0a 20 20 49 66 20  );.}]..<p>.  If 
d360: 74 68 69 73 20 65 78 74 65 6e 73 69 6f 6e 20 69  this extension i
d370: 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20  s compiled with 
d380: 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  the SQLITE_ENABL
d390: 45 5f 49 43 55 20 70 72 65 2d 70 72 6f 63 65 73  E_ICU pre-proces
d3a0: 73 6f 72 0a 20 20 73 79 6d 62 6f 6c 20 64 65 66  sor.  symbol def
d3b0: 69 6e 65 64 2c 20 74 68 65 6e 20 74 68 65 72 65  ined, then there
d3c0: 20 65 78 69 73 74 73 20 61 20 62 75 69 6c 74 2d   exists a built-
d3d0: 69 6e 20 74 6f 6b 65 6e 69 7a 65 72 20 6e 61 6d  in tokenizer nam
d3e0: 65 64 20 22 69 63 75 22 0a 20 20 69 6d 70 6c 65  ed "icu".  imple
d3f0: 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 74 68 65  mented using the
d400: 20 49 43 55 20 6c 69 62 72 61 72 79 2e 20 54 68   ICU library. Th
d410: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
d420: 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 0a 20   passed to the. 
d430: 20 78 43 72 65 61 74 65 28 29 20 6d 65 74 68 6f   xCreate() metho
d440: 64 20 28 73 65 65 20 66 74 73 33 5f 74 6f 6b 65  d (see fts3_toke
d450: 6e 69 7a 65 72 2e 68 29 20 6f 66 20 74 68 69 73  nizer.h) of this
d460: 20 74 6f 6b 65 6e 69 7a 65 72 20 6d 61 79 20 62   tokenizer may b
d470: 65 0a 20 20 61 6e 20 49 43 55 20 6c 6f 63 61 6c  e.  an ICU local
d480: 65 20 69 64 65 6e 74 69 66 69 65 72 2e 20 46 6f  e identifier. Fo
d490: 72 20 65 78 61 6d 70 6c 65 20 22 74 72 5f 54 52  r example "tr_TR
d4a0: 22 20 66 6f 72 20 54 75 72 6b 69 73 68 20 61 73  " for Turkish as
d4b0: 20 75 73 65 64 0a 20 20 69 6e 20 54 75 72 6b 65   used.  in Turke
d4c0: 79 2c 20 6f 72 20 22 65 6e 5f 41 55 22 20 66 6f  y, or "en_AU" fo
d4d0: 72 20 45 6e 67 6c 69 73 68 20 61 73 20 75 73 65  r English as use
d4e0: 64 20 69 6e 20 41 75 73 74 72 61 6c 69 61 2e 20  d in Australia. 
d4f0: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 0a 5b 43  For example:..[C
d500: 6f 64 65 20 7b 0a 20 20 20 20 43 52 45 41 54 45  ode {.    CREATE
d510: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74   VIRTUAL TABLE t
d520: 68 61 69 5f 74 65 78 74 20 55 53 49 4e 47 20 66  hai_text USING f
d530: 74 73 33 28 74 65 78 74 2c 20 74 6f 6b 65 6e 69  ts3(text, tokeni
d540: 7a 65 3d 69 63 75 20 74 68 5f 54 48 29 0a 7d 5d  ze=icu th_TH).}]
d550: 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 49 43 55 20  ..<p>.  The ICU 
d560: 74 6f 6b 65 6e 69 7a 65 72 20 69 6d 70 6c 65 6d  tokenizer implem
d570: 65 6e 74 61 74 69 6f 6e 20 69 73 20 76 65 72 79  entation is very
d580: 20 73 69 6d 70 6c 65 2e 20 49 74 20 73 70 6c 69   simple. It spli
d590: 74 73 20 74 68 65 20 69 6e 70 75 74 0a 20 20 74  ts the input.  t
d5a0: 65 78 74 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ext according to
d5b0: 20 74 68 65 20 49 43 55 20 72 75 6c 65 73 20 66   the ICU rules f
d5c0: 6f 72 20 66 69 6e 64 69 6e 67 20 77 6f 72 64 20  or finding word 
d5d0: 62 6f 75 6e 64 61 72 69 65 73 20 61 6e 64 20 64  boundaries and d
d5e0: 69 73 63 61 72 64 73 0a 20 20 61 6e 79 20 74 6f  iscards.  any to
d5f0: 6b 65 6e 73 20 74 68 61 74 20 63 6f 6e 73 69 73  kens that consis
d600: 74 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 77 68  t entirely of wh
d610: 69 74 65 2d 73 70 61 63 65 2e 20 54 68 69 73 20  ite-space. This 
d620: 6d 61 79 20 62 65 20 73 75 69 74 61 62 6c 65 0a  may be suitable.
d630: 20 20 66 6f 72 20 73 6f 6d 65 20 61 70 70 6c 69    for some appli
d640: 63 61 74 69 6f 6e 73 20 69 6e 20 73 6f 6d 65 20  cations in some 
d650: 6c 6f 63 61 6c 65 73 2c 20 62 75 74 20 6e 6f 74  locales, but not
d660: 20 61 6c 6c 2e 20 49 66 20 6d 6f 72 65 20 63 6f   all. If more co
d670: 6d 70 6c 65 78 0a 20 20 70 72 6f 63 65 73 73 69  mplex.  processi
d680: 6e 67 20 69 73 20 72 65 71 75 69 72 65 64 2c 20  ng is required, 
d690: 66 6f 72 20 65 78 61 6d 70 6c 65 20 74 6f 20 69  for example to i
d6a0: 6d 70 6c 65 6d 65 6e 74 20 73 74 65 6d 6d 69 6e  mplement stemmin
d6b0: 67 20 6f 72 0a 20 20 64 69 73 63 61 72 64 20 70  g or.  discard p
d6c0: 75 6e 63 74 75 61 74 69 6f 6e 2c 20 74 68 69 73  unctuation, this
d6d0: 20 63 61 6e 20 62 65 20 64 6f 6e 65 20 62 79 20   can be done by 
d6e0: 63 72 65 61 74 69 6e 67 20 61 20 74 6f 6b 65 6e  creating a token
d6f0: 69 7a 65 72 0a 20 20 69 6d 70 6c 65 6d 65 6e 74  izer.  implement
d700: 61 74 69 6f 6e 20 74 68 61 74 20 75 73 65 73 20  ation that uses 
d710: 74 68 65 20 49 43 55 20 74 6f 6b 65 6e 69 7a 65  the ICU tokenize
d720: 72 20 61 73 20 70 61 72 74 20 6f 66 20 69 74 73  r as part of its
d730: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e   implementation.
d740: 0a 0a 5b 68 32 20 22 43 75 73 74 6f 6d 20 28 55  ..[h2 "Custom (U
d750: 73 65 72 20 49 6d 70 6c 65 6d 65 6e 74 65 64 29  ser Implemented)
d760: 20 54 6f 6b 65 6e 69 7a 65 72 73 22 5d 0a 0a 3c   Tokenizers"]..<
d770: 70 3e 0a 20 20 41 73 20 77 65 6c 6c 20 61 73 20  p>.  As well as 
d780: 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 22 73 69  the built-in "si
d790: 6d 70 6c 65 22 2c 20 22 70 6f 72 74 65 72 22 20  mple", "porter" 
d7a0: 61 6e 64 20 28 70 6f 73 73 69 62 6c 79 29 20 22  and (possibly) "
d7b0: 69 63 75 22 20 74 6f 6b 65 6e 69 7a 65 72 73 2c  icu" tokenizers,
d7c0: 0a 20 20 46 54 53 33 20 65 78 70 6f 72 74 73 20  .  FTS3 exports 
d7d0: 61 6e 20 69 6e 74 65 72 66 61 63 65 20 74 68 61  an interface tha
d7e0: 74 20 61 6c 6c 6f 77 73 20 75 73 65 72 73 20 74  t allows users t
d7f0: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 63 75 73 74  o implement cust
d800: 6f 6d 20 74 6f 6b 65 6e 69 7a 65 72 73 0a 20 20  om tokenizers.  
d810: 75 73 69 6e 67 20 43 2e 20 54 68 65 20 69 6e 74  using C. The int
d820: 65 72 66 61 63 65 20 75 73 65 64 20 74 6f 20 63  erface used to c
d830: 72 65 61 74 65 20 61 20 6e 65 77 20 74 6f 6b 65  reate a new toke
d840: 6e 69 7a 65 72 20 69 73 20 64 65 66 69 6e 65 64  nizer is defined
d850: 20 61 6e 64 20 0a 20 20 64 65 73 63 72 69 62 65   and .  describe
d860: 64 20 69 6e 20 74 68 65 20 66 74 73 33 5f 74 6f  d in the fts3_to
d870: 6b 65 6e 69 7a 65 72 2e 68 20 73 6f 75 72 63 65  kenizer.h source
d880: 20 66 69 6c 65 2e 0a 0a 3c 70 3e 0a 20 20 52 65   file...<p>.  Re
d890: 67 69 73 74 65 72 69 6e 67 20 61 20 6e 65 77 20  gistering a new 
d8a0: 46 54 53 33 20 74 6f 6b 65 6e 69 7a 65 72 20 69  FTS3 tokenizer i
d8b0: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 72 65 67  s similar to reg
d8c0: 69 73 74 65 72 69 6e 67 20 61 20 6e 65 77 0a 20  istering a new. 
d8d0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d   virtual table m
d8e0: 6f 64 75 6c 65 20 77 69 74 68 20 53 51 4c 69 74  odule with SQLit
d8f0: 65 2e 20 54 68 65 20 75 73 65 72 20 70 61 73 73  e. The user pass
d900: 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  es a pointer to 
d910: 61 0a 20 20 73 74 72 75 63 74 75 72 65 20 63 6f  a.  structure co
d920: 6e 74 61 69 6e 69 6e 67 20 70 6f 69 6e 74 65 72  ntaining pointer
d930: 73 20 74 6f 20 76 61 72 69 6f 75 73 20 63 61 6c  s to various cal
d940: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 73 20  lback functions 
d950: 74 68 61 74 0a 20 20 6d 61 6b 65 20 75 70 20 74  that.  make up t
d960: 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
d970: 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 74 6f 6b  n of the new tok
d980: 65 6e 69 7a 65 72 20 74 79 70 65 2e 20 46 6f 72  enizer type. For
d990: 20 74 6f 6b 65 6e 69 7a 65 72 73 2c 0a 20 20 74   tokenizers,.  t
d9a0: 68 65 20 73 74 72 75 63 74 75 72 65 20 28 64 65  he structure (de
d9b0: 66 69 6e 65 64 20 69 6e 20 66 74 73 33 5f 74 6f  fined in fts3_to
d9c0: 6b 65 6e 69 7a 65 72 2e 68 29 20 69 73 20 63 61  kenizer.h) is ca
d9d0: 6c 6c 65 64 0a 20 20 22 73 71 6c 69 74 65 33 5f  lled.  "sqlite3_
d9e0: 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65  tokenizer_module
d9f0: 22 2e 0a 0a 3c 70 3e 0a 20 20 46 54 53 33 20 64  "...<p>.  FTS3 d
da00: 6f 65 73 20 6e 6f 74 20 65 78 70 6f 73 65 20 61  oes not expose a
da10: 20 43 2d 66 75 6e 63 74 69 6f 6e 20 74 68 61 74   C-function that
da20: 20 75 73 65 72 73 20 63 61 6c 6c 20 74 6f 20 72   users call to r
da30: 65 67 69 73 74 65 72 20 6e 65 77 0a 20 20 74 6f  egister new.  to
da40: 6b 65 6e 69 7a 65 72 20 74 79 70 65 73 20 77 69  kenizer types wi
da50: 74 68 20 61 20 64 61 74 61 62 61 73 65 20 68 61  th a database ha
da60: 6e 64 6c 65 2e 20 49 6e 73 74 65 61 64 2c 20 74  ndle. Instead, t
da70: 68 65 20 70 6f 69 6e 74 65 72 20 6d 75 73 74 0a  he pointer must.
da80: 20 20 62 65 20 65 6e 63 6f 64 65 64 20 61 73 20    be encoded as 
da90: 61 6e 20 53 51 4c 20 62 6c 6f 62 20 76 61 6c 75  an SQL blob valu
daa0: 65 20 61 6e 64 20 70 61 73 73 65 64 20 74 6f 20  e and passed to 
dab0: 46 54 53 33 20 74 68 72 6f 75 67 68 20 74 68 65  FTS3 through the
dac0: 20 53 51 4c 0a 20 20 65 6e 67 69 6e 65 20 62 79   SQL.  engine by
dad0: 20 65 76 61 6c 75 61 74 69 6e 67 20 61 20 73 70   evaluating a sp
dae0: 65 63 69 61 6c 20 73 63 61 6c 61 72 20 66 75 6e  ecial scalar fun
daf0: 63 74 69 6f 6e 2c 20 22 66 74 73 33 5f 74 6f 6b  ction, "fts3_tok
db00: 65 6e 69 7a 65 72 28 29 22 2e 0a 20 20 54 68 65  enizer()"..  The
db10: 20 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72 28   fts3_tokenizer(
db20: 29 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62  ) function may b
db30: 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20 6f 6e  e called with on
db40: 65 20 6f 72 20 74 77 6f 20 61 72 67 75 6d 65 6e  e or two argumen
db50: 74 73 2c 0a 20 20 61 73 20 66 6f 6c 6c 6f 77 73  ts,.  as follows
db60: 3a 0a 0a 5b 43 6f 64 65 20 7b 0a 20 20 20 20 53  :..[Code {.    S
db70: 45 4c 45 43 54 20 66 74 73 33 5f 74 6f 6b 65 6e  ELECT fts3_token
db80: 69 7a 65 72 28 26 6c 74 3b 74 6f 6b 65 6e 69 7a  izer(&lt;tokeniz
db90: 65 72 2d 6e 61 6d 65 26 67 74 3b 29 3b 0a 20 20  er-name&gt;);.  
dba0: 20 20 53 45 4c 45 43 54 20 66 74 73 33 5f 74 6f    SELECT fts3_to
dbb0: 6b 65 6e 69 7a 65 72 28 26 6c 74 3b 74 6f 6b 65  kenizer(&lt;toke
dbc0: 6e 69 7a 65 72 2d 6e 61 6d 65 26 67 74 3b 2c 20  nizer-name&gt;, 
dbd0: 26 6c 74 3b 73 71 6c 69 74 65 33 5f 74 6f 6b 65  &lt;sqlite3_toke
dbe0: 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65 20 70 74 72  nizer_module ptr
dbf0: 26 67 74 3b 29 3b 0a 7d 5d 0a 0a 3c 70 3e 0a 20  &gt;);.}]..<p>. 
dc00: 20 57 68 65 72 65 20 3c 74 6f 6b 65 6e 69 7a 65   Where <tokenize
dc10: 72 2d 6e 61 6d 65 3e 20 69 73 20 61 20 73 74 72  r-name> is a str
dc20: 69 6e 67 20 69 64 65 6e 74 69 66 79 69 6e 67 20  ing identifying 
dc30: 74 68 65 20 74 6f 6b 65 6e 69 7a 65 72 20 61 6e  the tokenizer an
dc40: 64 0a 20 20 3c 73 71 6c 69 74 65 33 5f 74 6f 6b  d.  <sqlite3_tok
dc50: 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65 20 70 74  enizer_module pt
dc60: 72 3e 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  r> is a pointer 
dc70: 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 74 6f  to an sqlite3_to
dc80: 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65 0a 20  kenizer_module. 
dc90: 20 73 74 72 75 63 74 75 72 65 20 65 6e 63 6f 64   structure encod
dca0: 65 64 20 61 73 20 61 6e 20 53 51 4c 20 62 6c 6f  ed as an SQL blo
dcb0: 62 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  b. If the second
dcc0: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 70 72 65   argument is pre
dcd0: 73 65 6e 74 2c 0a 20 20 69 74 20 69 73 20 72 65  sent,.  it is re
dce0: 67 69 73 74 65 72 65 64 20 61 73 20 74 6f 6b 65  gistered as toke
dcf0: 6e 69 7a 65 72 20 3c 74 6f 6b 65 6e 69 7a 65 72  nizer <tokenizer
dd00: 2d 6e 61 6d 65 3e 20 61 6e 64 20 61 20 63 6f 70  -name> and a cop
dd10: 79 20 6f 66 20 69 74 0a 20 20 72 65 74 75 72 6e  y of it.  return
dd20: 65 64 2e 20 49 66 20 6f 6e 6c 79 20 6f 6e 65 20  ed. If only one 
dd30: 61 72 67 75 6d 65 6e 74 20 69 73 20 70 61 73 73  argument is pass
dd40: 65 64 2c 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ed, a pointer to
dd50: 20 74 68 65 20 74 6f 6b 65 6e 69 7a 65 72 0a 20   the tokenizer. 
dd60: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
dd70: 63 75 72 72 65 6e 74 6c 79 20 72 65 67 69 73 74  currently regist
dd80: 65 72 65 64 20 61 73 20 3c 74 6f 6b 65 6e 69 7a  ered as <tokeniz
dd90: 65 72 2d 6e 61 6d 65 3e 20 69 73 20 72 65 74 75  er-name> is retu
dda0: 72 6e 65 64 2c 0a 20 20 65 6e 63 6f 64 65 64 20  rned,.  encoded 
ddb0: 61 73 20 61 20 62 6c 6f 62 2e 20 4f 72 2c 20 69  as a blob. Or, i
ddc0: 66 20 6e 6f 20 73 75 63 68 20 74 6f 6b 65 6e 69  f no such tokeni
ddd0: 7a 65 72 20 65 78 69 73 74 73 2c 20 61 6e 20 53  zer exists, an S
dde0: 51 4c 20 65 78 63 65 70 74 69 6f 6e 0a 20 20 28  QL exception.  (
ddf0: 65 72 72 6f 72 29 20 69 73 20 72 61 69 73 65 64  error) is raised
de00: 2e 0a 0a 3c 70 3e 0a 20 20 3c 62 3e 53 45 43 55  ...<p>.  <b>SECU
de10: 52 49 54 59 20 57 41 52 4e 49 4e 47 3c 2f 62 3e  RITY WARNING</b>
de20: 3a 20 49 66 20 74 68 65 20 66 74 73 33 20 65 78  : If the fts3 ex
de30: 74 65 6e 73 69 6f 6e 20 69 73 20 75 73 65 64 20  tension is used 
de40: 69 6e 20 61 6e 20 65 6e 76 69 72 6f 6e 6d 65 6e  in an environmen
de50: 74 0a 20 20 77 68 65 72 65 20 70 6f 74 65 6e 74  t.  where potent
de60: 69 61 6c 6c 79 20 6d 61 6c 69 63 69 6f 75 73 20  ially malicious 
de70: 75 73 65 72 73 20 6d 61 79 20 65 78 65 63 75 74  users may execut
de80: 65 20 61 72 62 69 74 72 61 72 79 20 53 51 4c 2c  e arbitrary SQL,
de90: 20 74 68 65 79 20 73 68 6f 75 6c 64 20 0a 20 20   they should .  
dea0: 62 65 20 70 72 65 76 65 6e 74 65 64 20 66 72 6f  be prevented fro
deb0: 6d 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 66  m invoking the f
dec0: 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72 28 29 20  ts3_tokenizer() 
ded0: 66 75 6e 63 74 69 6f 6e 2c 20 70 6f 73 73 69 62  function, possib
dee0: 6c 79 20 75 73 69 6e 67 20 0a 20 20 74 68 65 20  ly using .  the 
def0: 5c 5b 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75  \[sqlite3_set_au
df00: 74 68 6f 72 69 7a 65 72 28 29 7c 61 75 74 68 6f  thorizer()|autho
df10: 72 69 73 61 74 69 6f 6e 20 63 61 6c 6c 62 61 63  risation callbac
df20: 6b 5c 5d 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20  k\]...<p>.  The 
df30: 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20  following block 
df40: 63 6f 6e 74 61 69 6e 73 20 61 6e 20 65 78 61 6d  contains an exam
df50: 70 6c 65 20 6f 66 20 63 61 6c 6c 69 6e 67 20 74  ple of calling t
df60: 68 65 20 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65  he fts3_tokenize
df70: 72 28 29 0a 20 20 66 75 6e 63 74 69 6f 6e 20 66  r().  function f
df80: 72 6f 6d 20 43 20 63 6f 64 65 3a 0a 0a 5b 43 6f  rom C code:..[Co
df90: 64 65 20 7b 0a 20 20 3c 69 3e 2f 2a 0a 20 20 2a  de {.  <i>/*.  *
dfa0: 2a 20 52 65 67 69 73 74 65 72 20 61 20 74 6f 6b  * Register a tok
dfb0: 65 6e 69 7a 65 72 20 69 6d 70 6c 65 6d 65 6e 74  enizer implement
dfc0: 61 74 69 6f 6e 20 77 69 74 68 20 46 54 53 33 2e  ation with FTS3.
dfd0: 0a 20 20 2a 2f 3c 2f 69 3e 0a 20 20 69 6e 74 20  .  */</i>.  int 
dfe0: 72 65 67 69 73 74 65 72 54 6f 6b 65 6e 69 7a 65  registerTokenize
dff0: 72 28 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  r(.    sqlite3 *
e000: 64 62 2c 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e  db,.    char *zN
e010: 61 6d 65 2c 0a 20 20 20 20 63 6f 6e 73 74 20 73  ame,.    const s
e020: 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72  qlite3_tokenizer
e030: 5f 6d 6f 64 75 6c 65 20 2a 70 0a 20 20 29 7b 0a  _module *p.  ){.
e040: 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
e050: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
e060: 74 6d 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  tmt;.    const c
e070: 68 61 72 20 2a 7a 53 71 6c 20 3d 20 22 53 45 4c  har *zSql = "SEL
e080: 45 43 54 20 66 74 73 33 5f 74 6f 6b 65 6e 69 7a  ECT fts3_tokeniz
e090: 65 72 28 3f 2c 20 3f 29 22 3b 0a 0a 20 20 20 20  er(?, ?)";..    
e0a0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
e0b0: 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c  pare_v2(db, zSql
e0c0: 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
e0d0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
e0e0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
e0f0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
e100: 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  }..    sqlite3_b
e110: 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  ind_text(pStmt, 
e120: 31 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51  1, zName, -1, SQ
e130: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
e140: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62    sqlite3_bind_b
e150: 6c 6f 62 28 70 53 74 6d 74 2c 20 32 2c 20 26 70  lob(pStmt, 2, &p
e160: 2c 20 73 69 7a 65 6f 66 28 70 29 2c 20 53 51 4c  , sizeof(p), SQL
e170: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
e180: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
e190: 74 6d 74 29 3b 0a 0a 20 20 20 20 72 65 74 75 72  tmt);..    retur
e1a0: 6e 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  n sqlite3_finali
e1b0: 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 0a  ze(pStmt);.  }..
e1c0: 20 20 3c 69 3e 2f 2a 0a 20 20 2a 2a 20 51 75 65    <i>/*.  ** Que
e1d0: 72 79 20 46 54 53 33 20 66 6f 72 20 74 68 65 20  ry FTS3 for the 
e1e0: 74 6f 6b 65 6e 69 7a 65 72 20 69 6d 70 6c 65 6d  tokenizer implem
e1f0: 65 6e 74 61 74 69 6f 6e 20 6e 61 6d 65 64 20 7a  entation named z
e200: 4e 61 6d 65 2e 0a 20 20 2a 2f 3c 2f 69 3e 0a 20  Name..  */</i>. 
e210: 20 69 6e 74 20 71 75 65 72 79 54 6f 6b 65 6e 69   int queryTokeni
e220: 7a 65 72 28 0a 20 20 20 20 73 71 6c 69 74 65 33  zer(.    sqlite3
e230: 20 2a 64 62 2c 0a 20 20 20 20 63 68 61 72 20 2a   *db,.    char *
e240: 7a 4e 61 6d 65 2c 0a 20 20 20 20 63 6f 6e 73 74  zName,.    const
e250: 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a   sqlite3_tokeniz
e260: 65 72 5f 6d 6f 64 75 6c 65 20 2a 2a 70 70 0a 20  er_module **pp. 
e270: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
e280: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
e290: 20 2a 70 53 74 6d 74 3b 0a 20 20 20 20 63 6f 6e   *pStmt;.    con
e2a0: 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20  st char *zSql = 
e2b0: 22 53 45 4c 45 43 54 20 66 74 73 33 5f 74 6f 6b  "SELECT fts3_tok
e2c0: 65 6e 69 7a 65 72 28 3f 29 22 3b 0a 0a 20 20 20  enizer(?)";..   
e2d0: 20 2a 70 70 20 3d 20 30 3b 0a 20 20 20 20 72 63   *pp = 0;.    rc
e2e0: 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
e2f0: 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20  re_v2(db, zSql, 
e300: 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
e310: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
e320: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
e330: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
e340: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  .    sqlite3_bin
e350: 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 2c  d_text(pStmt, 1,
e360: 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49   zName, -1, SQLI
e370: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
e380: 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d  if( SQLITE_ROW==
e390: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
e3a0: 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  mt) ){.      if(
e3b0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
e3c0: 74 79 70 65 28 70 53 74 6d 74 2c 20 30 29 3d 3d  type(pStmt, 0)==
e3d0: 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29 7b 0a 20  SQLITE_BLOB ){. 
e3e0: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 70         memcpy(pp
e3f0: 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
e400: 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 30 29 2c  _blob(pStmt, 0),
e410: 20 73 69 7a 65 6f 66 28 2a 70 70 29 29 3b 0a 20   sizeof(*pp));. 
e420: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
e430: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
e440: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
e450: 3b 0a 20 20 7d 0a 7d 5d 0a 0a 20 20 0a 20 20 0a  ;.  }.}]..  .  .
e460: 0a 5b 68 31 20 22 44 61 74 61 20 53 74 72 75 63  .[h1 "Data Struc
e470: 74 75 72 65 73 22 20 7b 7d 20 7b 73 65 67 6d 65  tures" {} {segme
e480: 6e 74 20 62 74 72 65 65 7d 5d 0a 0a 3c 70 3e 0a  nt btree}]..<p>.
e490: 20 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 64    This section d
e4a0: 65 73 63 72 69 62 65 73 20 61 74 20 61 20 68 69  escribes at a hi
e4b0: 67 68 2d 6c 65 76 65 6c 20 74 68 65 20 77 61 79  gh-level the way
e4c0: 20 74 68 65 20 46 54 53 33 20 6d 6f 64 75 6c 65   the FTS3 module
e4d0: 20 73 74 6f 72 65 73 20 69 74 73 0a 20 20 69 6e   stores its.  in
e4e0: 64 65 78 20 61 6e 64 20 63 6f 6e 74 65 6e 74 20  dex and content 
e4f0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
e500: 20 49 74 20 69 73 20 3c 62 3e 6e 6f 74 20 6e 65   It is <b>not ne
e510: 63 65 73 73 61 72 79 20 74 6f 20 72 65 61 64 20  cessary to read 
e520: 6f 72 20 0a 20 20 75 6e 64 65 72 73 74 61 6e 64  or .  understand
e530: 20 74 68 65 20 6d 61 74 65 72 69 61 6c 20 69 6e   the material in
e540: 20 74 68 69 73 20 73 65 63 74 69 6f 6e 20 69 6e   this section in
e550: 20 6f 72 64 65 72 20 74 6f 20 75 73 65 20 46 54   order to use FT
e560: 53 33 3c 2f 62 3e 20 69 6e 20 61 6e 20 0a 20 20  S3</b> in an .  
e570: 61 70 70 6c 69 63 61 74 69 6f 6e 2e 20 48 6f 77  application. How
e580: 65 76 65 72 2c 20 69 74 20 6d 61 79 20 62 65 20  ever, it may be 
e590: 75 73 65 66 75 6c 20 74 6f 20 61 70 70 6c 69 63  useful to applic
e5a0: 61 74 69 6f 6e 20 64 65 76 65 6c 6f 70 65 72 73  ation developers
e5b0: 20 61 74 74 65 6d 70 74 69 6e 67 20 0a 20 20 74   attempting .  t
e5c0: 6f 20 61 6e 61 6c 79 7a 65 20 61 6e 64 20 75 6e  o analyze and un
e5d0: 64 65 72 73 74 61 6e 64 20 46 54 53 33 20 70 65  derstand FTS3 pe
e5e0: 72 66 6f 72 6d 61 6e 63 65 20 63 68 61 72 61 63  rformance charac
e5f0: 74 65 72 69 73 74 69 63 73 2c 20 6f 72 20 74 6f  teristics, or to
e600: 20 64 65 76 65 6c 6f 70 65 72 73 20 0a 20 20 63   developers .  c
e610: 6f 6e 74 65 6d 70 6c 61 74 69 6e 67 20 65 6e 68  ontemplating enh
e620: 61 6e 63 65 6d 65 6e 74 73 20 74 6f 20 74 68 65  ancements to the
e630: 20 65 78 69 73 74 69 6e 67 20 46 54 53 33 20 66   existing FTS3 f
e640: 65 61 74 75 72 65 20 73 65 74 2e 0a 0a 3c 70 3e  eature set...<p>
e650: 0a 20 20 46 6f 72 20 65 61 63 68 20 46 54 53 33  .  For each FTS3
e660: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69   virtual table i
e670: 6e 20 61 20 64 61 74 61 62 61 73 65 2c 20 74 68  n a database, th
e680: 72 65 65 20 72 65 61 6c 20 28 6e 6f 6e 2d 76 69  ree real (non-vi
e690: 72 74 75 61 6c 29 20 74 61 62 6c 65 73 20 0a 20  rtual) tables . 
e6a0: 20 61 72 65 20 63 72 65 61 74 65 64 20 74 6f 20   are created to 
e6b0: 73 74 6f 72 65 20 74 68 65 20 75 6e 64 65 72 6c  store the underl
e6c0: 79 69 6e 67 20 64 61 74 61 2e 20 54 68 65 20 72  ying data. The r
e6d0: 65 61 6c 20 74 61 62 6c 65 73 20 61 72 65 20 6e  eal tables are n
e6e0: 61 6d 65 64 20 22 25 5f 63 6f 6e 74 65 6e 74 22  amed "%_content"
e6f0: 2c 0a 20 20 22 25 5f 73 65 67 64 69 72 22 20 61  ,.  "%_segdir" a
e700: 6e 64 20 22 25 5f 73 65 67 6d 65 6e 74 73 22 2c  nd "%_segments",
e710: 20 77 68 65 72 65 20 22 25 22 20 69 73 20 72 65   where "%" is re
e720: 70 6c 61 63 65 64 20 62 79 20 74 68 65 20 6e 61  placed by the na
e730: 6d 65 20 73 75 70 70 6c 69 65 64 20 62 79 0a 20  me supplied by. 
e740: 20 74 68 65 20 75 73 65 72 20 66 6f 72 20 74 68   the user for th
e750: 65 20 46 54 53 33 20 76 69 72 74 75 61 6c 20 74  e FTS3 virtual t
e760: 61 62 6c 65 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65  able...<p>.  The
e770: 20 6c 65 66 74 6d 6f 73 74 20 63 6f 6c 75 6d 6e   leftmost column
e780: 20 6f 66 20 74 68 65 20 22 25 5f 63 6f 6e 74 65   of the "%_conte
e790: 6e 74 22 20 74 61 62 6c 65 20 69 73 20 61 6e 20  nt" table is an 
e7a0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
e7b0: 4b 45 59 20 66 69 65 6c 64 0a 20 20 6e 61 6d 65  KEY field.  name
e7c0: 64 20 22 64 6f 63 69 64 22 2e 20 46 6f 6c 6c 6f  d "docid". Follo
e7d0: 77 69 6e 67 20 74 68 69 73 20 69 73 20 6f 6e 65  wing this is one
e7e0: 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 65 61 63 68   column for each
e7f0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 46   column of the F
e800: 54 53 33 0a 20 20 76 69 72 74 75 61 6c 20 74 61  TS3.  virtual ta
e810: 62 6c 65 20 61 73 20 64 65 63 6c 61 72 65 64 20  ble as declared 
e820: 62 79 20 74 68 65 20 75 73 65 72 2c 20 6e 61 6d  by the user, nam
e830: 65 64 20 62 79 20 70 72 65 70 65 6e 64 69 6e 67  ed by prepending
e840: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
e850: 0a 20 20 73 75 70 70 6c 69 65 64 20 62 79 20 74  .  supplied by t
e860: 68 65 20 75 73 65 72 20 77 69 74 68 20 22 63 3c  he user with "c<
e870: 69 3e 4e 3c 2f 69 3e 22 2c 20 77 68 65 72 65 20  i>N</i>", where 
e880: 3c 69 3e 4e 3c 2f 69 3e 20 69 73 20 74 68 65 20  <i>N</i> is the 
e890: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 0a 20 20  index of the .  
e8a0: 63 6f 6c 75 6d 6e 20 77 69 74 68 69 6e 20 74 68  column within th
e8b0: 65 20 74 61 62 6c 65 2c 20 6e 75 6d 62 65 72 65  e table, numbere
e8c0: 64 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72  d from left to r
e8d0: 69 67 68 74 20 73 74 61 72 74 69 6e 67 20 77 69  ight starting wi
e8e0: 74 68 20 31 2e 20 44 61 74 61 0a 20 20 74 79 70  th 1. Data.  typ
e8f0: 65 73 20 73 75 70 70 6c 69 65 64 20 61 73 20 70  es supplied as p
e900: 61 72 74 20 6f 66 20 74 68 65 20 76 69 72 74 75  art of the virtu
e910: 61 6c 20 74 61 62 6c 65 20 64 65 63 6c 61 72 61  al table declara
e920: 74 69 6f 6e 20 61 72 65 20 6e 6f 74 20 75 73 65  tion are not use
e930: 64 20 61 73 0a 20 20 70 61 72 74 20 6f 66 20 74  d as.  part of t
e940: 68 65 20 25 5f 63 6f 6e 74 65 6e 74 20 74 61 62  he %_content tab
e950: 6c 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 2e 20  le declaration. 
e960: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 0a 5b 43  For example:..[C
e970: 6f 64 65 20 7b 0a 20 20 3c 69 3e 2d 2d 20 56 69  ode {.  <i>-- Vi
e980: 72 74 75 61 6c 20 74 61 62 6c 65 20 64 65 63 6c  rtual table decl
e990: 61 72 61 74 69 6f 6e 3c 2f 69 3e 0a 20 20 43 52  aration</i>.  CR
e9a0: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
e9b0: 4c 45 20 61 62 63 20 55 53 49 4e 47 20 46 54 53  LE abc USING FTS
e9c0: 33 28 61 20 4e 55 4d 42 45 52 2c 20 62 20 54 45  3(a NUMBER, b TE
e9d0: 58 54 2c 20 63 29 3b 0a 0a 20 20 3c 69 3e 2d 2d  XT, c);..  <i>--
e9e0: 20 43 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 25   Corresponding %
e9f0: 5f 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 20 64  _content table d
ea00: 65 63 6c 61 72 61 74 69 6f 6e 3c 2f 69 3e 0a 20  eclaration</i>. 
ea10: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 62   CREATE TABLE ab
ea20: 63 5f 63 6f 6e 74 65 6e 74 28 64 6f 63 69 64 20  c_content(docid 
ea30: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
ea40: 4b 45 59 2c 20 63 30 61 2c 20 63 31 62 2c 20 63  KEY, c0a, c1b, c
ea50: 32 63 29 3b 0a 7d 5d 0a 0a 3c 70 3e 0a 20 20 54  2c);.}]..<p>.  T
ea60: 68 65 20 25 5f 63 6f 6e 74 65 6e 74 20 74 61 62  he %_content tab
ea70: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  le contains the 
ea80: 75 6e 61 64 75 6c 74 65 72 61 74 65 64 20 64 61  unadulterated da
ea90: 74 61 20 69 6e 73 65 72 74 65 64 20 62 79 20 74  ta inserted by t
eaa0: 68 65 20 75 73 65 72 20 0a 20 20 69 6e 74 6f 20  he user .  into 
eab0: 74 68 65 20 46 54 53 33 20 76 69 72 74 75 61 6c  the FTS3 virtual
eac0: 20 74 61 62 6c 65 20 62 79 20 74 68 65 20 75 73   table by the us
ead0: 65 72 2e 20 49 66 20 74 68 65 20 75 73 65 72 20  er. If the user 
eae0: 64 6f 65 73 20 6e 6f 74 20 65 78 70 6c 69 63 69  does not explici
eaf0: 74 6c 79 0a 20 20 73 75 70 70 6c 79 20 61 20 22  tly.  supply a "
eb00: 64 6f 63 69 64 22 20 76 61 6c 75 65 20 77 68 65  docid" value whe
eb10: 6e 20 69 6e 73 65 72 74 69 6e 67 20 72 65 63 6f  n inserting reco
eb20: 72 64 73 2c 20 6f 6e 65 20 69 73 20 73 65 6c 65  rds, one is sele
eb30: 63 74 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  cted automatical
eb40: 6c 79 0a 20 20 62 79 20 74 68 65 20 73 79 73 74  ly.  by the syst
eb50: 65 6d 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 74  em...<p>.  The t
eb60: 77 6f 20 72 65 6d 61 69 6e 69 6e 67 20 74 61 62  wo remaining tab
eb70: 6c 65 73 2c 20 25 5f 73 65 67 6d 65 6e 74 73 20  les, %_segments 
eb80: 61 6e 64 20 25 5f 73 65 67 64 69 72 2c 20 61 72  and %_segdir, ar
eb90: 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20  e used to store 
eba0: 74 68 65 20 0a 20 20 66 75 6c 6c 2d 74 65 78 74  the .  full-text
ebb0: 20 69 6e 64 65 78 2e 20 43 6f 6e 63 65 70 74 75   index. Conceptu
ebc0: 61 6c 6c 79 2c 20 74 68 69 73 20 69 6e 64 65 78  ally, this index
ebd0: 20 69 73 20 61 20 6c 6f 6f 6b 75 70 20 74 61 62   is a lookup tab
ebe0: 6c 65 20 74 68 61 74 20 6d 61 70 73 20 65 61 63  le that maps eac
ebf0: 68 20 0a 20 20 74 65 72 6d 20 28 77 6f 72 64 29  h .  term (word)
ec00: 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66 20 64   to the set of d
ec10: 6f 63 69 64 20 76 61 6c 75 65 73 20 63 6f 72 72  ocid values corr
ec20: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 72 65 63  esponding to rec
ec30: 6f 72 64 73 20 69 6e 20 74 68 65 20 0a 20 20 25  ords in the .  %
ec40: 5f 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 20 74  _content table t
ec50: 68 61 74 20 63 6f 6e 74 61 69 6e 20 6f 6e 65 20  hat contain one 
ec60: 6f 72 20 6d 6f 72 65 20 6f 63 63 75 72 72 65 6e  or more occurren
ec70: 63 65 73 20 6f 66 20 74 68 65 20 74 65 72 6d 2e  ces of the term.
ec80: 20 54 6f 0a 20 20 72 65 74 72 69 65 76 65 20 61   To.  retrieve a
ec90: 6c 6c 20 64 6f 63 75 6d 65 6e 74 73 20 74 68 61  ll documents tha
eca0: 74 20 63 6f 6e 74 61 69 6e 20 61 20 73 70 65 63  t contain a spec
ecb0: 69 66 69 65 64 20 74 65 72 6d 2c 20 74 68 65 20  ified term, the 
ecc0: 46 54 53 33 20 6d 6f 64 75 6c 65 0a 20 20 71 75  FTS3 module.  qu
ecd0: 65 72 69 65 73 20 74 68 69 73 20 69 6e 64 65 78  eries this index
ece0: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
ecf0: 65 20 73 65 74 20 6f 66 20 64 6f 63 69 64 20 76  e set of docid v
ed00: 61 6c 75 65 73 20 66 6f 72 20 72 65 63 6f 72 64  alues for record
ed10: 73 20 74 68 61 74 0a 20 20 63 6f 6e 74 61 69 6e  s that.  contain
ed20: 20 74 68 65 20 74 65 72 6d 2c 20 74 68 65 6e 20   the term, then 
ed30: 72 65 74 72 69 65 76 65 73 20 74 68 65 20 72 65  retrieves the re
ed40: 71 75 69 72 65 64 20 64 6f 63 75 6d 65 6e 74 73  quired documents
ed50: 20 66 72 6f 6d 20 74 68 65 20 25 5f 63 6f 6e 74   from the %_cont
ed60: 65 6e 74 0a 20 20 74 61 62 6c 65 2e 20 52 65 67  ent.  table. Reg
ed70: 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 73  ardless of the s
ed80: 63 68 65 6d 61 20 6f 66 20 74 68 65 20 46 54 53  chema of the FTS
ed90: 33 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c  3 virtual table,
eda0: 20 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 0a   the %_segments.
edb0: 20 20 61 6e 64 20 25 5f 73 65 67 64 69 72 20 74    and %_segdir t
edc0: 61 62 6c 65 73 20 61 72 65 20 61 6c 77 61 79 73  ables are always
edd0: 20 63 72 65 61 74 65 64 20 61 73 20 66 6f 6c 6c   created as foll
ede0: 6f 77 73 3a 0a 0a 5b 43 6f 64 65 20 7b 0a 20 20  ows:..[Code {.  
edf0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 25 5f 73  CREATE TABLE %_s
ee00: 65 67 6d 65 6e 74 73 28 0a 20 20 20 20 62 6c 6f  egments(.    blo
ee10: 63 6b 69 64 20 49 4e 54 45 47 45 52 20 50 52 49  ckid INTEGER PRI
ee20: 4d 41 52 59 20 4b 45 59 2c 20 20 20 20 20 20 20  MARY KEY,       
ee30: 3c 69 3e 2d 2d 20 42 2d 74 72 65 65 20 6e 6f 64  <i>-- B-tree nod
ee40: 65 20 69 64 3c 2f 69 3e 0a 20 20 20 20 62 6c 6f  e id</i>.    blo
ee50: 63 6b 20 62 6c 6f 62 20 20 20 20 20 20 20 20 20  ck blob         
ee60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee70: 3c 69 3e 2d 2d 20 42 2d 74 72 65 65 20 6e 6f 64  <i>-- B-tree nod
ee80: 65 20 64 61 74 61 3c 2f 69 3e 0a 20 20 29 3b 0a  e data</i>.  );.
ee90: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
eea0: 25 5f 73 65 67 64 69 72 28 0a 20 20 20 20 6c 65  %_segdir(.    le
eeb0: 76 65 6c 20 49 4e 54 45 47 45 52 2c 0a 20 20 20  vel INTEGER,.   
eec0: 20 69 64 78 20 49 4e 54 45 47 45 52 2c 0a 20 20   idx INTEGER,.  
eed0: 20 20 73 74 61 72 74 5f 62 6c 6f 63 6b 20 49 4e    start_block IN
eee0: 54 45 47 45 52 2c 20 20 20 20 20 20 20 20 20 20  TEGER,          
eef0: 20 20 20 20 20 3c 69 3e 2d 2d 20 42 6c 6f 63 6b       <i>-- Block
ef00: 69 64 20 6f 66 20 66 69 72 73 74 20 6e 6f 64 65  id of first node
ef10: 20 69 6e 20 25 5f 73 65 67 6d 65 6e 74 73 3c 2f   in %_segments</
ef20: 69 3e 0a 20 20 20 20 6c 65 61 76 65 73 5f 65 6e  i>.    leaves_en
ef30: 64 5f 62 6c 6f 63 6b 20 49 4e 54 45 47 45 52 2c  d_block INTEGER,
ef40: 20 20 20 20 20 20 20 20 20 20 3c 69 3e 2d 2d 20            <i>-- 
ef50: 42 6c 6f 63 6b 69 64 20 6f 66 20 6c 61 73 74 20  Blockid of last 
ef60: 6c 65 61 66 20 6e 6f 64 65 20 69 6e 20 25 5f 73  leaf node in %_s
ef70: 65 67 6d 65 6e 74 73 3c 2f 69 3e 0a 20 20 20 20  egments</i>.    
ef80: 65 6e 64 5f 62 6c 6f 63 6b 20 49 4e 54 45 47 45  end_block INTEGE
ef90: 52 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R,              
efa0: 20 20 20 3c 69 3e 2d 2d 20 42 6c 6f 63 6b 69 64     <i>-- Blockid
efb0: 20 6f 66 20 6c 61 73 74 20 6e 6f 64 65 20 69 6e   of last node in
efc0: 20 25 5f 73 65 67 6d 65 6e 74 73 3c 2f 69 3e 0a   %_segments</i>.
efd0: 20 20 20 20 72 6f 6f 74 20 42 4c 4f 42 2c 20 20      root BLOB,  
efe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eff0: 20 20 20 20 20 20 20 3c 69 3e 2d 2d 20 42 2d 74         <i>-- B-t
f000: 72 65 65 20 72 6f 6f 74 20 6e 6f 64 65 3c 2f 69  ree root node</i
f010: 3e 0a 20 20 20 20 50 52 49 4d 41 52 59 20 4b 45  >.    PRIMARY KE
f020: 59 28 6c 65 76 65 6c 2c 20 69 64 78 29 0a 20 20  Y(level, idx).  
f030: 29 3b 0a 7d 5d 0a 0a 3c 70 3e 0a 20 20 54 68 65  );.}]..<p>.  The
f040: 20 73 63 68 65 6d 61 20 64 65 70 69 63 74 65 64   schema depicted
f050: 20 61 62 6f 76 65 20 69 73 20 6e 6f 74 20 64 65   above is not de
f060: 73 69 67 6e 65 64 20 74 6f 20 73 74 6f 72 65 20  signed to store 
f070: 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e  the full-text in
f080: 64 65 78 20 0a 20 20 64 69 72 65 63 74 6c 79 2e  dex .  directly.
f090: 20 49 6e 73 74 65 61 64 2c 20 69 74 20 69 73 20   Instead, it is 
f0a0: 75 73 65 64 20 74 6f 20 6f 6e 65 20 6f 72 20 6d  used to one or m
f0b0: 6f 72 65 20 62 2d 74 72 65 65 20 73 74 72 75 63  ore b-tree struc
f0c0: 74 75 72 65 73 2e 20 54 68 65 72 65 0a 20 20 69  tures. There.  i
f0d0: 73 20 6f 6e 65 20 62 2d 74 72 65 65 20 66 6f 72  s one b-tree for
f0e0: 20 65 61 63 68 20 72 6f 77 20 69 6e 20 74 68 65   each row in the
f0f0: 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65 2e   %_segdir table.
f100: 20 54 68 65 20 25 5f 73 65 67 64 69 72 20 74 61   The %_segdir ta
f110: 62 6c 65 0a 20 20 72 6f 77 20 63 6f 6e 74 61 69  ble.  row contai
f120: 6e 73 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65  ns the root node
f130: 20 61 6e 64 20 76 61 72 69 6f 75 73 20 6d 65 74   and various met
f140: 61 2d 64 61 74 61 20 61 73 73 6f 63 69 61 74 65  a-data associate
f150: 64 20 77 69 74 68 20 74 68 65 0a 20 20 62 2d 74  d with the.  b-t
f160: 72 65 65 20 73 74 72 75 63 74 75 72 65 2c 20 61  ree structure, a
f170: 6e 64 20 74 68 65 20 25 5f 73 65 67 6d 65 6e 74  nd the %_segment
f180: 73 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73  s table contains
f190: 20 61 6c 6c 20 6f 74 68 65 72 20 28 6e 6f 6e 2d   all other (non-
f1a0: 72 6f 6f 74 29 0a 20 20 62 2d 74 72 65 65 20 6e  root).  b-tree n
f1b0: 6f 64 65 73 2e 20 45 61 63 68 20 62 2d 74 72 65  odes. Each b-tre
f1c0: 65 20 69 73 20 72 65 66 65 72 72 65 64 20 74 6f  e is referred to
f1d0: 20 61 73 20 61 20 22 73 65 67 6d 65 6e 74 22 2e   as a "segment".
f1e0: 20 4f 6e 63 65 20 69 74 20 68 61 73 0a 20 20 62   Once it has.  b
f1f0: 65 65 6e 20 63 72 65 61 74 65 64 2c 20 61 20 73  een created, a s
f200: 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 20 69 73  egment b-tree is
f210: 20 6e 65 76 65 72 20 75 70 64 61 74 65 64 20 28   never updated (
f220: 61 6c 74 68 6f 75 67 68 20 69 74 20 6d 61 79 20  although it may 
f230: 62 65 0a 20 20 64 65 6c 65 74 65 64 20 61 6c 74  be.  deleted alt
f240: 6f 67 65 74 68 65 72 29 2e 0a 0a 3c 70 3e 0a 20  ogether)...<p>. 
f250: 20 54 68 65 20 6b 65 79 73 20 75 73 65 64 20 62   The keys used b
f260: 79 20 65 61 63 68 20 73 65 67 6d 65 6e 74 20 62  y each segment b
f270: 2d 74 72 65 65 20 61 72 65 20 74 65 72 6d 73 20  -tree are terms 
f280: 28 77 6f 72 64 73 29 2e 20 41 73 20 77 65 6c 6c  (words). As well
f290: 20 61 73 20 74 68 65 0a 20 20 6b 65 79 2c 20 65   as the.  key, e
f2a0: 61 63 68 20 73 65 67 6d 65 6e 74 20 62 2d 74 72  ach segment b-tr
f2b0: 65 65 20 65 6e 74 72 79 20 68 61 73 20 61 6e 20  ee entry has an 
f2c0: 61 73 73 6f 63 69 61 74 65 64 20 22 64 6f 63 6c  associated "docl
f2d0: 69 73 74 22 20 28 64 6f 63 75 6d 65 6e 74 20 6c  ist" (document l
f2e0: 69 73 74 29 2e 0a 20 20 41 20 64 6f 63 6c 69 73  ist)..  A doclis
f2f0: 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 7a 65  t consists of ze
f300: 72 6f 20 6f 72 20 6d 6f 72 65 20 65 6e 74 72 69  ro or more entri
f310: 65 73 2c 20 77 68 65 72 65 20 65 61 63 68 20 65  es, where each e
f320: 6e 74 72 79 20 63 6f 6e 73 69 73 74 73 20 6f 66  ntry consists of
f330: 3a 0a 0a 3c 75 6c 3e 0a 20 20 3c 6c 69 3e 20 41  :..<ul>.  <li> A
f340: 20 64 6f 63 69 64 20 28 64 6f 63 75 6d 65 6e 74   docid (document
f350: 20 69 64 29 2c 20 61 6e 64 0a 20 20 3c 6c 69 3e   id), and.  <li>
f360: 20 41 20 6c 69 73 74 20 6f 66 20 74 65 72 6d 20   A list of term 
f370: 6f 66 66 73 65 74 73 2c 20 6f 6e 65 20 66 6f 72  offsets, one for
f380: 20 65 61 63 68 20 6f 63 63 75 72 72 65 6e 63 65   each occurrence
f390: 20 6f 66 20 74 68 65 20 74 65 72 6d 20 77 69 74   of the term wit
f3a0: 68 69 6e 0a 20 20 20 20 20 20 20 74 68 65 20 64  hin.       the d
f3b0: 6f 63 75 6d 65 6e 74 2e 20 41 20 74 65 72 6d 20  ocument. A term 
f3c0: 6f 66 66 73 65 74 20 69 6e 64 69 63 61 74 65 73  offset indicates
f3d0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   the number of t
f3e0: 6f 6b 65 6e 73 20 28 77 6f 72 64 73 29 0a 20 20  okens (words).  
f3f0: 20 20 20 20 20 74 68 61 74 20 6f 63 63 75 72 20       that occur 
f400: 62 65 66 6f 72 65 20 74 68 65 20 74 65 72 6d 20  before the term 
f410: 69 6e 20 71 75 65 73 74 69 6f 6e 2c 20 6e 6f 74  in question, not
f420: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
f430: 68 61 72 61 63 74 65 72 73 0a 20 20 20 20 20 20  haracters.      
f440: 20 6f 72 20 62 79 74 65 73 2e 20 46 6f 72 20 65   or bytes. For e
f450: 78 61 6d 70 6c 65 2c 20 74 68 65 20 74 65 72 6d  xample, the term
f460: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 74   offset of the t
f470: 65 72 6d 20 22 77 61 72 22 20 69 6e 20 74 68 65  erm "war" in the
f480: 0a 20 20 20 20 20 20 20 70 68 72 61 73 65 20 22  .       phrase "
f490: 41 6e 63 65 73 74 72 61 6c 20 76 6f 69 63 65 73  Ancestral voices
f4a0: 20 70 72 6f 70 68 65 73 79 69 6e 67 20 77 61 72   prophesying war
f4b0: 21 22 20 69 73 20 33 2e 0a 3c 2f 75 6c 3e 0a 0a  !" is 3..</ul>..
f4c0: 3c 70 3e 0a 20 20 45 6e 74 72 69 65 73 20 77 69  <p>.  Entries wi
f4d0: 74 68 69 6e 20 61 20 64 6f 63 6c 69 73 74 20 61  thin a doclist a
f4e0: 72 65 20 73 6f 72 74 65 64 20 62 79 20 64 6f 63  re sorted by doc
f4f0: 69 64 2e 20 50 6f 73 69 74 69 6f 6e 73 20 77 69  id. Positions wi
f500: 74 68 69 6e 20 61 20 64 6f 63 6c 69 73 74 0a 20  thin a doclist. 
f510: 20 65 6e 74 72 79 20 61 72 65 20 73 74 6f 72 65   entry are store
f520: 64 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  d in ascending o
f530: 72 64 65 72 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65  rder...<p>.  The
f540: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
f550: 20 6c 6f 67 69 63 61 6c 20 66 75 6c 6c 2d 74 65   logical full-te
f560: 78 74 20 69 6e 64 65 78 20 69 73 20 66 6f 75 6e  xt index is foun
f570: 64 20 62 79 20 6d 65 72 67 69 6e 67 20 74 68 65  d by merging the
f580: 0a 20 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61  .  contents of a
f590: 6c 6c 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65  ll segment b-tre
f5a0: 65 73 2e 20 49 66 20 61 20 74 65 72 6d 20 69 73  es. If a term is
f5b0: 20 70 72 65 73 65 6e 74 20 69 6e 20 6d 6f 72 65   present in more
f5c0: 20 74 68 61 6e 20 6f 6e 65 0a 20 20 73 65 67 6d   than one.  segm
f5d0: 65 6e 74 20 62 2d 74 72 65 65 2c 20 74 68 65 6e  ent b-tree, then
f5e0: 20 69 74 20 6d 61 70 73 20 74 6f 20 74 68 65 20   it maps to the 
f5f0: 75 6e 69 6f 6e 20 6f 66 20 65 61 63 68 20 69 6e  union of each in
f600: 64 69 76 69 64 75 61 6c 20 64 6f 63 6c 69 73 74  dividual doclist
f610: 2e 20 49 66 2c 0a 20 20 66 6f 72 20 61 20 73 69  . If,.  for a si
f620: 6e 67 6c 65 20 74 65 72 6d 2c 20 74 68 65 20 73  ngle term, the s
f630: 61 6d 65 20 64 6f 63 69 64 20 6f 63 63 75 72 73  ame docid occurs
f640: 20 69 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   in more than on
f650: 65 20 64 6f 63 6c 69 73 74 2c 20 74 68 65 6e 20  e doclist, then 
f660: 6f 6e 6c 79 0a 20 20 74 68 65 20 64 6f 63 6c 69  only.  the docli
f670: 73 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20  st that is part 
f680: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
f690: 6e 74 6c 79 20 63 72 65 61 74 65 64 20 73 65 67  ntly created seg
f6a0: 6d 65 6e 74 20 62 2d 74 72 65 65 20 69 73 20 0a  ment b-tree is .
f6b0: 20 20 63 6f 6e 73 69 64 65 72 65 64 20 76 61 6c    considered val
f6c0: 69 64 2e 20 0a 0a 3c 70 3e 0a 20 20 4d 75 6c 74  id. ..<p>.  Mult
f6d0: 69 70 6c 65 20 62 2d 74 72 65 65 20 73 74 72 75  iple b-tree stru
f6e0: 63 74 75 72 65 73 20 61 72 65 20 75 73 65 64 20  ctures are used 
f6f0: 69 6e 73 74 65 61 64 20 6f 66 20 61 20 73 69 6e  instead of a sin
f700: 67 6c 65 20 62 2d 74 72 65 65 20 74 6f 20 72 65  gle b-tree to re
f710: 64 75 63 65 0a 20 20 74 68 65 20 63 6f 73 74 20  duce.  the cost 
f720: 6f 66 20 69 6e 73 65 72 74 69 6e 67 20 72 65 63  of inserting rec
f730: 6f 72 64 73 20 69 6e 74 6f 20 46 54 53 33 20 74  ords into FTS3 t
f740: 61 62 6c 65 73 2e 20 57 68 65 6e 20 61 20 6e 65  ables. When a ne
f750: 77 20 72 65 63 6f 72 64 20 69 73 20 0a 20 20 69  w record is .  i
f760: 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 61 6e 20  nserted into an 
f770: 46 54 53 33 20 74 61 62 6c 65 20 74 68 61 74 20  FTS3 table that 
f780: 61 6c 72 65 61 64 79 20 63 6f 6e 74 61 69 6e 73  already contains
f790: 20 61 20 6c 6f 74 20 6f 66 20 64 61 74 61 2c 20   a lot of data, 
f7a0: 69 74 20 69 73 0a 20 20 6c 69 6b 65 6c 79 20 74  it is.  likely t
f7b0: 68 61 74 20 6d 61 6e 79 20 6f 66 20 74 68 65 20  hat many of the 
f7c0: 74 65 72 6d 73 20 69 6e 20 74 68 65 20 6e 65 77  terms in the new
f7d0: 20 72 65 63 6f 72 64 20 61 72 65 20 61 6c 72 65   record are alre
f7e0: 61 64 79 20 70 72 65 73 65 6e 74 20 69 6e 0a 20  ady present in. 
f7f0: 20 61 20 6c 61 72 67 65 20 6e 75 6d 62 65 72 20   a large number 
f800: 6f 66 20 65 78 69 73 74 69 6e 67 20 72 65 63 6f  of existing reco
f810: 72 64 73 2e 20 49 66 20 61 20 73 69 6e 67 6c 65  rds. If a single
f820: 20 62 2d 74 72 65 65 20 77 65 72 65 20 75 73 65   b-tree were use
f830: 64 2c 20 74 68 65 6e 0a 20 20 6c 61 72 67 65 20  d, then.  large 
f840: 64 6f 63 6c 69 73 74 20 73 74 72 75 63 74 75 72  doclist structur
f850: 65 73 20 77 6f 75 6c 64 20 68 61 76 65 20 74 6f  es would have to
f860: 20 62 65 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20   be loaded from 
f870: 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a 20 20  the database,.  
f880: 61 6d 65 6e 64 65 64 20 74 6f 20 69 6e 63 6c 75  amended to inclu
f890: 64 65 20 74 68 65 20 6e 65 77 20 64 6f 63 69 64  de the new docid
f8a0: 20 61 6e 64 20 74 65 72 6d 2d 6f 66 66 73 65 74   and term-offset
f8b0: 20 6c 69 73 74 2c 20 74 68 65 6e 20 77 72 69 74   list, then writ
f8c0: 74 65 6e 20 62 61 63 6b 0a 20 20 74 6f 20 74 68  ten back.  to th
f8d0: 65 20 64 61 74 61 62 61 73 65 2e 20 55 73 69 6e  e database. Usin
f8e0: 67 20 6d 75 6c 74 69 70 6c 65 20 62 2d 74 72 65  g multiple b-tre
f8f0: 65 20 74 61 62 6c 65 73 20 61 6c 6c 6f 77 73 20  e tables allows 
f900: 74 68 69 73 20 74 6f 20 62 65 20 61 76 6f 69 64  this to be avoid
f910: 65 64 0a 20 20 62 79 20 63 72 65 61 74 69 6e 67  ed.  by creating
f920: 20 61 20 6e 65 77 20 62 2d 74 72 65 65 20 77 68   a new b-tree wh
f930: 69 63 68 20 63 61 6e 20 62 65 20 6d 65 72 67 65  ich can be merge
f940: 64 20 77 69 74 68 20 74 68 65 20 65 78 69 73 74  d with the exist
f950: 69 6e 67 20 62 2d 74 72 65 65 0a 20 20 28 6f 72  ing b-tree.  (or
f960: 20 62 2d 74 72 65 65 73 29 20 6c 61 74 65 72 20   b-trees) later 
f970: 6f 6e 2e 20 4d 65 72 67 69 6e 67 20 6f 66 20 62  on. Merging of b
f980: 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 73  -tree structures
f990: 20 63 61 6e 20 62 65 20 70 65 72 66 6f 72 6d 65   can be performe
f9a0: 64 20 61 73 0a 20 20 61 20 62 61 63 6b 67 72 6f  d as.  a backgro
f9b0: 75 6e 64 20 74 61 73 6b 2c 20 6f 72 20 6f 6e 63  und task, or onc
f9c0: 65 20 61 20 63 65 72 74 61 69 6e 20 6e 75 6d 62  e a certain numb
f9d0: 65 72 20 6f 66 20 73 65 70 61 72 61 74 65 20 62  er of separate b
f9e0: 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 73  -tree structures
f9f0: 0a 20 20 68 61 76 65 20 62 65 65 6e 20 61 63 63  .  have been acc
fa00: 75 6d 75 6c 61 74 65 64 2e 20 4f 66 20 63 6f 75  umulated. Of cou
fa10: 72 73 65 2c 20 74 68 69 73 20 73 63 68 65 6d 65  rse, this scheme
fa20: 20 6d 61 6b 65 73 20 71 75 65 72 69 65 73 20 6d   makes queries m
fa30: 6f 72 65 20 65 78 70 65 6e 73 69 76 65 0a 20 20  ore expensive.  
fa40: 28 61 73 20 74 68 65 20 46 54 53 33 20 63 6f 64  (as the FTS3 cod
fa50: 65 20 6d 61 79 20 68 61 76 65 20 74 6f 20 6c 6f  e may have to lo
fa60: 6f 6b 20 75 70 20 69 6e 64 69 76 69 64 75 61 6c  ok up individual
fa70: 20 74 65 72 6d 73 20 69 6e 20 6d 6f 72 65 20 74   terms in more t
fa80: 68 61 6e 20 6f 6e 65 0a 20 20 62 2d 74 72 65 65  han one.  b-tree
fa90: 20 61 6e 64 20 6d 65 72 67 65 20 74 68 65 20 72   and merge the r
faa0: 65 73 75 6c 74 73 29 2c 20 62 75 74 20 69 74 20  esults), but it 
fab0: 68 61 73 20 62 65 65 6e 20 66 6f 75 6e 64 20 74  has been found t
fac0: 68 61 74 20 69 6e 20 70 72 61 63 74 69 63 65 20  hat in practice 
fad0: 74 68 69 73 0a 20 20 6f 76 65 72 68 65 61 64 20  this.  overhead 
fae0: 69 73 20 6f 66 74 65 6e 20 6e 65 67 6c 69 67 69  is often negligi
faf0: 62 6c 65 2e 0a 20 20 0a 5b 68 32 20 22 56 61 72  ble..  .[h2 "Var
fb00: 69 61 62 6c 65 20 4c 65 6e 67 74 68 20 49 6e 74  iable Length Int
fb10: 65 67 65 72 20 28 76 61 72 69 6e 74 29 20 46 6f  eger (varint) Fo
fb20: 72 6d 61 74 22 5d 0a 0a 3c 70 3e 0a 20 20 49 6e  rmat"]..<p>.  In
fb30: 74 65 67 65 72 20 76 61 6c 75 65 73 20 73 74 6f  teger values sto
fb40: 72 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 73  red as part of s
fb50: 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 20 6e 6f  egment b-tree no
fb60: 64 65 73 20 61 72 65 20 65 6e 63 6f 64 65 64 20  des are encoded 
fb70: 75 73 69 6e 67 20 74 68 65 0a 20 20 46 54 53 33  using the.  FTS3
fb80: 20 76 61 72 69 6e 74 20 66 6f 72 6d 61 74 2e 20   varint format. 
fb90: 54 68 69 73 20 65 6e 63 6f 64 69 6e 67 20 69 73  This encoding is
fba0: 20 73 69 6d 69 6c 61 72 2c 20 62 75 74 20 3c 62   similar, but <b
fbb0: 3e 6e 6f 74 20 69 64 65 6e 74 69 63 61 6c 3c 2f  >not identical</
fbc0: 62 3e 2c 20 74 6f 20 74 68 65 0a 20 20 74 68 65  b>, to the.  the
fbd0: 20 3c 61 20 68 72 65 66 3d 22 66 69 6c 65 66 6f   <a href="filefo
fbe0: 72 6d 61 74 2e 68 74 6d 6c 23 76 61 72 69 6e 74  rmat.html#varint
fbf0: 5f 66 6f 72 6d 61 74 22 3e 53 51 4c 69 74 65 20  _format">SQLite 
fc00: 76 61 72 69 6e 74 20 66 6f 72 6d 61 74 3c 2f 61  varint format</a
fc10: 3e 2e 0a 0a 3c 70 3e 0a 20 20 41 6e 20 65 6e 63  >...<p>.  An enc
fc20: 6f 64 65 64 20 46 54 53 33 20 76 61 72 69 6e 74  oded FTS3 varint
fc30: 20 63 6f 6e 73 75 6d 65 73 20 62 65 74 77 65 65   consumes betwee
fc40: 6e 20 6f 6e 65 20 61 6e 64 20 74 65 6e 20 62 79  n one and ten by
fc50: 74 65 73 20 6f 66 20 73 70 61 63 65 2e 20 54 68  tes of space. Th
fc60: 65 0a 20 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  e.  number of by
fc70: 74 65 73 20 72 65 71 75 69 72 65 64 20 69 73 20  tes required is 
fc80: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
fc90: 65 20 73 69 67 6e 20 61 6e 64 20 6d 61 67 6e 69  e sign and magni
fca0: 74 75 64 65 20 6f 66 20 74 68 65 0a 20 20 69 6e  tude of the.  in
fcb0: 74 65 67 65 72 20 76 61 6c 75 65 20 65 6e 63 6f  teger value enco
fcc0: 64 65 64 2e 20 4d 6f 72 65 20 61 63 63 75 72 61  ded. More accura
fcd0: 74 65 6c 79 2c 20 74 68 65 20 6e 75 6d 62 65 72  tely, the number
fce0: 20 6f 66 20 62 79 74 65 73 20 75 73 65 64 20 74   of bytes used t
fcf0: 6f 20 73 74 6f 72 65 0a 20 20 74 68 65 20 65 6e  o store.  the en
fd00: 63 6f 64 65 64 20 69 6e 74 65 67 65 72 20 64 65  coded integer de
fd10: 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 70 6f 73  pends on the pos
fd20: 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73  ition of the mos
fd30: 74 20 73 69 67 6e 69 66 69 63 61 6e 74 20 73 65  t significant se
fd40: 74 20 62 69 74 0a 20 20 69 6e 20 74 68 65 20 36  t bit.  in the 6
fd50: 34 2d 62 69 74 20 74 77 6f 73 2d 63 6f 6d 70 6c  4-bit twos-compl
fd60: 69 6d 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61  iment representa
fd70: 74 69 6f 6e 20 6f 66 20 74 68 65 20 69 6e 74 65  tion of the inte
fd80: 67 65 72 20 76 61 6c 75 65 2e 20 4e 65 67 61 74  ger value. Negat
fd90: 69 76 65 0a 20 20 76 61 6c 75 65 73 20 61 6c 77  ive.  values alw
fda0: 61 79 73 20 68 61 76 65 20 74 68 65 20 6d 6f 73  ays have the mos
fdb0: 74 20 73 69 67 6e 69 66 69 63 61 6e 74 20 62 69  t significant bi
fdc0: 74 20 73 65 74 20 28 74 68 65 20 73 69 67 6e 20  t set (the sign 
fdd0: 62 69 74 29 2c 20 61 6e 64 20 73 6f 20 61 72 65  bit), and so are
fde0: 0a 20 20 61 6c 77 61 79 73 20 73 74 6f 72 65 64  .  always stored
fdf0: 20 75 73 69 6e 67 20 74 68 65 20 66 75 6c 6c 20   using the full 
fe00: 74 65 6e 20 62 79 74 65 73 2e 20 50 6f 73 69 74  ten bytes. Posit
fe10: 69 76 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75  ive integer valu
fe20: 65 73 20 6d 61 79 20 62 65 0a 20 20 73 74 6f 72  es may be.  stor
fe30: 65 64 20 75 73 69 6e 67 20 6c 65 73 73 20 73 70  ed using less sp
fe40: 61 63 65 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20  ace...<p>.  The 
fe50: 66 69 6e 61 6c 20 62 79 74 65 20 6f 66 20 61 6e  final byte of an
fe60: 20 65 6e 63 6f 64 65 64 20 46 54 53 33 20 76 61   encoded FTS3 va
fe70: 72 69 6e 74 20 68 61 73 20 69 74 73 20 6d 6f 73  rint has its mos
fe80: 74 20 73 69 67 6e 69 66 69 63 61 6e 74 20 62 69  t significant bi
fe90: 74 20 0a 20 20 63 6c 65 61 72 65 64 2e 20 41 6c  t .  cleared. Al
fea0: 6c 20 70 72 65 63 65 64 69 6e 67 20 62 79 74 65  l preceding byte
feb0: 73 20 68 61 76 65 20 74 68 65 20 6d 6f 73 74 20  s have the most 
fec0: 73 69 67 6e 69 66 69 63 61 6e 74 20 62 69 74 20  significant bit 
fed0: 73 65 74 2e 20 44 61 74 61 0a 20 20 69 73 20 73  set. Data.  is s
fee0: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 72 65 6d  tored in the rem
fef0: 61 69 6e 69 6e 67 20 73 65 76 65 6e 20 6c 65 61  aining seven lea
ff00: 73 74 20 73 69 67 6e 66 69 63 61 6e 74 20 62 69  st signficant bi
ff10: 74 73 20 6f 66 20 65 61 63 68 20 62 79 74 65 2e  ts of each byte.
ff20: 0a 20 20 54 68 65 20 66 69 72 73 74 20 62 79 74  .  The first byt
ff30: 65 20 6f 66 20 74 68 65 20 65 6e 63 6f 64 65 64  e of the encoded
ff40: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
ff50: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 65 61  contains the lea
ff60: 73 74 20 73 69 67 6e 69 66 69 63 61 6e 74 0a 20  st significant. 
ff70: 20 73 65 76 65 6e 20 62 69 74 73 20 6f 66 20 74   seven bits of t
ff80: 68 65 20 65 6e 63 6f 64 65 64 20 69 6e 74 65 67  he encoded integ
ff90: 65 72 20 76 61 6c 75 65 2e 20 54 68 65 20 73 65  er value. The se
ffa0: 63 6f 6e 64 20 62 79 74 65 20 6f 66 20 74 68 65  cond byte of the
ffb0: 20 65 6e 63 6f 64 65 64 0a 20 20 72 65 70 72 65   encoded.  repre
ffc0: 73 65 6e 74 61 74 69 6f 6e 2c 20 69 66 20 69 74  sentation, if it
ffd0: 20 69 73 20 70 72 65 73 65 6e 74 2c 20 63 6f 6e   is present, con
ffe0: 74 61 69 6e 73 20 74 68 65 20 73 65 76 65 6e 20  tains the seven 
fff0: 6e 65 78 74 20 6c 65 61 73 74 20 73 69 67 6e 69  next least signi
10000 66 69 63 61 6e 74 0a 20 20 62 69 74 73 20 6f 66  ficant.  bits of
10010 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c   the integer val
10020 75 65 2c 20 61 6e 64 20 73 6f 20 6f 6e 2e 20 54  ue, and so on. T
10030 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62  he following tab
10040 6c 65 20 63 6f 6e 74 61 69 6e 73 20 65 78 61 6d  le contains exam
10050 70 6c 65 73 0a 20 20 6f 66 20 65 6e 63 6f 64 65  ples.  of encode
10060 64 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73  d integer values
10070 3a 0a 0a 5b 54 61 62 6c 65 5d 0a 20 20 5b 54 72  :..[Table].  [Tr
10080 5d 3c 74 68 3e 44 65 63 69 6d 61 6c 3c 74 68 3e  ]<th>Decimal<th>
10090 48 65 78 61 64 65 63 69 6d 61 6c 3c 74 68 20 77  Hexadecimal<th w
100a0 69 64 74 68 3d 31 30 30 25 3e 45 6e 63 6f 64 65  idth=100%>Encode
100b0 64 20 52 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  d Representation
100c0 0a 20 20 5b 54 72 5d 3c 74 64 3e 34 33 3c 74 64  .  [Tr]<td>43<td
100d0 3e 30 78 30 30 30 30 30 30 30 30 30 30 30 30 30  >0x0000000000000
100e0 30 32 42 3c 74 64 3e 30 78 32 42 20 0a 20 20 5b  02B<td>0x2B .  [
100f0 54 72 5d 3c 74 64 3e 32 30 30 38 31 35 3c 74 64  Tr]<td>200815<td
10100 3e 30 78 30 30 30 30 30 30 30 30 30 30 30 33 31  >0x0000000000031
10110 30 36 46 3c 74 64 3e 30 78 39 43 20 30 78 41 30  06F<td>0x9C 0xA0
10120 20 30 78 30 43 0a 20 20 5b 54 72 5d 3c 74 64 3e   0x0C.  [Tr]<td>
10130 2d 31 3c 74 64 3e 30 78 46 46 46 46 46 46 46 46  -1<td>0xFFFFFFFF
10140 46 46 46 46 46 46 46 46 3c 74 64 3e 30 78 46 46  FFFFFFFF<td>0xFF
10150 20 30 78 46 46 20 30 78 46 46 20 30 78 46 46 20   0xFF 0xFF 0xFF 
10160 30 78 46 46 20 30 78 46 46 20 30 78 46 46 20 30  0xFF 0xFF 0xFF 0
10170 78 46 46 20 30 78 46 46 20 30 78 30 31 0a 3c 2f  xFF 0xFF 0x01.</
10180 74 61 62 6c 65 3e 0a 20 20 0a 0a 5b 68 32 20 22  table>.  ..[h2 "
10190 53 65 67 6d 65 6e 74 20 42 2d 54 72 65 65 20 46  Segment B-Tree F
101a0 6f 72 6d 61 74 22 5d 0a 0a 3c 70 3e 0a 20 20 53  ormat"]..<p>.  S
101b0 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 73 20 61  egment b-trees a
101c0 72 65 20 70 72 65 66 69 78 2d 63 6f 6d 70 72 65  re prefix-compre
101d0 73 73 65 64 20 62 2b 2d 74 72 65 65 73 2e 20 54  ssed b+-trees. T
101e0 68 65 72 65 20 69 73 20 6f 6e 65 20 73 65 67 6d  here is one segm
101f0 65 6e 74 20 62 2d 74 72 65 65 0a 20 20 66 6f 72  ent b-tree.  for
10200 20 65 61 63 68 20 72 6f 77 20 69 6e 20 74 68 65   each row in the
10210 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65 20   %_segdir table 
10220 28 73 65 65 20 61 62 6f 76 65 29 2e 20 54 68 65  (see above). The
10230 20 72 6f 6f 74 20 6e 6f 64 65 20 6f 66 20 74 68   root node of th
10240 65 20 73 65 67 6d 65 6e 74 0a 20 20 62 2d 74 72  e segment.  b-tr
10250 65 65 20 69 73 20 73 74 6f 72 65 64 20 61 73 20  ee is stored as 
10260 61 20 62 6c 6f 62 20 69 6e 20 74 68 65 20 22 72  a blob in the "r
10270 6f 6f 74 22 20 66 69 65 6c 64 20 6f 66 20 74 68  oot" field of th
10280 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
10290 72 6f 77 0a 20 20 6f 66 20 74 68 65 20 25 5f 73  row.  of the %_s
102a0 65 67 64 69 72 20 74 61 62 6c 65 2e 20 41 6c 6c  egdir table. All
102b0 20 6f 74 68 65 72 20 6e 6f 64 65 73 20 28 69 66   other nodes (if
102c0 20 61 6e 79 20 65 78 69 73 74 29 20 61 72 65 20   any exist) are 
102d0 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 0a 20  stored in the . 
102e0 20 22 62 6c 6f 62 22 20 63 6f 6c 75 6d 6e 20 6f   "blob" column o
102f0 66 20 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73  f the %_segments
10300 20 74 61 62 6c 65 2e 20 4e 6f 64 65 73 20 77 69   table. Nodes wi
10310 74 68 69 6e 20 74 68 65 20 25 5f 73 65 67 6d 65  thin the %_segme
10320 6e 74 73 20 74 61 62 6c 65 20 61 72 65 0a 20 20  nts table are.  
10330 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68  identified by th
10340 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20  e integer value 
10350 69 6e 20 74 68 65 20 62 6c 6f 63 6b 69 64 20 66  in the blockid f
10360 69 65 6c 64 20 6f 66 20 74 68 65 20 63 6f 72 72  ield of the corr
10370 65 73 70 6f 6e 64 69 6e 67 0a 20 20 72 6f 77 2e  esponding.  row.
10380 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
10390 61 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 74  able describes t
103a0 68 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  he fields of the
103b0 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65 3a   %_segdir table:
103c0 0a 0a 5b 54 61 62 6c 65 5d 0a 20 20 5b 54 72 5d  ..[Table].  [Tr]
103d0 3c 74 68 3e 43 6f 6c 75 6d 6e 20 20 20 20 20 20  <th>Column      
103e0 20 20 20 20 20 3c 74 68 20 77 69 64 74 68 3d 31       <th width=1
103f0 30 30 25 3e 49 6e 74 65 72 70 72 65 74 69 6f 6e  00%>Interpretion
10400 0a 20 20 5b 54 72 5d 3c 74 64 3e 6c 65 76 65 6c  .  [Tr]<td>level
10410 20 20 20 20 20 20 20 20 20 20 20 20 3c 74 64 3e              <td>
10420 20 0a 20 20 20 20 42 65 74 77 65 65 6e 20 74 68   .    Between th
10430 65 6d 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  em, the contents
10440 20 6f 66 20 74 68 65 20 22 6c 65 76 65 6c 22 20   of the "level" 
10450 61 6e 64 20 22 69 64 78 22 20 66 69 65 6c 64 73  and "idx" fields
10460 20 64 65 66 69 6e 65 20 74 68 65 0a 20 20 20 20   define the.    
10470 72 65 6c 61 74 69 76 65 20 61 67 65 20 6f 66 20  relative age of 
10480 74 68 65 20 73 65 67 6d 65 6e 74 20 62 2d 74 72  the segment b-tr
10490 65 65 2e 20 54 68 65 20 73 6d 61 6c 6c 65 72 20  ee. The smaller 
104a0 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64  the value stored
104b0 20 69 6e 20 74 68 65 0a 20 20 20 20 22 6c 65 76   in the.    "lev
104c0 65 6c 22 20 66 69 65 6c 64 2c 20 74 68 65 20 6d  el" field, the m
104d0 6f 72 65 20 72 65 63 65 6e 74 6c 79 20 74 68 65  ore recently the
104e0 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 20   segment b-tree 
104f0 77 61 73 20 63 72 65 61 74 65 64 2e 20 49 66 20  was created. If 
10500 74 77 6f 0a 20 20 20 20 73 65 67 6d 65 6e 74 20  two.    segment 
10510 62 2d 74 72 65 65 73 20 61 72 65 20 6f 66 20 74  b-trees are of t
10520 68 65 20 73 61 6d 65 20 22 6c 65 76 65 6c 22 2c  he same "level",
10530 20 74 68 65 20 73 65 67 6d 65 6e 74 20 77 69 74   the segment wit
10540 68 20 74 68 65 20 6c 61 72 67 65 72 0a 20 20 20  h the larger.   
10550 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
10560 20 74 68 65 20 22 69 64 78 22 20 63 6f 6c 75 6d   the "idx" colum
10570 6e 20 69 73 20 6d 6f 72 65 20 72 65 63 65 6e 74  n is more recent
10580 2e 20 54 68 65 20 50 52 49 4d 41 52 59 20 4b 45  . The PRIMARY KE
10590 59 20 63 6f 6e 73 74 72 61 69 6e 74 0a 20 20 20  Y constraint.   
105a0 20 6f 6e 20 74 68 65 20 25 5f 73 65 67 64 69 72   on the %_segdir
105b0 20 74 61 62 6c 65 20 70 72 65 76 65 6e 74 73 20   table prevents 
105c0 61 6e 79 20 74 77 6f 20 73 65 67 6d 65 6e 74 73  any two segments
105d0 20 66 72 6f 6d 20 68 61 76 69 6e 67 20 74 68 65   from having the
105e0 20 73 61 6d 65 20 76 61 6c 75 65 0a 20 20 20 20   same value.    
105f0 66 6f 72 20 62 6f 74 68 20 74 68 65 20 22 6c 65  for both the "le
10600 76 65 6c 22 20 61 6e 64 20 22 69 64 78 22 20 66  vel" and "idx" f
10610 69 65 6c 64 73 2e 0a 20 20 5b 54 72 5d 3c 74 64  ields..  [Tr]<td
10620 3e 69 64 78 20 20 20 20 20 20 20 20 20 20 20 20  >idx            
10630 20 20 3c 74 64 3e 20 53 65 65 20 61 62 6f 76 65    <td> See above
10640 2e 0a 20 20 5b 54 72 5d 3c 74 64 3e 73 74 61 72  ..  [Tr]<td>star
10650 74 5f 62 6c 6f 63 6b 20 20 20 20 20 20 3c 74 64  t_block      <td
10660 3e 0a 20 20 20 20 54 68 65 20 62 6c 6f 63 6b 69  >.    The blocki
10670 64 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e  d that correspon
10680 64 73 20 74 6f 20 74 68 65 20 6e 6f 64 65 20 77  ds to the node w
10690 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74  ith the smallest
106a0 20 62 6c 6f 63 6b 69 64 20 74 68 61 74 20 0a 20   blockid that . 
106b0 20 20 20 62 65 6c 6f 6e 67 73 20 74 6f 20 74 68     belongs to th
106c0 69 73 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65  is segment b-tre
106d0 65 2e 20 4f 72 20 7a 65 72 6f 20 69 66 20 74 68  e. Or zero if th
106e0 65 20 65 6e 74 69 72 65 20 73 65 67 6d 65 6e 74  e entire segment
106f0 20 62 2d 74 72 65 65 0a 20 20 20 20 66 69 74 73   b-tree.    fits
10700 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64   on the root nod
10710 65 2e 20 49 66 20 69 74 20 65 78 69 73 74 73 2c  e. If it exists,
10720 20 74 68 69 73 20 6e 6f 64 65 20 69 73 20 61 6c   this node is al
10730 77 61 79 73 20 61 20 6c 65 61 66 20 6e 6f 64 65  ways a leaf node
10740 2e 0a 20 20 5b 54 72 5d 3c 74 64 3e 6c 65 61 76  ..  [Tr]<td>leav
10750 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 20 3c 74 64  es_end_block <td
10760 3e 0a 20 20 20 20 54 68 65 20 62 6c 6f 63 6b 69  >.    The blocki
10770 64 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e  d that correspon
10780 64 73 20 74 6f 20 74 68 65 20 6c 65 61 66 20 6e  ds to the leaf n
10790 6f 64 65 20 77 69 74 68 20 74 68 65 20 6c 61 72  ode with the lar
107a0 67 65 73 74 20 62 6c 6f 63 6b 69 64 20 0a 20 20  gest blockid .  
107b0 20 20 74 68 61 74 20 62 65 6c 6f 6e 67 73 20 74    that belongs t
107c0 6f 20 74 68 69 73 20 73 65 67 6d 65 6e 74 20 62  o this segment b
107d0 2d 74 72 65 65 2e 20 4f 72 20 7a 65 72 6f 20 69  -tree. Or zero i
107e0 66 20 74 68 65 20 65 6e 74 69 72 65 20 73 65 67  f the entire seg
107f0 6d 65 6e 74 20 62 2d 74 72 65 65 0a 20 20 20 20  ment b-tree.    
10800 66 69 74 73 20 6f 6e 20 74 68 65 20 72 6f 6f 74  fits on the root
10810 20 6e 6f 64 65 2e 0a 20 20 5b 54 72 5d 3c 74 64   node..  [Tr]<td
10820 3e 65 6e 64 5f 62 6c 6f 63 6b 20 3c 74 64 3e 0a  >end_block <td>.
10830 20 20 20 20 54 68 65 20 62 6c 6f 63 6b 69 64 20      The blockid 
10840 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  that corresponds
10850 20 74 6f 20 74 68 65 20 69 6e 74 65 72 69 6f 72   to the interior
10860 20 6e 6f 64 65 20 77 69 74 68 20 74 68 65 20 6c   node with the l
10870 61 72 67 65 73 74 20 0a 20 20 20 20 62 6c 6f 63  argest .    bloc
10880 6b 69 64 20 74 68 61 74 20 62 65 6c 6f 6e 67 73  kid that belongs
10890 20 74 6f 20 74 68 69 73 20 73 65 67 6d 65 6e 74   to this segment
108a0 20 62 2d 74 72 65 65 2e 20 20 4f 72 20 7a 65 72   b-tree.  Or zer
108b0 6f 20 69 66 20 74 68 65 20 65 6e 74 69 72 65 20  o if the entire 
108c0 73 65 67 6d 65 6e 74 0a 20 20 20 20 62 2d 74 72  segment.    b-tr
108d0 65 65 20 66 69 74 73 20 6f 6e 20 74 68 65 20 72  ee fits on the r
108e0 6f 6f 74 20 6e 6f 64 65 2e 20 49 66 20 69 74 20  oot node. If it 
108f0 65 78 69 73 74 73 2c 20 74 68 69 73 20 6e 6f 64  exists, this nod
10900 65 20 69 73 20 61 6c 77 61 79 73 20 61 6e 0a 20  e is always an. 
10910 20 20 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65     interior node
10920 2e 0a 20 20 5b 54 72 5d 3c 74 64 3e 72 6f 6f 74  ..  [Tr]<td>root
10930 20 20 20 20 20 20 20 20 20 20 20 20 20 3c 74 64               <td
10940 3e 0a 20 20 20 20 42 6c 6f 62 20 63 6f 6e 74 61  >.    Blob conta
10950 69 6e 69 6e 67 20 74 68 65 20 72 6f 6f 74 20 6e  ining the root n
10960 6f 64 65 20 6f 66 20 74 68 65 20 73 65 67 6d 65  ode of the segme
10970 6e 74 20 62 2d 74 72 65 65 2e 0a 3c 2f 74 61 62  nt b-tree..</tab
10980 6c 65 3e 0a 0a 3c 70 3e 0a 20 20 41 70 61 72 74  le>..<p>.  Apart
10990 20 66 72 6f 6d 20 74 68 65 20 72 6f 6f 74 20 6e   from the root n
109a0 6f 64 65 2c 20 74 68 65 20 6e 6f 64 65 73 20 74  ode, the nodes t
109b0 68 61 74 20 6d 61 6b 65 20 75 70 20 61 20 73 69  hat make up a si
109c0 6e 67 6c 65 20 73 65 67 6d 65 6e 74 20 62 2d 74  ngle segment b-t
109d0 72 65 65 20 61 72 65 0a 20 20 61 6c 77 61 79 73  ree are.  always
109e0 20 73 74 6f 72 65 64 20 75 73 69 6e 67 20 61 20   stored using a 
109f0 63 6f 6e 74 69 67 75 6f 75 73 20 73 65 71 75 65  contiguous seque
10a00 6e 63 65 20 6f 66 20 62 6c 6f 63 6b 69 64 73 2e  nce of blockids.
10a10 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 74 68   Furthermore, th
10a20 65 0a 20 20 6e 6f 64 65 73 20 74 68 61 74 20 6d  e.  nodes that m
10a30 61 6b 65 20 75 70 20 61 20 73 69 6e 67 6c 65 20  ake up a single 
10a40 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 62 2d 74  level of the b-t
10a50 72 65 65 20 61 72 65 20 74 68 65 6d 73 65 6c 76  ree are themselv
10a60 65 73 20 73 74 6f 72 65 64 20 61 73 0a 20 20 61  es stored as.  a
10a70 20 63 6f 6e 74 69 67 75 6f 75 73 20 62 6c 6f 63   contiguous bloc
10a80 6b 2c 20 69 6e 20 62 2d 74 72 65 65 20 6f 72 64  k, in b-tree ord
10a90 65 72 2e 20 54 68 65 20 63 6f 6e 74 69 67 75 6f  er. The contiguo
10aa0 75 73 20 73 65 71 75 65 6e 63 65 20 6f 66 20 62  us sequence of b
10ab0 6c 6f 63 6b 69 64 73 0a 20 20 75 73 65 64 20 74  lockids.  used t
10ac0 6f 20 73 74 6f 72 65 20 74 68 65 20 62 2d 74 72  o store the b-tr
10ad0 65 65 20 6c 65 61 76 65 73 20 61 72 65 20 61 6c  ee leaves are al
10ae0 6c 6f 63 61 74 65 64 20 73 74 61 72 74 69 6e 67  located starting
10af0 20 77 69 74 68 20 74 68 65 20 62 6c 6f 63 6b 69   with the blocki
10b00 64 0a 20 20 76 61 6c 75 65 20 73 74 6f 72 65 64  d.  value stored
10b10 20 69 6e 20 74 68 65 20 22 73 74 61 72 74 5f 62   in the "start_b
10b20 6c 6f 63 6b 22 20 63 6f 6c 75 6d 6e 20 6f 66 20  lock" column of 
10b30 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
10b40 67 20 25 5f 73 65 67 64 69 72 20 72 6f 77 2c 0a  g %_segdir row,.
10b50 20 20 61 6e 64 20 66 69 6e 69 73 68 69 6e 67 20    and finishing 
10b60 61 74 20 74 68 65 20 62 6c 6f 63 6b 69 64 20 76  at the blockid v
10b70 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 74  alue stored in t
10b80 68 65 20 22 6c 65 61 76 65 73 5f 65 6e 64 5f 62  he "leaves_end_b
10b90 6c 6f 63 6b 22 0a 20 20 66 69 65 6c 64 20 6f 66  lock".  field of
10ba0 20 74 68 65 20 73 61 6d 65 20 72 6f 77 2e 20 49   the same row. I
10bb0 74 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 70  t is therefore p
10bc0 6f 73 73 69 62 6c 65 20 74 6f 20 69 74 65 72 61  ossible to itera
10bd0 74 65 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 74  te through all t
10be0 68 65 0a 20 20 6c 65 61 76 65 73 20 6f 66 20 61  he.  leaves of a
10bf0 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 2c   segment b-tree,
10c00 20 69 6e 20 6b 65 79 20 6f 72 64 65 72 2c 20 62   in key order, b
10c10 79 20 74 72 61 76 65 72 73 69 6e 67 20 74 68 65  y traversing the
10c20 20 25 5f 73 65 67 6d 65 6e 74 73 20 0a 20 20 74   %_segments .  t
10c30 61 62 6c 65 20 69 6e 20 62 6c 6f 63 6b 69 64 20  able in blockid 
10c40 6f 72 64 65 72 20 66 72 6f 6d 20 22 73 74 61 72  order from "star
10c50 74 5f 62 6c 6f 63 6b 22 20 74 6f 20 22 6c 65 61  t_block" to "lea
10c60 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 22 2e 20  ves_end_block". 
10c70 20 0a 0a 5b 68 33 20 22 53 65 67 6d 65 6e 74 20   ..[h3 "Segment 
10c80 42 2d 54 72 65 65 20 4c 65 61 66 20 4e 6f 64 65  B-Tree Leaf Node
10c90 73 22 5d 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 66  s"]..<p>.  The f
10ca0 6f 6c 6c 6f 77 69 6e 67 20 64 69 61 67 72 61 6d  ollowing diagram
10cb0 20 64 65 70 69 63 74 73 20 74 68 65 20 66 6f 72   depicts the for
10cc0 6d 61 74 20 6f 66 20 61 20 73 65 67 6d 65 6e 74  mat of a segment
10cd0 20 62 2d 74 72 65 65 20 6c 65 61 66 20 6e 6f 64   b-tree leaf nod
10ce0 65 2e 0a 0a 5b 46 69 67 20 66 74 73 33 5f 6c 65  e...[Fig fts3_le
10cf0 61 66 5f 6e 6f 64 65 2e 70 6e 67 20 22 53 65 67  af_node.png "Seg
10d00 6d 65 6e 74 20 42 2d 54 72 65 65 20 4c 65 61 66  ment B-Tree Leaf
10d10 20 4e 6f 64 65 20 46 6f 72 6d 61 74 22 5d 0a 0a   Node Format"]..
10d20 3c 70 3e 0a 20 20 54 68 65 20 66 69 72 73 74 20  <p>.  The first 
10d30 74 65 72 6d 20 73 74 6f 72 65 64 20 6f 6e 20 65  term stored on e
10d40 61 63 68 20 6e 6f 64 65 20 28 22 54 65 72 6d 20  ach node ("Term 
10d50 31 22 20 69 6e 20 74 68 65 20 66 69 67 75 72 65  1" in the figure
10d60 20 61 62 6f 76 65 29 20 69 73 0a 20 20 73 74 6f   above) is.  sto
10d70 72 65 64 20 76 65 72 62 61 74 69 6d 2e 20 45 61  red verbatim. Ea
10d80 63 68 20 73 75 62 73 65 71 75 65 6e 74 20 74 65  ch subsequent te
10d90 72 6d 20 69 73 20 70 72 65 66 69 78 2d 63 6f 6d  rm is prefix-com
10da0 70 72 65 73 73 65 64 20 77 69 74 68 20 72 65 73  pressed with res
10db0 70 65 63 74 0a 20 20 74 6f 20 69 74 73 20 70 72  pect.  to its pr
10dc0 65 64 65 63 65 73 73 6f 72 2e 20 54 65 72 6d 73  edecessor. Terms
10dd0 20 61 72 65 20 73 74 6f 72 65 64 20 77 69 74 68   are stored with
10de0 69 6e 20 61 20 70 61 67 65 20 69 6e 20 73 6f 72  in a page in sor
10df0 74 65 64 20 28 6d 65 6d 63 6d 70 29 0a 20 20 6f  ted (memcmp).  o
10e00 72 64 65 72 2e 0a 0a 5b 68 33 20 22 53 65 67 6d  rder...[h3 "Segm
10e10 65 6e 74 20 42 2d 54 72 65 65 20 49 6e 74 65 72  ent B-Tree Inter
10e20 69 6f 72 20 4e 6f 64 65 73 22 5d 0a 0a 3c 70 3e  ior Nodes"]..<p>
10e30 0a 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
10e40 20 64 69 61 67 72 61 6d 20 64 65 70 69 63 74 73   diagram depicts
10e50 20 74 68 65 20 66 6f 72 6d 61 74 20 6f 66 20 61   the format of a
10e60 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 20   segment b-tree 
10e70 69 6e 74 65 72 69 6f 72 20 0a 20 20 28 6e 6f 6e  interior .  (non
10e80 2d 6c 65 61 66 29 20 6e 6f 64 65 2e 0a 0a 5b 46  -leaf) node...[F
10e90 69 67 20 66 74 73 33 5f 69 6e 74 65 72 69 6f 72  ig fts3_interior
10ea0 5f 6e 6f 64 65 2e 70 6e 67 20 22 53 65 67 6d 65  _node.png "Segme
10eb0 6e 74 20 42 2d 54 72 65 65 20 49 6e 74 65 72 69  nt B-Tree Interi
10ec0 6f 72 20 4e 6f 64 65 20 46 6f 72 6d 61 74 22 5d  or Node Format"]
10ed0 0a 0a 0a 5b 68 32 20 22 44 6f 63 6c 69 73 74 20  ...[h2 "Doclist 
10ee0 46 6f 72 6d 61 74 22 5d 0a 0a 3c 70 3e 0a 20 20  Format"]..<p>.  
10ef0 41 20 64 6f 63 6c 69 73 74 20 63 6f 6e 73 69 73  A doclist consis
10f00 74 73 20 6f 66 20 61 6e 20 61 72 72 61 79 20 6f  ts of an array o
10f10 66 20 36 34 2d 62 69 74 20 73 69 67 6e 65 64 20  f 64-bit signed 
10f20 69 6e 74 65 67 65 72 73 2c 20 73 65 72 69 61 6c  integers, serial
10f30 69 7a 65 64 20 75 73 69 6e 67 0a 20 20 74 68 65  ized using.  the
10f40 20 46 54 53 33 20 76 61 72 69 6e 74 20 66 6f 72   FTS3 varint for
10f50 6d 61 74 2e 20 45 61 63 68 20 64 6f 63 6c 69 73  mat. Each doclis
10f60 74 20 65 6e 74 72 79 20 69 73 20 6d 61 64 65 20  t entry is made 
10f70 75 70 20 6f 66 20 61 20 73 65 72 69 65 73 20 6f  up of a series o
10f80 66 20 74 77 6f 20 0a 20 20 6f 72 20 6d 6f 72 65  f two .  or more
10f90 20 69 6e 74 65 67 65 72 73 2c 20 61 73 20 66 6f   integers, as fo
10fa0 6c 6c 6f 77 73 3a 0a 0a 3c 6f 6c 3e 0a 20 20 3c  llows:..<ol>.  <
10fb0 6c 69 3e 20 54 68 65 20 64 6f 63 69 64 20 76 61  li> The docid va
10fc0 6c 75 65 2e 20 54 68 65 20 66 69 72 73 74 20 65  lue. The first e
10fd0 6e 74 72 79 20 69 6e 20 61 20 64 6f 63 6c 69 73  ntry in a doclis
10fe0 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c  t contains the l
10ff0 69 74 65 72 61 6c 20 64 6f 63 69 64 0a 20 20 20  iteral docid.   
11000 20 20 20 20 76 61 6c 75 65 2e 20 54 68 65 20 66      value. The f
11010 69 72 73 74 20 66 69 65 6c 64 20 6f 66 20 65 61  irst field of ea
11020 63 68 20 73 75 62 73 65 71 75 65 6e 74 20 64 6f  ch subsequent do
11030 63 6c 69 73 74 20 65 6e 74 72 79 20 63 6f 6e 74  clist entry cont
11040 61 69 6e 73 20 74 68 65 20 0a 20 20 20 20 20 20  ains the .      
11050 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
11060 65 65 6e 20 74 68 65 20 6e 65 77 20 64 6f 63 69  een the new doci
11070 64 20 61 6e 64 20 74 68 65 20 70 72 65 76 69 6f  d and the previo
11080 75 73 20 6f 6e 65 20 28 61 6c 77 61 79 73 20 61  us one (always a
11090 20 70 6f 73 69 74 69 76 65 20 0a 20 20 20 20 20   positive .     
110a0 20 20 6e 75 6d 62 65 72 29 2e 0a 20 20 3c 6c 69    number)..  <li
110b0 3e 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 74  > Zero or more t
110c0 65 72 6d 2d 6f 66 66 73 65 74 20 6c 69 73 74 73  erm-offset lists
110d0 2e 20 41 20 74 65 72 6d 2d 6f 66 66 73 65 74 20  . A term-offset 
110e0 6c 69 73 74 20 69 73 20 70 72 65 73 65 6e 74 20  list is present 
110f0 66 6f 72 20 65 61 63 68 0a 20 20 20 20 20 20 20  for each.       
11100 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 46 54  column of the FT
11110 53 33 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  S3 virtual table
11120 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
11130 68 65 20 74 65 72 6d 2e 20 41 20 74 65 72 6d 2d  he term. A term-
11140 6f 66 66 73 65 74 0a 20 20 20 20 20 20 20 6c 69  offset.       li
11150 73 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74  st consists of t
11160 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20  he following:.  
11170 20 20 20 3c 6f 6c 3e 0a 20 20 20 20 20 20 20 3c     <ol>.       <
11180 6c 69 3e 20 43 6f 6e 73 74 61 6e 74 20 76 61 6c  li> Constant val
11190 75 65 20 31 2e 20 54 68 69 73 20 66 69 65 6c 64  ue 1. This field
111a0 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f 72 20   is omitted for 
111b0 61 6e 79 20 74 65 72 6d 2d 6f 66 66 73 65 74 20  any term-offset 
111c0 6c 69 73 74 0a 20 20 20 20 20 20 20 20 20 20 20  list.           
111d0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
111e0 20 63 6f 6c 75 6d 6e 20 30 2e 0a 20 20 20 20 20   column 0..     
111f0 20 20 3c 6c 69 3e 20 54 68 65 20 63 6f 6c 75 6d    <li> The colum
11200 6e 20 6e 75 6d 62 65 72 20 28 31 20 66 6f 72 20  n number (1 for 
11210 74 68 65 20 73 65 63 6f 6e 64 20 6c 65 66 74 6d  the second leftm
11220 6f 73 74 20 63 6f 6c 75 6d 6e 2c 20 65 74 63 2e  ost column, etc.
11230 29 2e 20 54 68 69 73 0a 20 20 20 20 20 20 20 20  ). This.        
11240 20 20 20 20 66 69 65 6c 64 20 69 73 20 6f 6d 69      field is omi
11250 74 74 65 64 20 66 6f 72 20 61 6e 79 20 74 65 72  tted for any ter
11260 6d 2d 6f 66 66 73 65 74 20 6c 69 73 74 20 61 73  m-offset list as
11270 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 6f  sociated with co
11280 6c 75 6d 6e 20 30 2e 0a 20 20 20 20 20 20 20 3c  lumn 0..       <
11290 6c 69 3e 20 41 20 6c 69 73 74 20 6f 66 20 74 65  li> A list of te
112a0 72 6d 2d 6f 66 66 73 65 74 73 2c 20 73 6f 72 74  rm-offsets, sort
112b0 65 64 20 66 72 6f 6d 20 73 6d 61 6c 6c 65 73 74  ed from smallest
112c0 20 74 6f 20 6c 61 72 67 65 73 74 2e 20 49 6e 73   to largest. Ins
112d0 74 65 61 64 0a 20 20 20 20 20 20 20 20 20 20 20  tead.           
112e0 20 6f 66 20 73 74 6f 72 69 6e 67 20 74 68 65 20   of storing the 
112f0 74 65 72 6d 2d 6f 66 66 73 65 74 20 76 61 6c 75  term-offset valu
11300 65 20 6c 69 74 65 72 61 6c 6c 79 2c 20 65 61 63  e literally, eac
11310 68 20 69 6e 74 65 67 65 72 20 73 74 6f 72 65 64  h integer stored
11320 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 73   .            is
11330 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   the difference 
11340 62 65 74 77 65 65 6e 20 74 68 65 20 63 75 72 72  between the curr
11350 65 6e 74 20 74 65 72 6d 2d 6f 66 66 73 65 74 20  ent term-offset 
11360 61 6e 64 20 74 68 65 20 70 72 65 76 69 6f 75 73  and the previous
11370 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 6e   .            on
11380 65 20 28 6f 72 20 7a 65 72 6f 20 69 66 20 74 68  e (or zero if th
11390 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 2d 6f  e current term-o
113a0 66 66 73 65 74 20 69 73 20 74 68 65 20 66 69 72  ffset is the fir
113b0 73 74 29 2c 20 70 6c 75 73 20 32 2e 0a 20 20 20  st), plus 2..   
113c0 20 20 3c 2f 6f 6c 3e 0a 20 20 3c 6c 69 3e 20 43    </ol>.  <li> C
113d0 6f 6e 73 74 61 6e 74 20 76 61 6c 75 65 20 30 2e  onstant value 0.
113e0 0a 3c 2f 6f 6c 3e 0a 0a 5b 46 69 67 20 66 74 73  .</ol>..[Fig fts
113f0 33 5f 64 6f 63 6c 69 73 74 32 2e 70 6e 67 20 22  3_doclist2.png "
11400 46 54 53 33 20 44 6f 63 6c 69 73 74 20 46 6f 72  FTS3 Doclist For
11410 6d 61 74 22 5d 0a 0a 5b 46 69 67 20 66 74 73 33  mat"]..[Fig fts3
11420 5f 64 6f 63 6c 69 73 74 2e 70 6e 67 20 22 46 54  _doclist.png "FT
11430 53 33 20 44 6f 63 6c 69 73 74 20 45 6e 74 72 79  S3 Doclist Entry
11440 20 46 6f 72 6d 61 74 22 5d 0a 0a 3c 70 3e 0a 20   Format"]..<p>. 
11450 20 46 6f 72 20 64 6f 63 6c 69 73 74 73 20 66 6f   For doclists fo
11460 72 20 77 68 69 63 68 20 74 68 65 20 74 65 72 6d  r which the term
11470 20 61 70 70 65 61 72 73 20 69 6e 20 6d 6f 72 65   appears in more
11480 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e   than one column
11490 20 6f 66 20 74 68 65 20 46 54 53 33 0a 20 20 76   of the FTS3.  v
114a0 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 74 65  irtual table, te
114b0 72 6d 2d 6f 66 66 73 65 74 20 6c 69 73 74 73 20  rm-offset lists 
114c0 77 69 74 68 69 6e 20 74 68 65 20 64 6f 63 6c 69  within the docli
114d0 73 74 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e  st are stored in
114e0 20 63 6f 6c 75 6d 6e 20 0a 20 20 6e 75 6d 62 65   column .  numbe
114f0 72 20 6f 72 64 65 72 2e 20 54 68 69 73 20 65 6e  r order. This en
11500 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20 74  sures that the t
11510 65 72 6d 2d 6f 66 66 73 65 74 20 6c 69 73 74 20  erm-offset list 
11520 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
11530 0a 20 20 63 6f 6c 75 6d 6e 20 30 20 28 69 66 20  .  column 0 (if 
11540 61 6e 79 29 20 69 73 20 61 6c 77 61 79 73 20 66  any) is always f
11550 69 72 73 74 2c 20 61 6c 6c 6f 77 69 6e 67 20 74  irst, allowing t
11560 68 65 20 66 69 72 73 74 20 74 77 6f 20 66 69 65  he first two fie
11570 6c 64 73 20 6f 66 20 74 68 65 0a 20 20 74 65 72  lds of the.  ter
11580 6d 2d 6f 66 66 73 65 74 20 6c 69 73 74 20 74 6f  m-offset list to
11590 20 62 65 20 6f 6d 69 74 74 65 64 20 69 6e 20 74   be omitted in t
115a0 68 69 73 20 63 61 73 65 2e 0a 0a 5b 68 31 20 22  his case...[h1 "
115b0 41 70 70 65 6e 64 69 78 20 41 3a 20 53 65 61 72  Appendix A: Sear
115c0 63 68 20 41 70 70 6c 69 63 61 74 69 6f 6e 20 54  ch Application T
115d0 69 70 73 22 20 7b 7d 20 22 73 65 61 72 63 68 20  ips" {} "search 
115e0 61 70 70 6c 69 63 61 74 69 6f 6e 20 74 69 70 73  application tips
115f0 22 5d 0a 0a 3c 70 3e 0a 20 20 46 54 53 33 20 69  "]..<p>.  FTS3 i
11600 73 20 70 72 69 6d 61 72 69 6c 79 20 64 65 73 69  s primarily desi
11610 67 6e 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20  gned to support 
11620 42 6f 6f 6c 65 61 6e 20 66 75 6c 6c 2d 74 65 78  Boolean full-tex
11630 74 20 71 75 65 72 69 65 73 20 2d 20 71 75 65 72  t queries - quer
11640 69 65 73 0a 20 20 74 6f 20 66 69 6e 64 20 74 68  ies.  to find th
11650 65 20 73 65 74 20 6f 66 20 64 6f 63 75 6d 65 6e  e set of documen
11660 74 73 20 74 68 61 74 20 6d 61 74 63 68 20 61 20  ts that match a 
11670 73 70 65 63 69 66 69 65 64 20 63 72 69 74 65 72  specified criter
11680 69 61 2e 20 48 6f 77 65 76 65 72 2c 20 6d 61 6e  ia. However, man
11690 79 20 0a 20 20 28 6d 6f 73 74 3f 29 20 73 65 61  y .  (most?) sea
116a0 72 63 68 20 61 70 70 6c 69 63 61 74 69 6f 6e 73  rch applications
116b0 20 72 65 71 75 69 72 65 20 74 68 61 74 20 72 65   require that re
116c0 73 75 6c 74 73 20 61 72 65 20 73 6f 6d 65 68 6f  sults are someho
116d0 77 20 72 61 6e 6b 65 64 20 69 6e 20 6f 72 64 65  w ranked in orde
116e0 72 0a 20 20 6f 66 20 22 72 65 6c 65 76 61 6e 63  r.  of "relevanc
116f0 65 22 2c 20 77 68 65 72 65 20 22 72 65 6c 65 76  e", where "relev
11700 61 6e 63 65 22 20 69 73 20 64 65 66 69 6e 65 64  ance" is defined
11710 20 61 73 20 74 68 65 20 6c 69 6b 65 6c 69 68 6f   as the likeliho
11720 6f 64 20 74 68 61 74 20 74 68 65 20 75 73 65 72  od that the user
11730 0a 20 20 77 68 6f 20 70 65 72 66 6f 72 6d 65 64  .  who performed
11740 20 74 68 65 20 73 65 61 72 63 68 20 69 73 20 69   the search is i
11750 6e 74 65 72 65 73 74 65 64 20 69 6e 20 61 20 73  nterested in a s
11760 70 65 63 69 66 69 63 20 65 6c 65 6d 65 6e 74 20  pecific element 
11770 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 0a  of the returned.
11780 20 20 73 65 74 20 6f 66 20 64 6f 63 75 6d 65 6e    set of documen
11790 74 73 2e 20 57 68 65 6e 20 75 73 69 6e 67 20 61  ts. When using a
117a0 20 73 65 61 72 63 68 20 65 6e 67 69 6e 65 20 74   search engine t
117b0 6f 20 66 69 6e 64 20 64 6f 63 75 6d 65 6e 74 73  o find documents
117c0 20 6f 6e 20 74 68 65 20 77 6f 72 6c 64 0a 20 20   on the world.  
117d0 77 69 64 65 20 77 65 62 2c 20 74 68 65 20 75 73  wide web, the us
117e0 65 72 20 65 78 70 65 63 74 73 20 74 68 61 74 20  er expects that 
117f0 74 68 65 20 6d 6f 73 74 20 75 73 65 66 75 6c 2c  the most useful,
11800 20 6f 72 20 22 72 65 6c 65 76 61 6e 74 22 2c 20   or "relevant", 
11810 64 6f 63 75 6d 65 6e 74 73 20 0a 20 20 77 69 6c  documents .  wil
11820 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 61 73  l be returned as
11830 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
11840 6f 66 20 72 65 73 75 6c 74 73 2c 20 61 6e 64 20  of results, and 
11850 74 68 61 74 20 65 61 63 68 20 73 75 62 73 65 71  that each subseq
11860 75 65 6e 74 20 70 61 67 65 20 0a 20 20 63 6f 6e  uent page .  con
11870 74 61 69 6e 73 20 70 72 6f 67 72 65 73 73 69 76  tains progressiv
11880 65 6c 79 20 6c 65 73 73 20 72 65 6c 65 76 61 6e  ely less relevan
11890 74 20 72 65 73 75 6c 74 73 2e 20 45 78 61 63 74  t results. Exact
118a0 6c 79 20 68 6f 77 20 61 20 6d 61 63 68 69 6e 65  ly how a machine
118b0 20 63 61 6e 20 0a 20 20 64 65 74 65 72 6d 69 6e   can .  determin
118c0 65 20 64 6f 63 75 6d 65 6e 74 20 72 65 6c 65 76  e document relev
118d0 61 6e 63 65 20 62 61 73 65 64 20 6f 6e 20 61 20  ance based on a 
118e0 75 73 65 72 73 20 71 75 65 72 79 20 69 73 20 61  users query is a
118f0 20 63 6f 6d 70 6c 69 63 61 74 65 64 20 70 72 6f   complicated pro
11900 62 6c 65 6d 0a 20 20 61 6e 64 20 74 68 65 20 73  blem.  and the s
11910 75 62 6a 65 63 74 20 6f 66 20 6d 75 63 68 20 6f  ubject of much o
11920 6e 67 6f 69 6e 67 20 72 65 73 65 61 72 63 68 2e  ngoing research.
11930 0a 0a 3c 70 3e 0a 20 20 4f 6e 65 20 76 65 72 79  ..<p>.  One very
11940 20 73 69 6d 70 6c 65 20 73 63 68 65 6d 65 20 6d   simple scheme m
11950 69 67 68 74 20 62 65 20 74 6f 20 63 6f 75 6e 74  ight be to count
11960 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69   the number of i
11970 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20  nstances of the 
11980 0a 20 20 75 73 65 72 73 20 73 65 61 72 63 68 20  .  users search 
11990 74 65 72 6d 73 20 69 6e 20 65 61 63 68 20 72 65  terms in each re
119a0 73 75 6c 74 20 64 6f 63 75 6d 65 6e 74 2e 20 54  sult document. T
119b0 68 6f 73 65 20 64 6f 63 75 6d 65 6e 74 73 20 74  hose documents t
119c0 68 61 74 20 63 6f 6e 74 61 69 6e 0a 20 20 6d 61  hat contain.  ma
119d0 6e 79 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20  ny instances of 
119e0 74 68 65 20 74 65 72 6d 73 20 61 72 65 20 63 6f  the terms are co
119f0 6e 73 69 64 65 72 65 64 20 6d 6f 72 65 20 72 65  nsidered more re
11a00 6c 65 76 61 6e 74 20 74 68 61 6e 20 74 68 6f 73  levant than thos
11a10 65 20 77 69 74 68 0a 20 20 61 20 73 6d 61 6c 6c  e with.  a small
11a20 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 73 74 61   number of insta
11a30 6e 63 65 73 20 6f 66 20 65 61 63 68 20 74 65 72  nces of each ter
11a40 6d 2e 20 49 6e 20 61 6e 20 46 54 53 33 20 61 70  m. In an FTS3 ap
11a50 70 6c 69 63 61 74 69 6f 6e 2c 20 74 68 65 20 0a  plication, the .
11a60 20 20 6e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d    number of term
11a70 20 69 6e 73 74 61 6e 63 65 73 20 69 6e 20 65 61   instances in ea
11a80 63 68 20 72 65 73 75 6c 74 20 63 6f 75 6c 64 20  ch result could 
11a90 62 65 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  be determined by
11aa0 20 63 6f 75 6e 74 69 6e 67 0a 20 20 74 68 65 20   counting.  the 
11ab0 6e 75 6d 62 65 72 20 6f 66 20 69 6e 74 65 67 65  number of intege
11ac0 72 73 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e  rs in the return
11ad0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 5c 5b   value of the \[
11ae0 6f 66 66 73 65 74 73 5c 5d 20 66 75 6e 63 74 69  offsets\] functi
11af0 6f 6e 2e 0a 20 20 54 68 65 20 66 6f 6c 6c 6f 77  on..  The follow
11b00 69 6e 67 20 65 78 61 6d 70 6c 65 20 73 68 6f 77  ing example show
11b10 73 20 61 20 71 75 65 72 79 20 74 68 61 74 20 63  s a query that c
11b20 6f 75 6c 64 20 62 65 20 75 73 65 64 20 74 6f 20  ould be used to 
11b30 6f 62 74 61 69 6e 20 74 68 65 0a 20 20 74 65 6e  obtain the.  ten
11b40 20 6d 6f 73 74 20 72 65 6c 65 76 61 6e 74 20 72   most relevant r
11b50 65 73 75 6c 74 73 20 66 6f 72 20 61 20 71 75 65  esults for a que
11b60 72 79 20 65 6e 74 65 72 65 64 20 62 79 20 74 68  ry entered by th
11b70 65 20 75 73 65 72 3a 0a 0a 5b 43 6f 64 65 20 7b  e user:..[Code {
11b80 0a 20 20 3c 69 3e 2d 2d 20 54 68 69 73 20 65 78  .  <i>-- This ex
11b90 61 6d 70 6c 65 20 28 61 6e 64 20 61 6c 6c 20 6f  ample (and all o
11ba0 74 68 65 72 73 20 69 6e 20 74 68 69 73 20 73 65  thers in this se
11bb0 63 74 69 6f 6e 29 20 61 73 73 75 6d 65 73 20 74  ction) assumes t
11bc0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63 68  he following sch
11bd0 65 6d 61 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45  ema</i>.  CREATE
11be0 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 64   VIRTUAL TABLE d
11bf0 6f 63 75 6d 65 6e 74 73 20 55 53 49 4e 47 20 66  ocuments USING f
11c00 74 73 33 28 74 69 74 6c 65 2c 20 63 6f 6e 74 65  ts3(title, conte
11c10 6e 74 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 41 73  nt);..  <i>-- As
11c20 73 75 6d 69 6e 67 20 74 68 65 20 61 70 70 6c 69  suming the appli
11c30 63 61 74 69 6f 6e 20 68 61 73 20 73 75 70 70 6c  cation has suppl
11c40 69 65 64 20 61 6e 20 53 51 4c 69 74 65 20 75 73  ied an SQLite us
11c50 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
11c60 64 20 22 63 6f 75 6e 74 69 6e 74 65 67 65 72 73  d "countintegers
11c70 22 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 68  "</i>.  <i>-- th
11c80 61 74 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e  at returns the n
11c90 75 6d 62 65 72 20 6f 66 20 73 70 61 63 65 2d 73  umber of space-s
11ca0 65 70 61 72 61 74 65 64 20 69 6e 74 65 67 65 72  eparated integer
11cb0 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 69  s contained in i
11cc0 74 73 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74  ts only argument
11cd0 2c 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 68  ,</i>.  <i>-- th
11ce0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72  e following quer
11cf0 79 20 63 6f 75 6c 64 20 62 65 20 75 73 65 64 20  y could be used 
11d00 74 6f 20 72 65 74 75 72 6e 20 74 68 65 20 74 69  to return the ti
11d10 74 6c 65 73 20 6f 66 20 74 68 65 20 31 30 20 64  tles of the 10 d
11d20 6f 63 75 6d 65 6e 74 73 20 74 68 61 74 20 63 6f  ocuments that co
11d30 6e 74 61 69 6e 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  ntain</i>.  <i>-
11d40 2d 20 74 68 65 20 67 72 65 61 74 65 73 74 20 6e  - the greatest n
11d50 75 6d 62 65 72 20 6f 66 20 69 6e 73 74 61 6e 63  umber of instanc
11d60 65 73 20 6f 66 20 74 68 65 20 75 73 65 72 73 20  es of the users 
11d70 71 75 65 72 79 20 74 65 72 6d 73 2e 20 48 6f 70  query terms. Hop
11d80 65 66 75 6c 6c 79 2c 20 74 68 65 73 65 20 31 30  efully, these 10
11d90 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 64 6f 63  </i>.  <i>-- doc
11da0 75 6d 65 6e 74 73 20 77 69 6c 6c 20 62 65 20 74  uments will be t
11db0 68 6f 73 65 20 74 68 61 74 20 74 68 65 20 75 73  hose that the us
11dc0 65 72 73 20 63 6f 6e 73 69 64 65 72 73 20 6d 6f  ers considers mo
11dd0 72 65 20 6f 72 20 6c 65 73 73 20 74 68 65 20 6d  re or less the m
11de0 6f 73 74 20 22 72 65 6c 65 76 61 6e 74 22 2e 3c  ost "relevant".<
11df0 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 74 69 74  /i>.  SELECT tit
11e00 6c 65 20 46 52 4f 4d 20 64 6f 63 75 6d 65 6e 74  le FROM document
11e10 73 20 0a 20 20 20 20 57 48 45 52 45 20 64 6f 63  s .    WHERE doc
11e20 75 6d 65 6e 74 73 20 4d 41 54 43 48 20 26 6c 74  uments MATCH &lt
11e30 3b 71 75 65 72 79 26 67 74 3b 0a 20 20 20 20 4f  ;query&gt;.    O
11e40 52 44 45 52 20 42 59 20 63 6f 75 6e 74 69 6e 74  RDER BY countint
11e50 65 67 65 72 73 28 6f 66 66 73 65 74 73 28 64 6f  egers(offsets(do
11e60 63 75 6d 65 6e 74 29 29 20 44 45 53 43 0a 20 20  cument)) DESC.  
11e70 20 20 4f 46 46 53 45 54 20 30 20 4c 49 4d 49 54    OFFSET 0 LIMIT
11e80 20 31 30 0a 7d 5d 0a 0a 3c 70 3e 0a 20 20 54 68   10.}]..<p>.  Th
11e90 65 20 71 75 65 72 79 20 61 62 6f 76 65 20 63 6f  e query above co
11ea0 75 6c 64 20 62 65 20 6d 61 64 65 20 74 6f 20 72  uld be made to r
11eb0 75 6e 20 66 61 73 74 65 72 20 62 79 20 75 73 69  un faster by usi
11ec0 6e 67 20 74 68 65 20 46 54 53 33 20 5c 5b 6d 61  ng the FTS3 \[ma
11ed0 74 63 68 69 6e 66 6f 5c 5d 0a 20 20 66 75 6e 63  tchinfo\].  func
11ee0 74 69 6f 6e 20 74 6f 20 64 65 74 65 72 6d 69 6e  tion to determin
11ef0 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
11f00 71 75 65 72 79 20 74 65 72 6d 20 69 6e 73 74 61  query term insta
11f10 6e 63 65 73 20 74 68 61 74 20 61 70 70 65 61 72  nces that appear
11f20 20 69 6e 20 65 61 63 68 0a 20 20 72 65 73 75 6c   in each.  resul
11f30 74 2e 20 54 68 65 20 6d 61 74 63 68 69 6e 66 6f  t. The matchinfo
11f40 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6d 75 63   function is muc
11f50 68 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74  h more efficient
11f60 20 74 68 61 6e 20 74 68 65 20 6f 66 66 73 65 74   than the offset
11f70 73 20 0a 20 20 66 75 6e 63 74 69 6f 6e 2e 20 46  s .  function. F
11f80 75 72 74 68 65 72 6d 6f 72 65 2c 20 74 68 65 20  urthermore, the 
11f90 6d 61 74 63 68 69 6e 66 6f 20 66 75 6e 63 74 69  matchinfo functi
11fa0 6f 6e 20 70 72 6f 76 69 64 65 73 20 65 78 74 72  on provides extr
11fb0 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20 20  a information.  
11fc0 72 65 67 61 72 64 69 6e 67 20 74 68 65 20 6f 76  regarding the ov
11fd0 65 72 61 6c 6c 20 6e 75 6d 62 65 72 20 6f 66 20  erall number of 
11fe0 6f 63 63 75 72 65 6e 63 65 73 20 6f 66 20 65 61  occurences of ea
11ff0 63 68 20 71 75 65 72 79 20 74 65 72 6d 20 69 6e  ch query term in
12000 20 74 68 65 20 65 6e 74 69 72 65 0a 20 20 64 6f   the entire.  do
12010 63 75 6d 65 6e 74 20 73 65 74 20 28 6e 6f 74 20  cument set (not 
12020 6a 75 73 74 20 74 68 65 20 63 75 72 72 65 6e 74  just the current
12030 20 72 6f 77 29 20 61 6e 64 20 74 68 65 20 6e 75   row) and the nu
12040 6d 62 65 72 20 6f 66 20 64 6f 63 75 6d 65 6e 74  mber of document
12050 73 20 69 6e 20 77 68 69 63 68 20 0a 20 20 65 61  s in which .  ea
12060 63 68 20 71 75 65 72 79 20 74 65 72 6d 20 61 70  ch query term ap
12070 70 65 61 72 73 2e 20 54 68 69 73 20 6d 61 79 20  pears. This may 
12080 62 65 20 75 73 65 64 20 28 66 6f 72 20 65 78 61  be used (for exa
12090 6d 70 6c 65 29 20 74 6f 20 61 74 74 61 63 68 20  mple) to attach 
120a0 61 20 68 69 67 68 65 72 0a 20 20 77 65 69 67 68  a higher.  weigh
120b0 74 20 74 6f 20 6c 65 73 73 20 63 6f 6d 6d 6f 6e  t to less common
120c0 20 74 65 72 6d 73 20 77 68 69 63 68 20 6d 61 79   terms which may
120d0 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 6f 76   increase the ov
120e0 65 72 61 6c 6c 20 63 6f 6d 70 75 74 65 64 20 72  erall computed r
120f0 65 6c 65 76 61 6e 63 79 20 0a 20 20 6f 66 20 74  elevancy .  of t
12100 68 6f 73 65 20 72 65 73 75 6c 74 73 20 74 68 65  hose results the
12110 20 75 73 65 72 20 63 6f 6e 73 69 64 65 72 73 20   user considers 
12120 6d 6f 72 65 20 69 6e 74 65 72 65 73 74 69 6e 67  more interesting
12130 2e 0a 0a 5b 43 6f 64 65 20 7b 0a 20 20 3c 69 3e  ...[Code {.  <i>
12140 2d 2d 20 49 66 20 74 68 65 20 61 70 70 6c 69 63  -- If the applic
12150 61 74 69 6f 6e 20 73 75 70 70 6c 69 65 73 20 61  ation supplies a
12160 6e 20 53 51 4c 69 74 65 20 75 73 65 72 20 66 75  n SQLite user fu
12170 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 22 72  nction called "r
12180 61 6e 6b 22 20 74 68 61 74 3c 2f 69 3e 0a 20 20  ank" that</i>.  
12190 3c 69 3e 2d 2d 20 69 6e 74 65 72 70 72 65 74 73  <i>-- interprets
121a0 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 74   the blob of dat
121b0 61 20 72 65 74 75 72 6e 65 64 20 62 79 20 6d 61  a returned by ma
121c0 74 63 68 69 6e 66 6f 20 61 6e 64 20 72 65 74 75  tchinfo and retu
121d0 72 6e 73 20 61 20 6e 75 6d 65 72 69 63 3c 2f 69  rns a numeric</i
121e0 3e 0a 20 20 3c 69 3e 2d 2d 20 72 65 6c 65 76 61  >.  <i>-- releva
121f0 6e 63 79 20 62 61 73 65 64 20 6f 6e 20 69 74 2c  ncy based on it,
12200 20 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77   then the follow
12210 69 6e 67 20 53 51 4c 20 6d 61 79 20 62 65 20 75  ing SQL may be u
12220 73 65 64 20 74 6f 20 72 65 74 75 72 6e 20 74 68  sed to return th
12230 65 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 69  e</i>.  <i>-- ti
12240 74 6c 65 73 20 6f 66 20 74 68 65 20 31 30 20 6d  tles of the 10 m
12250 6f 73 74 20 72 65 6c 65 76 61 6e 74 20 64 6f 63  ost relevant doc
12260 75 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 64 61  uments in the da
12270 74 61 73 65 74 20 66 6f 72 20 61 20 75 73 65 72  taset for a user
12280 73 20 71 75 65 72 79 2e 3c 2f 69 3e 0a 20 20 53  s query.</i>.  S
12290 45 4c 45 43 54 20 74 69 74 6c 65 20 46 52 4f 4d  ELECT title FROM
122a0 20 64 6f 63 75 6d 65 6e 74 73 20 0a 20 20 20 20   documents .    
122b0 57 48 45 52 45 20 64 6f 63 75 6d 65 6e 74 73 20  WHERE documents 
122c0 4d 41 54 43 48 20 26 6c 74 3b 71 75 65 72 79 26  MATCH &lt;query&
122d0 67 74 3b 0a 20 20 20 20 4f 52 44 45 52 20 42 59  gt;.    ORDER BY
122e0 20 72 61 6e 6b 28 6d 61 74 63 68 69 6e 66 6f 28   rank(matchinfo(
122f0 64 6f 63 75 6d 65 6e 74 29 29 20 44 45 53 43 0a  document)) DESC.
12300 20 20 20 20 4f 46 46 53 45 54 20 30 20 4c 49 4d      OFFSET 0 LIM
12310 49 54 20 31 30 0a 7d 5d 0a 0a 3c 70 3e 0a 20 20  IT 10.}]..<p>.  
12320 54 68 65 20 53 51 4c 20 71 75 65 72 79 20 69 6e  The SQL query in
12330 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f   the example abo
12340 76 65 20 75 73 65 73 20 6c 65 73 73 20 43 50 55  ve uses less CPU
12350 20 74 68 61 6e 20 74 68 65 20 66 69 72 73 74 20   than the first 
12360 65 78 61 6d 70 6c 65 0a 20 20 69 6e 20 74 68 69  example.  in thi
12370 73 20 73 65 63 74 69 6f 6e 2c 20 62 75 74 20 73  s section, but s
12380 74 69 6c 6c 20 68 61 73 20 61 20 6e 6f 6e 2d 6f  till has a non-o
12390 62 76 69 6f 75 73 20 70 65 72 66 6f 72 6d 61 6e  bvious performan
123a0 63 65 20 70 72 6f 62 6c 65 6d 2e 20 53 51 4c 69  ce problem. SQLi
123b0 74 65 0a 20 20 73 61 74 69 73 66 69 65 73 20 74  te.  satisfies t
123c0 68 69 73 20 71 75 65 72 79 20 62 79 20 72 65 74  his query by ret
123d0 72 65 69 76 69 6e 67 20 74 68 65 20 76 61 6c 75  reiving the valu
123e0 65 20 6f 66 20 74 68 65 20 22 74 69 74 6c 65 22  e of the "title"
123f0 20 63 6f 6c 75 6d 6e 20 61 6e 64 0a 20 20 6d 61   column and.  ma
12400 74 63 68 69 6e 66 6f 20 64 61 74 61 20 66 72 6f  tchinfo data fro
12410 6d 20 74 68 65 20 46 54 53 33 20 6d 6f 64 75 6c  m the FTS3 modul
12420 65 20 66 6f 72 20 65 76 65 72 79 20 72 6f 77 20  e for every row 
12430 6d 61 74 63 68 65 64 20 62 79 20 74 68 65 20 75  matched by the u
12440 73 65 72 73 0a 20 20 71 75 65 72 79 20 62 65 66  sers.  query bef
12450 6f 72 65 20 69 74 20 73 6f 72 74 73 20 61 6e 64  ore it sorts and
12460 20 6c 69 6d 69 74 73 20 74 68 65 20 72 65 73 75   limits the resu
12470 6c 74 73 2e 20 42 65 63 61 75 73 65 20 6f 66 20  lts. Because of 
12480 74 68 65 20 77 61 79 20 53 51 4c 69 74 65 27 73  the way SQLite's
12490 0a 20 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  .  virtual table
124a0 20 69 6e 74 65 72 66 61 63 65 20 77 6f 72 6b 73   interface works
124b0 2c 20 72 65 74 72 69 65 76 69 6e 67 20 74 68 65  , retrieving the
124c0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 22 74   value of the "t
124d0 69 74 6c 65 22 20 63 6f 6c 75 6d 6e 0a 20 20 72  itle" column.  r
124e0 65 71 75 69 72 65 73 20 6c 6f 61 64 69 6e 67 20  equires loading 
124f0 74 68 65 20 65 6e 74 69 72 65 20 72 6f 77 20 66  the entire row f
12500 72 6f 6d 20 64 69 73 6b 20 28 69 6e 63 6c 75 64  rom disk (includ
12510 69 6e 67 20 74 68 65 20 22 63 6f 6e 74 65 6e 74  ing the "content
12520 22 20 66 69 65 6c 64 2c 0a 20 20 77 68 69 63 68  " field,.  which
12530 20 6d 61 79 20 62 65 20 71 75 69 74 65 20 6c 61   may be quite la
12540 72 67 65 29 2e 20 54 68 69 73 20 6d 65 61 6e 73  rge). This means
12550 20 74 68 61 74 20 69 66 20 74 68 65 20 75 73 65   that if the use
12560 72 73 20 71 75 65 72 79 20 6d 61 74 63 68 65 73  rs query matches
12570 0a 20 20 73 65 76 65 72 61 6c 20 74 68 6f 75 73  .  several thous
12580 61 6e 64 20 64 6f 63 75 6d 65 6e 74 73 2c 20 6d  and documents, m
12590 61 6e 79 20 6d 65 67 61 62 79 74 65 73 20 6f 66  any megabytes of
125a0 20 22 74 69 74 6c 65 22 20 61 6e 64 20 22 63 6f   "title" and "co
125b0 6e 74 65 6e 74 22 20 64 61 74 61 0a 20 20 6d 61  ntent" data.  ma
125c0 79 20 62 65 20 6c 6f 61 64 65 64 20 66 72 6f 6d  y be loaded from
125d0 20 64 69 73 6b 20 69 6e 74 6f 20 6d 65 6d 6f 72   disk into memor
125e0 79 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68  y even though th
125f0 65 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  ey will never be
12600 20 75 73 65 64 0a 20 20 66 6f 72 20 61 6e 79 20   used.  for any 
12610 70 75 72 70 6f 73 65 2e 20 0a 0a 3c 70 3e 0a 20  purpose. ..<p>. 
12620 20 54 68 65 20 53 51 4c 20 71 75 65 72 79 20 69   The SQL query i
12630 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
12640 65 78 61 6d 70 6c 65 20 62 6c 6f 63 6b 20 69 73  example block is
12650 20 6f 6e 65 20 73 6f 6c 75 74 69 6f 6e 20 74 6f   one solution to
12660 20 74 68 69 73 20 0a 20 20 70 72 6f 62 6c 65 6d   this .  problem
12670 2e 20 49 6e 20 53 51 4c 69 74 65 2c 20 77 68 65  . In SQLite, whe
12680 6e 20 61 20 3c 61 20 68 72 65 66 3d 22 6f 70 74  n a <a href="opt
12690 6f 76 65 72 76 69 65 77 2e 68 74 6d 6c 23 66 6c  overview.html#fl
126a0 61 74 74 65 6e 69 6e 67 22 3e 73 75 62 2d 71 75  attening">sub-qu
126b0 65 72 79 20 0a 20 20 75 73 65 64 20 69 6e 20 61  ery .  used in a
126c0 20 6a 6f 69 6e 20 63 6f 6e 74 61 69 6e 73 20 61   join contains a
126d0 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 3c 2f 61   LIMIT clause</a
126e0 3e 2c 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  >, the results o
126f0 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  f the sub-query 
12700 61 72 65 0a 20 20 63 61 6c 63 75 61 74 65 64 20  are.  calcuated 
12710 61 6e 64 20 73 74 6f 72 65 64 20 69 6e 20 74 65  and stored in te
12720 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 62 65  mporary table be
12730 66 6f 72 65 20 74 68 65 20 6d 61 69 6e 20 71 75  fore the main qu
12740 65 72 79 20 69 73 20 65 78 65 63 75 74 65 64 2e  ery is executed.
12750 0a 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  .  This means th
12760 61 74 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6c  at SQLite will l
12770 6f 61 64 20 6f 6e 6c 79 20 74 68 65 20 64 6f 63  oad only the doc
12780 69 64 20 61 6e 64 20 6d 61 74 63 68 69 6e 66 6f  id and matchinfo
12790 20 64 61 74 61 20 66 6f 72 20 65 61 63 68 0a 20   data for each. 
127a0 20 72 6f 77 20 6d 61 74 63 68 69 6e 67 20 74 68   row matching th
127b0 65 20 75 73 65 72 73 20 71 75 65 72 79 20 69 6e  e users query in
127c0 74 6f 20 6d 65 6d 6f 72 79 2c 20 64 65 74 65 72  to memory, deter
127d0 6d 69 6e 65 20 74 68 65 20 64 6f 63 69 64 20 76  mine the docid v
127e0 61 6c 75 65 73 0a 20 20 63 6f 72 72 65 73 70 6f  alues.  correspo
127f0 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 74 65 6e  nding to the ten
12800 20 6d 6f 73 74 20 72 65 6c 65 76 61 6e 74 20 64   most relevant d
12810 6f 63 75 6d 65 6e 74 73 2c 20 74 68 65 6e 20 6c  ocuments, then l
12820 6f 61 64 20 6f 6e 6c 79 20 74 68 65 20 74 69 74  oad only the tit
12830 6c 65 0a 20 20 61 6e 64 20 63 6f 6e 74 65 6e 74  le.  and content
12840 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
12850 20 74 68 6f 73 65 20 31 30 20 64 6f 63 75 6d 65   those 10 docume
12860 6e 74 73 20 6f 6e 6c 79 2e 20 42 65 63 61 75 73  nts only. Becaus
12870 65 20 62 6f 74 68 20 74 68 65 20 6d 61 74 63 68  e both the match
12880 69 6e 66 6f 0a 20 20 61 6e 64 20 64 6f 63 69 64  info.  and docid
12890 20 76 61 6c 75 65 73 20 61 72 65 20 67 6c 65 61   values are glea
128a0 6e 65 64 20 65 6e 74 69 72 65 6c 79 20 66 72 6f  ned entirely fro
128b0 6d 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20  m the full-text 
128c0 69 6e 64 65 78 2c 20 74 68 69 73 20 72 65 73 75  index, this resu
128d0 6c 74 73 0a 20 20 69 6e 20 64 72 61 6d 61 74 69  lts.  in dramati
128e0 63 61 6c 6c 79 20 6c 65 73 73 20 64 61 74 61 20  cally less data 
128f0 62 65 69 6e 67 20 6c 6f 61 64 65 64 20 66 72 6f  being loaded fro
12900 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  m the database i
12910 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 0a 5b 43 6f  nto memory...[Co
12920 64 65 20 7b 0a 20 20 53 45 4c 45 43 54 20 74 69  de {.  SELECT ti
12930 74 6c 65 20 46 52 4f 4d 20 64 6f 63 75 6d 65 6e  tle FROM documen
12940 74 73 20 4a 4f 49 4e 20 28 20 0a 20 20 20 20 20  ts JOIN ( .     
12950 20 53 45 4c 45 43 54 20 64 6f 63 69 64 2c 20 72   SELECT docid, r
12960 61 6e 6b 28 6d 61 74 63 68 69 6e 66 6f 28 64 6f  ank(matchinfo(do
12970 63 75 6d 65 6e 74 29 29 20 41 53 20 72 61 6e 6b  cument)) AS rank
12980 20 0a 20 20 20 20 20 20 46 52 4f 4d 20 64 6f 63   .      FROM doc
12990 75 6d 65 6e 74 73 0a 20 20 20 20 20 20 57 48 45  uments.      WHE
129a0 52 45 20 64 6f 63 75 6d 65 6e 74 73 20 4d 41 54  RE documents MAT
129b0 43 48 20 26 6c 74 3b 71 75 65 72 79 26 67 74 3b  CH &lt;query&gt;
129c0 0a 20 20 20 20 20 20 4f 52 44 45 52 20 42 59 20  .      ORDER BY 
129d0 72 61 6e 6b 20 44 45 53 43 20 0a 20 20 20 20 20  rank DESC .     
129e0 20 4f 46 46 53 45 54 20 30 20 4c 49 4d 49 54 20   OFFSET 0 LIMIT 
129f0 31 30 0a 20 20 29 20 41 53 20 72 61 6e 6b 74 61  10.  ) AS rankta
12a00 62 6c 65 20 55 53 49 4e 47 28 64 6f 63 69 64 29  ble USING(docid)
12a10 0a 20 20 4f 52 44 45 52 20 42 59 20 72 61 6e 6b  .  ORDER BY rank
12a20 74 61 62 6c 65 2e 72 61 6e 6b 20 44 45 53 43 0a  table.rank DESC.
12a30 7d 5d 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 6e 65  }]..<p>.  The ne
12a40 78 74 20 62 6c 6f 63 6b 20 6f 66 20 53 51 4c 20  xt block of SQL 
12a50 65 6e 68 61 6e 63 65 73 20 74 68 65 20 71 75 65  enhances the que
12a60 72 79 20 77 69 74 68 20 73 6f 6c 75 74 69 6f 6e  ry with solution
12a70 73 20 74 6f 20 74 77 6f 20 6f 74 68 65 72 20 70  s to two other p
12a80 72 6f 62 6c 65 6d 73 0a 20 20 74 68 61 74 20 6d  roblems.  that m
12a90 61 79 20 61 72 69 73 65 20 69 6e 20 64 65 76 65  ay arise in deve
12aa0 6c 6f 70 69 6e 67 20 73 65 61 72 63 68 20 61 70  loping search ap
12ab0 70 6c 69 63 61 74 69 6f 6e 73 20 75 73 69 6e 67  plications using
12ac0 20 46 54 53 33 3a 0a 0a 3c 6f 6c 3e 0a 20 20 3c   FTS3:..<ol>.  <
12ad0 6c 69 3e 20 3c 70 3e 0a 20 20 20 20 20 20 20 54  li> <p>.       T
12ae0 68 65 20 5c 5b 73 6e 69 70 70 65 74 5c 5d 20 66  he \[snippet\] f
12af0 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62  unction cannot b
12b00 65 20 75 73 65 64 20 77 69 74 68 20 74 68 65 20  e used with the 
12b10 61 62 6f 76 65 20 71 75 65 72 79 2e 20 42 65 63  above query. Bec
12b20 61 75 73 65 0a 20 20 20 20 20 20 20 74 68 65 20  ause.       the 
12b30 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73  outer query does
12b40 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 61 20 22   not include a "
12b50 57 48 45 52 45 20 2e 2e 2e 20 4d 41 54 43 48 22  WHERE ... MATCH"
12b60 20 63 6c 61 75 73 65 2c 20 74 68 65 20 73 6e 69   clause, the sni
12b70 70 70 65 74 20 0a 20 20 20 20 20 20 20 66 75 6e  ppet .       fun
12b80 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65  ction may not be
12b90 20 75 73 65 64 20 77 69 74 68 20 69 74 2e 20 4f   used with it. O
12ba0 6e 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74  ne solution is t
12bb0 6f 20 64 75 70 6c 69 63 61 74 65 20 74 68 65 20  o duplicate the 
12bc0 57 48 45 52 45 0a 20 20 20 20 20 20 20 63 6c 61  WHERE.       cla
12bd0 75 73 65 20 75 73 65 64 20 62 79 20 74 68 65 20  use used by the 
12be0 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65  sub-query in the
12bf0 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 54 68   outer query. Th
12c00 65 20 6f 76 65 72 68 65 61 64 20 61 73 73 6f 63  e overhead assoc
12c10 69 61 74 65 64 0a 20 20 20 20 20 20 20 77 69 74  iated.       wit
12c20 68 20 74 68 69 73 20 69 73 20 75 73 75 61 6c 6c  h this is usuall
12c30 79 20 6e 65 67 6c 69 67 69 62 6c 65 2e 0a 20 20  y negligible..  
12c40 3c 6c 69 3e 20 3c 70 3e 0a 20 20 20 20 20 20 20  <li> <p>.       
12c50 54 68 65 20 72 65 6c 65 76 61 6e 63 79 20 6f 66  The relevancy of
12c60 20 61 20 64 6f 63 75 6d 65 6e 74 20 6d 61 79 20   a document may 
12c70 64 65 70 65 6e 64 20 6f 6e 20 73 6f 6d 65 74 68  depend on someth
12c80 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 6a  ing other than j
12c90 75 73 74 0a 20 20 20 20 20 20 20 74 68 65 20 64  ust.       the d
12ca0 61 74 61 20 61 76 61 69 6c 61 62 6c 65 20 69 6e  ata available in
12cb0 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
12cc0 65 20 6f 66 20 6d 61 74 63 68 69 6e 66 6f 2e 20  e of matchinfo. 
12cd0 46 6f 72 20 65 78 61 6d 70 6c 65 0a 20 20 20 20  For example.    
12ce0 20 20 20 65 61 63 68 20 64 6f 63 75 6d 65 6e 74     each document
12cf0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
12d00 20 6d 61 79 20 62 65 20 61 73 73 69 67 6e 65 64   may be assigned
12d10 20 61 20 73 74 61 74 69 63 20 77 65 69 67 68 74   a static weight
12d20 20 62 61 73 65 64 0a 20 20 20 20 20 20 20 6f 6e   based.       on
12d30 20 66 61 63 74 6f 72 73 20 75 6e 72 65 6c 61 74   factors unrelat
12d40 65 64 20 74 6f 20 69 74 73 20 63 6f 6e 74 65 6e  ed to its conten
12d50 74 20 28 6f 72 69 67 69 6e 2c 20 61 75 74 68 6f  t (origin, autho
12d60 72 2c 20 61 67 65 2c 20 6e 75 6d 62 65 72 0a 20  r, age, number. 
12d70 20 20 20 20 20 20 6f 66 20 72 65 66 65 72 65 6e        of referen
12d80 63 65 73 20 65 74 63 2e 29 2e 20 54 68 65 73 65  ces etc.). These
12d90 20 76 61 6c 75 65 73 20 63 61 6e 20 62 65 20 73   values can be s
12da0 74 6f 72 65 64 20 62 79 20 74 68 65 20 61 70 70  tored by the app
12db0 6c 69 63 61 74 69 6f 6e 0a 20 20 20 20 20 20 20  lication.       
12dc0 69 6e 20 61 20 73 65 70 61 72 61 74 65 20 74 61  in a separate ta
12dd0 62 6c 65 20 74 68 61 74 20 63 61 6e 20 62 65 20  ble that can be 
12de0 6a 6f 69 6e 65 64 20 61 67 61 69 6e 73 74 20 74  joined against t
12df0 68 65 20 64 6f 63 75 6d 65 6e 74 73 20 74 61 62  he documents tab
12e00 6c 65 0a 20 20 20 20 20 20 20 69 6e 20 74 68 65  le.       in the
12e10 20 73 75 62 2d 71 75 65 72 79 20 73 6f 20 74 68   sub-query so th
12e20 61 74 20 74 68 65 20 72 61 6e 6b 20 66 75 6e 63  at the rank func
12e30 74 69 6f 6e 20 6d 61 79 20 61 63 63 65 73 73 20  tion may access 
12e40 74 68 65 6d 2e 0a 3c 2f 6f 6c 3e 0a 0a 3c 70 3e  them..</ol>..<p>
12e50 0a 20 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20  .  This version 
12e60 6f 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20  of the query is 
12e70 76 65 72 79 20 73 69 6d 69 6c 61 72 20 74 6f 20  very similar to 
12e80 74 68 61 74 20 75 73 65 64 20 62 79 20 74 68 65  that used by the
12e90 20 0a 20 20 3c 61 20 68 72 65 66 3d 22 68 74 74   .  <a href="htt
12ea0 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f  p://www.sqlite.o
12eb0 72 67 2f 73 65 61 72 63 68 3f 71 3d 66 74 73 33  rg/search?q=fts3
12ec0 22 3e 73 71 6c 69 74 65 2e 6f 72 67 20 64 6f 63  ">sqlite.org doc
12ed0 75 6d 65 6e 74 61 74 69 6f 6e 20 73 65 61 72 63  umentation searc
12ee0 68 3c 2f 61 3e 20 0a 20 20 61 70 70 6c 69 63 61  h</a> .  applica
12ef0 74 69 6f 6e 2e 0a 0a 5b 43 6f 64 65 20 7b 0a 20  tion...[Code {. 
12f00 20 3c 69 3e 2d 2d 20 54 68 69 73 20 74 61 62 6c   <i>-- This tabl
12f10 65 20 73 74 6f 72 65 73 20 74 68 65 20 73 74 61  e stores the sta
12f20 74 69 63 20 77 65 69 67 68 74 20 61 73 73 69 67  tic weight assig
12f30 6e 65 64 20 74 6f 20 65 61 63 68 20 64 6f 63 75  ned to each docu
12f40 6d 65 6e 74 20 69 6e 20 46 54 53 33 20 74 61 62  ment in FTS3 tab
12f50 6c 65 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 22  le</i>.  <i>-- "
12f60 64 6f 63 75 6d 65 6e 74 73 22 2e 20 46 6f 72 20  documents". For 
12f70 65 61 63 68 20 72 6f 77 20 69 6e 20 74 68 65 20  each row in the 
12f80 64 6f 63 75 6d 65 6e 74 73 20 74 61 62 6c 65 20  documents table 
12f90 74 68 65 72 65 20 69 73 20 61 20 63 6f 72 72 65  there is a corre
12fa0 73 70 6f 6e 64 69 6e 67 20 72 6f 77 3c 2f 69 3e  sponding row</i>
12fb0 0a 20 20 3c 69 3e 2d 2d 20 77 69 74 68 20 74 68  .  <i>-- with th
12fc0 65 20 73 61 6d 65 20 64 6f 63 69 64 20 76 61 6c  e same docid val
12fd0 75 65 20 69 6e 20 74 68 69 73 20 74 61 62 6c 65  ue in this table
12fe0 2e 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45 20 54  .</i>.  CREATE T
12ff0 41 42 4c 45 20 64 6f 63 75 6d 65 6e 74 73 5f 64  ABLE documents_d
13000 61 74 61 28 64 6f 63 69 64 20 49 4e 54 45 47 45  ata(docid INTEGE
13010 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 77  R PRIMARY KEY, w
13020 65 69 67 68 74 29 3b 0a 0a 20 20 3c 69 3e 2d 2d  eight);..  <i>--
13030 20 54 68 69 73 20 71 75 65 72 79 20 69 73 20 73   This query is s
13040 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 20 6f 6e  imilar to the on
13050 65 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61  e in the block a
13060 62 6f 76 65 2c 20 65 78 63 65 70 74 20 74 68 61  bove, except tha
13070 74 3a 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 3c 2f  t:</i>.  <i>--</
13080 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20 31 2e 20  i>.  <i>--   1. 
13090 49 74 20 72 65 74 75 72 6e 73 20 61 20 22 73 6e  It returns a "sn
130a0 69 70 70 65 74 22 20 6f 66 20 74 65 78 74 20 61  ippet" of text a
130b0 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 64 6f  long with the do
130c0 63 75 6d 65 6e 74 20 74 69 74 6c 65 20 66 6f 72  cument title for
130d0 20 64 69 73 70 6c 61 79 2e 20 53 6f 3c 2f 69 3e   display. So</i>
130e0 0a 20 20 3c 69 3e 2d 2d 20 20 20 20 20 20 74 68  .  <i>--      th
130f0 61 74 20 74 68 65 20 73 6e 69 70 70 65 74 20 66  at the snippet f
13100 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 75  unction may be u
13110 73 65 64 2c 20 74 68 65 20 22 57 48 45 52 45 20  sed, the "WHERE 
13120 2e 2e 2e 20 4d 41 54 43 48 20 2e 2e 2e 22 20 63  ... MATCH ..." c
13130 6c 61 75 73 65 20 66 72 6f 6d 3c 2f 69 3e 0a 20  lause from</i>. 
13140 20 3c 69 3e 2d 2d 20 20 20 20 20 20 74 68 65 20   <i>--      the 
13150 73 75 62 2d 71 75 65 72 79 20 69 73 20 64 75 70  sub-query is dup
13160 6c 69 63 61 74 65 64 20 69 6e 20 74 68 65 20 6f  licated in the o
13170 75 74 65 72 20 71 75 65 72 79 2e 3c 2f 69 3e 0a  uter query.</i>.
13180 20 20 3c 69 3e 2d 2d 3c 2f 69 3e 0a 20 20 3c 69    <i>--</i>.  <i
13190 3e 2d 2d 20 20 20 32 2e 20 54 68 65 20 73 75 62  >--   2. The sub
131a0 2d 71 75 65 72 79 20 6a 6f 69 6e 73 20 74 68 65  -query joins the
131b0 20 64 6f 63 75 6d 65 6e 74 73 20 74 61 62 6c 65   documents table
131c0 20 77 69 74 68 20 74 68 65 20 64 6f 63 75 6d 65   with the docume
131d0 6e 74 5f 64 61 74 61 20 74 61 62 6c 65 2c 20 73  nt_data table, s
131e0 6f 20 74 68 61 74 3c 2f 69 3e 0a 20 20 3c 69 3e  o that</i>.  <i>
131f0 2d 2d 20 20 20 20 20 20 69 6d 70 6c 65 6d 65 6e  --      implemen
13200 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 61  tation of the ra
13210 6e 6b 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  nk function has 
13220 61 63 63 65 73 73 20 74 6f 20 74 68 65 20 73 74  access to the st
13230 61 74 69 63 20 77 65 69 67 68 74 20 61 73 73 69  atic weight assi
13240 67 6e 65 64 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  gned</i>.  <i>--
13250 20 20 20 20 20 20 74 6f 20 65 61 63 68 20 64 6f        to each do
13260 63 75 6d 65 6e 74 2e 3c 2f 69 3e 0a 20 20 53 45  cument.</i>.  SE
13270 4c 45 43 54 20 74 69 74 6c 65 2c 20 73 6e 69 70  LECT title, snip
13280 70 65 74 28 64 6f 63 75 6d 65 6e 74 73 29 20 46  pet(documents) F
13290 52 4f 4d 20 64 6f 63 75 6d 65 6e 74 73 20 4a 4f  ROM documents JO
132a0 49 4e 20 28 20 0a 20 20 20 20 20 20 53 45 4c 45  IN ( .      SELE
132b0 43 54 20 64 6f 63 69 64 2c 20 72 61 6e 6b 28 6d  CT docid, rank(m
132c0 61 74 63 68 69 6e 66 6f 28 64 6f 63 75 6d 65 6e  atchinfo(documen
132d0 74 29 2c 20 64 6f 63 75 6d 65 6e 74 73 5f 64 61  t), documents_da
132e0 74 61 2e 77 65 69 67 68 74 29 20 41 53 20 72 61  ta.weight) AS ra
132f0 6e 6b 0a 20 20 20 20 20 20 46 52 4f 4d 20 64 6f  nk.      FROM do
13300 63 75 6d 65 6e 74 73 20 4a 4f 49 4e 20 64 6f 63  cuments JOIN doc
13310 75 6d 65 6e 74 73 5f 64 61 74 61 20 55 53 49 4e  uments_data USIN
13320 47 28 64 6f 63 69 64 29 0a 20 20 20 20 20 20 57  G(docid).      W
13330 48 45 52 45 20 64 6f 63 75 6d 65 6e 74 73 20 4d  HERE documents M
13340 41 54 43 48 20 26 6c 74 3b 71 75 65 72 79 26 67  ATCH &lt;query&g
13350 74 3b 0a 20 20 20 20 20 20 4f 52 44 45 52 20 42  t;.      ORDER B
13360 59 20 72 61 6e 6b 20 44 45 53 43 20 0a 20 20 20  Y rank DESC .   
13370 20 20 20 4f 46 46 53 45 54 20 30 20 4c 49 4d 49     OFFSET 0 LIMI
13380 54 20 31 30 0a 20 20 29 20 41 53 20 72 61 6e 6b  T 10.  ) AS rank
13390 74 61 62 6c 65 20 55 53 49 4e 47 28 64 6f 63 69  table USING(doci
133a0 64 29 0a 20 20 57 48 45 52 45 20 64 6f 63 75 6d  d).  WHERE docum
133b0 65 6e 74 73 20 4d 41 54 43 48 20 26 6c 74 3b 71  ents MATCH &lt;q
133c0 75 65 72 79 26 67 74 3b 0a 20 20 4f 52 44 45 52  uery&gt;.  ORDER
133d0 20 42 59 20 72 61 6e 6b 74 61 62 6c 65 2e 72 61   BY ranktable.ra
133e0 6e 6b 20 44 45 53 43 0a 7d 5d 0a 0a 3c 70 3e 0a  nk DESC.}]..<p>.
133f0 20 20 41 6c 6c 20 74 68 65 20 65 78 61 6d 70 6c    All the exampl
13400 65 20 71 75 65 72 69 65 73 20 61 62 6f 76 65 20  e queries above 
13410 72 65 74 75 72 6e 20 74 68 65 20 74 65 6e 20 6d  return the ten m
13420 6f 73 74 20 72 65 6c 65 76 61 6e 74 20 71 75 65  ost relevant que
13430 72 79 20 72 65 73 75 6c 74 73 2e 0a 20 20 42 79  ry results..  By
13440 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 76   modifying the v
13450 61 6c 75 65 73 20 75 73 65 64 20 77 69 74 68 20  alues used with 
13460 74 68 65 20 4f 46 46 53 45 54 20 61 6e 64 20 4c  the OFFSET and L
13470 49 4d 49 54 20 63 6c 61 75 73 65 73 2c 20 61 20  IMIT clauses, a 
13480 71 75 65 72 79 20 0a 20 20 74 6f 20 72 65 74 75  query .  to retu
13490 72 6e 20 28 73 61 79 29 20 74 68 65 20 6e 65 78  rn (say) the nex
134a0 74 20 74 65 6e 20 6d 6f 73 74 20 72 65 6c 65 76  t ten most relev
134b0 61 6e 74 20 72 65 73 75 6c 74 73 20 69 73 20 65  ant results is e
134c0 61 73 79 20 74 6f 20 63 6f 6e 73 74 72 75 63 74  asy to construct
134d0 2e 20 0a 20 20 54 68 69 73 20 6d 61 79 20 62 65  . .  This may be
134e0 20 75 73 65 64 20 74 6f 20 6f 62 74 61 69 6e 20   used to obtain 
134f0 74 68 65 20 64 61 74 61 20 72 65 71 75 69 72 65  the data require
13500 64 20 66 6f 72 20 61 20 73 65 61 72 63 68 20 61  d for a search a
13510 70 70 6c 69 63 61 74 69 6f 6e 73 20 73 65 63 6f  pplications seco
13520 6e 64 0a 20 20 61 6e 64 20 73 75 62 73 65 71 75  nd.  and subsequ
13530 65 6e 74 20 70 61 67 65 73 20 6f 66 20 72 65 73  ent pages of res
13540 75 6c 74 73 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65  ults...<p>.  The
13550 20 6e 65 78 74 20 62 6c 6f 63 6b 20 63 6f 6e 74   next block cont
13560 61 69 6e 73 20 61 6e 20 65 78 61 6d 70 6c 65 20  ains an example 
13570 72 61 6e 6b 20 66 75 6e 63 74 69 6f 6e 20 74 68  rank function th
13580 61 74 20 75 73 65 73 20 6d 61 74 63 68 69 6e 66  at uses matchinf
13590 6f 20 64 61 74 61 20 0a 20 20 69 6d 70 6c 65 6d  o data .  implem
135a0 65 6e 74 65 64 20 69 6e 20 43 2e 20 49 6e 73 74  ented in C. Inst
135b0 65 61 64 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ead of a single 
135c0 77 65 69 67 68 74 2c 20 69 74 20 61 6c 6c 6f 77  weight, it allow
135d0 73 20 61 20 77 65 69 67 68 74 20 74 6f 20 62 65  s a weight to be
135e0 20 0a 20 20 65 78 74 65 72 6e 61 6c 6c 79 20 61   .  externally a
135f0 73 73 69 67 6e 65 64 20 74 6f 20 65 61 63 68 20  ssigned to each 
13600 63 6f 6c 75 6d 6e 20 6f 66 20 65 61 63 68 20 64  column of each d
13610 6f 63 75 6d 65 6e 74 2e 20 49 74 20 6d 61 79 20  ocument. It may 
13620 62 65 20 72 65 67 69 73 74 65 72 65 64 0a 20 20  be registered.  
13630 77 69 74 68 20 53 51 4c 69 74 65 20 6c 69 6b 65  with SQLite like
13640 20 61 6e 79 20 6f 74 68 65 72 20 75 73 65 72 20   any other user 
13650 66 75 6e 63 74 69 6f 6e 20 75 73 69 6e 67 20 5c  function using \
13660 5b 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f  [sqlite3_create_
13670 66 75 6e 63 74 69 6f 6e 28 29 5c 5d 2e 0a 0a 5b  function()\]...[
13680 43 6f 64 65 20 5b 73 74 72 69 6e 67 20 6d 61 70  Code [string map
13690 20 7b 5b 20 26 23 78 35 42 3b 20 5d 20 26 23 78   {[ &#x5B; ] &#x
136a0 35 44 3b 7d 20 7b 0a 3c 69 3e 2f 2a 3c 2f 69 3e  5D;} {.<i>/*</i>
136b0 0a 3c 69 3e 2a 2a 20 53 51 4c 69 74 65 20 75 73  .<i>** SQLite us
136c0 65 72 20 64 65 66 69 6e 65 64 20 66 75 6e 63 74  er defined funct
136d0 69 6f 6e 20 74 6f 20 75 73 65 20 77 69 74 68 20  ion to use with 
136e0 6d 61 74 63 68 69 6e 66 6f 28 29 20 74 6f 20 63  matchinfo() to c
136f0 61 6c 63 75 6c 61 74 65 20 74 68 65 3c 2f 69 3e  alculate the</i>
13700 0a 3c 69 3e 2a 2a 20 72 65 6c 65 76 61 6e 63 79  .<i>** relevancy
13710 20 6f 66 20 61 6e 20 46 54 53 33 20 6d 61 74 63   of an FTS3 matc
13720 68 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  h. The value ret
13730 75 72 6e 65 64 20 69 73 20 74 68 65 20 72 65 6c  urned is the rel
13740 65 76 61 6e 63 79 20 73 63 6f 72 65 3c 2f 69 3e  evancy score</i>
13750 0a 3c 69 3e 2a 2a 20 28 61 20 72 65 61 6c 20 76  .<i>** (a real v
13760 61 6c 75 65 20 67 72 65 61 74 65 72 20 74 68 61  alue greater tha
13770 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65  n or equal to ze
13780 72 6f 29 2e 20 41 20 6c 61 72 67 65 72 20 76 61  ro). A larger va
13790 6c 75 65 20 69 6e 64 69 63 61 74 65 73 20 3c 2f  lue indicates </
137a0 69 3e 0a 3c 69 3e 2a 2a 20 61 20 6d 6f 72 65 20  i>.<i>** a more 
137b0 72 65 6c 65 76 61 6e 74 20 64 6f 63 75 6d 65 6e  relevant documen
137c0 74 2e 3c 2f 69 3e 0a 3c 69 3e 2a 2a 3c 2f 69 3e  t.</i>.<i>**</i>
137d0 0a 3c 69 3e 2a 2a 20 54 68 65 20 6f 76 65 72 61  .<i>** The overa
137e0 6c 6c 20 72 65 6c 65 76 61 6e 63 79 20 72 65 74  ll relevancy ret
137f0 75 72 6e 65 64 20 69 73 20 74 68 65 20 73 75 6d  urned is the sum
13800 20 6f 66 20 74 68 65 20 72 65 6c 65 76 61 6e 63   of the relevanc
13810 69 65 73 20 6f 66 20 65 61 63 68 20 3c 2f 69 3e  ies of each </i>
13820 0a 3c 69 3e 2a 2a 20 63 6f 6c 75 6d 6e 20 76 61  .<i>** column va
13830 6c 75 65 20 69 6e 20 74 68 65 20 46 54 53 33 20  lue in the FTS3 
13840 74 61 62 6c 65 2e 20 54 68 65 20 72 65 6c 65 76  table. The relev
13850 61 6e 63 79 20 6f 66 20 61 20 63 6f 6c 75 6d 6e  ancy of a column
13860 20 76 61 6c 75 65 20 69 73 20 74 68 65 3c 2f 69   value is the</i
13870 3e 0a 3c 69 3e 2a 2a 20 73 75 6d 20 6f 66 20 74  >.<i>** sum of t
13880 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72  he following for
13890 20 65 61 63 68 20 72 65 70 6f 72 74 61 62 6c 65   each reportable
138a0 20 70 68 72 61 73 65 20 69 6e 20 74 68 65 20 46   phrase in the F
138b0 54 53 33 20 71 75 65 72 79 3a 3c 2f 69 3e 0a 3c  TS3 query:</i>.<
138c0 69 3e 2a 2a 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 20  i>**</i>.<i>**  
138d0 20 28 26 6c 74 3b 68 69 74 20 63 6f 75 6e 74 26   (&lt;hit count&
138e0 67 74 3b 20 2f 20 26 6c 74 3b 67 6c 6f 62 61 6c  gt; / &lt;global
138f0 20 68 69 74 20 63 6f 75 6e 74 26 67 74 29 20 2a   hit count&gt) *
13900 20 26 6c 74 3b 63 6f 6c 75 6d 6e 20 77 65 69 67   &lt;column weig
13910 68 74 26 67 74 3b 3c 2f 69 3e 0a 3c 69 3e 2a 2a  ht&gt;</i>.<i>**
13920 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 77 68 65 72 65  </i>.<i>** where
13930 20 26 6c 74 3b 68 69 74 20 63 6f 75 6e 74 26 67   &lt;hit count&g
13940 74 3b 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  t; is the number
13950 20 6f 66 20 69 6e 73 74 61 6e 63 65 73 20 6f 66   of instances of
13960 20 74 68 65 20 70 68 72 61 73 65 20 69 6e 20 74   the phrase in t
13970 68 65 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 63 6f 6c  he</i>.<i>** col
13980 75 6d 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 65  umn value of the
13990 20 63 75 72 72 65 6e 74 20 72 6f 77 20 61 6e 64   current row and
139a0 20 26 6c 74 3b 67 6c 6f 62 61 6c 20 68 69 74 20   &lt;global hit 
139b0 63 6f 75 6e 74 26 67 74 3b 20 69 73 20 74 68 65  count&gt; is the
139c0 20 6e 75 6d 62 65 72 3c 2f 69 3e 0a 3c 69 3e 2a   number</i>.<i>*
139d0 2a 20 6f 66 20 69 6e 73 74 61 6e 63 65 73 20 6f  * of instances o
139e0 66 20 74 68 65 20 70 68 72 61 73 65 20 69 6e 20  f the phrase in 
139f0 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20  the same column 
13a00 6f 66 20 61 6c 6c 20 72 6f 77 73 20 69 6e 20 74  of all rows in t
13a10 68 65 20 46 54 53 33 3c 2f 69 3e 0a 3c 69 3e 2a  he FTS3</i>.<i>*
13a20 2a 20 74 61 62 6c 65 2e 20 54 68 65 20 26 6c 74  * table. The &lt
13a30 3b 63 6f 6c 75 6d 6e 20 77 65 69 67 68 74 26 67  ;column weight&g
13a40 74 3b 20 69 73 20 61 20 77 65 69 67 68 74 69 6e  t; is a weightin
13a50 67 20 66 61 63 74 6f 72 20 61 73 73 69 67 6e 65  g factor assigne
13a60 64 20 74 6f 20 65 61 63 68 3c 2f 69 3e 0a 3c 69  d to each</i>.<i
13a70 3e 2a 2a 20 63 6f 6c 75 6d 6e 20 62 79 20 74 68  >** column by th
13a80 65 20 63 61 6c 6c 65 72 20 28 73 65 65 20 62 65  e caller (see be
13a90 6c 6f 77 29 2e 3c 2f 69 3e 0a 3c 69 3e 2a 2a 3c  low).</i>.<i>**<
13aa0 2f 69 3e 0a 3c 69 3e 2a 2a 20 54 68 65 20 66 69  /i>.<i>** The fi
13ab0 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
13ac0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75  this function mu
13ad0 73 74 20 62 65 20 74 68 65 20 72 65 74 75 72 6e  st be the return
13ae0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 46 54   value of the FT
13af0 53 33 20 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 6d 61  S3 </i>.<i>** ma
13b00 74 63 68 69 6e 66 6f 28 29 20 66 75 6e 63 74 69  tchinfo() functi
13b10 6f 6e 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20 74 68  on. Following th
13b20 69 73 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 61  is must be one a
13b30 72 67 75 6d 65 6e 74 20 66 6f 72 20 65 61 63 68  rgument for each
13b40 20 63 6f 6c 75 6d 6e 20 3c 2f 69 3e 0a 3c 69 3e   column </i>.<i>
13b50 2a 2a 20 6f 66 20 74 68 65 20 46 54 53 33 20 74  ** of the FTS3 t
13b60 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  able containing 
13b70 61 20 6e 75 6d 65 72 69 63 20 77 65 69 67 68 74  a numeric weight
13b80 20 66 61 63 74 6f 72 20 66 6f 72 20 74 68 65 20   factor for the 
13b90 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 3c 2f  corresponding </
13ba0 69 3e 0a 3c 69 3e 2a 2a 20 63 6f 6c 75 6d 6e 2e  i>.<i>** column.
13bb0 20 45 78 61 6d 70 6c 65 3a 3c 2f 69 3e 0a 3c 69   Example:</i>.<i
13bc0 3e 2a 2a 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 20 20  >**</i>.<i>**   
13bd0 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c    CREATE VIRTUAL
13be0 20 54 41 42 4c 45 20 64 6f 63 75 6d 65 6e 74 73   TABLE documents
13bf0 20 55 53 49 4e 47 20 66 74 73 33 28 74 69 74 6c   USING fts3(titl
13c00 65 2c 20 63 6f 6e 74 65 6e 74 29 3c 2f 69 3e 0a  e, content)</i>.
13c10 3c 69 3e 2a 2a 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20  <i>**</i>.<i>** 
13c20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75  The following qu
13c30 65 72 79 20 72 65 74 75 72 6e 73 20 74 68 65 20  ery returns the 
13c40 64 6f 63 69 64 73 20 6f 66 20 64 6f 63 75 6d 65  docids of docume
13c50 6e 74 73 20 74 68 61 74 20 6d 61 74 63 68 20 74  nts that match t
13c60 68 65 20 66 75 6c 6c 2d 74 65 78 74 3c 2f 69 3e  he full-text</i>
13c70 0a 3c 69 3e 2a 2a 20 71 75 65 72 79 20 26 6c 74  .<i>** query &lt
13c80 3b 71 75 65 72 79 26 67 74 3b 20 73 6f 72 74 65  ;query&gt; sorte
13c90 64 20 66 72 6f 6d 20 6d 6f 73 74 20 74 6f 20 6c  d from most to l
13ca0 65 61 73 74 20 72 65 6c 65 76 61 6e 74 2e 20 57  east relevant. W
13cb0 68 65 6e 20 63 61 6c 63 75 6c 61 74 69 6e 67 3c  hen calculating<
13cc0 2f 69 3e 0a 3c 69 3e 2a 2a 20 72 65 6c 65 76 61  /i>.<i>** releva
13cd0 6e 63 65 2c 20 71 75 65 72 79 20 74 65 72 6d 20  nce, query term 
13ce0 69 6e 73 74 61 6e 63 65 73 20 69 6e 20 74 68 65  instances in the
13cf0 20 27 74 69 74 6c 65 27 20 63 6f 6c 75 6d 6e 20   'title' column 
13d00 61 72 65 20 67 69 76 65 6e 20 74 77 69 63 65 20  are given twice 
13d10 74 68 65 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 77 65  the</i>.<i>** we
13d20 69 67 68 74 69 6e 67 20 6f 66 20 74 68 6f 73 65  ighting of those
13d30 20 69 6e 20 74 68 65 20 27 63 6f 6e 74 65 6e 74   in the 'content
13d40 27 20 63 6f 6c 75 6d 6e 2e 3c 2f 69 3e 0a 3c 69  ' column.</i>.<i
13d50 3e 2a 2a 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 20 20  >**</i>.<i>**   
13d60 20 20 53 45 4c 45 43 54 20 64 6f 63 69 64 20 46    SELECT docid F
13d70 52 4f 4d 20 64 6f 63 75 6d 65 6e 74 73 20 3c 2f  ROM documents </
13d80 69 3e 0a 3c 69 3e 2a 2a 20 20 20 20 20 57 48 45  i>.<i>**     WHE
13d90 52 45 20 64 6f 63 75 6d 65 6e 74 73 20 4d 41 54  RE documents MAT
13da0 43 48 20 26 6c 74 3b 71 75 65 72 79 26 67 74 3b  CH &lt;query&gt;
13db0 20 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 20 20 20 20   </i>.<i>**     
13dc0 4f 52 44 45 52 20 42 59 20 72 61 6e 6b 28 6d 61  ORDER BY rank(ma
13dd0 74 63 68 69 6e 66 6f 28 64 6f 63 75 6d 65 6e 74  tchinfo(document
13de0 73 29 2c 20 31 2e 30 2c 20 30 2e 35 29 20 44 45  s), 1.0, 0.5) DE
13df0 53 43 3c 2f 69 3e 0a 3c 69 3e 2a 2f 3c 2f 69 3e  SC</i>.<i>*/</i>
13e00 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 61 6e  .static void ran
13e10 6b 66 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  kfunc(sqlite3_co
13e20 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 69 6e 74  ntext *pCtx, int
13e30 20 6e 56 61 6c 2c 20 73 71 6c 69 74 65 33 5f 76   nVal, sqlite3_v
13e40 61 6c 75 65 20 2a 2a 61 70 56 61 6c 29 7b 0a 20  alue **apVal){. 
13e50 20 69 6e 74 20 2a 61 4d 61 74 63 68 69 6e 66 6f   int *aMatchinfo
13e60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13e70 20 3c 69 3e 2f 2a 20 52 65 74 75 72 6e 20 76 61   <i>/* Return va
13e80 6c 75 65 20 6f 66 20 6d 61 74 63 68 69 6e 66 6f  lue of matchinfo
13e90 28 29 20 2a 2f 3c 2f 69 3e 0a 20 20 69 6e 74 20  () */</i>.  int 
13ea0 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  nCol;           
13eb0 20 20 20 20 20 20 20 20 20 20 20 20 3c 69 3e 2f              <i>/
13ec0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
13ed0 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  mns in the table
13ee0 20 2a 2f 3c 2f 69 3e 0a 20 20 69 6e 74 20 6e 50   */</i>.  int nP
13ef0 68 72 61 73 65 3b 20 20 20 20 20 20 20 20 20 20  hrase;          
13f00 20 20 20 20 20 20 20 20 20 20 3c 69 3e 2f 2a 20            <i>/* 
13f10 4e 75 6d 62 65 72 20 6f 66 20 70 68 72 61 73 65  Number of phrase
13f20 73 20 69 6e 20 74 68 65 20 71 75 65 72 79 20 2a  s in the query *
13f30 2f 3c 2f 69 3e 0a 20 20 69 6e 74 20 69 50 68 72  /</i>.  int iPhr
13f40 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
13f50 20 20 20 20 20 20 20 20 3c 69 3e 2f 2a 20 43 75          <i>/* Cu
13f60 72 72 65 6e 74 20 70 68 72 61 73 65 20 2a 2f 3c  rrent phrase */<
13f70 2f 69 3e 0a 20 20 64 6f 75 62 6c 65 20 73 63 6f  /i>.  double sco
13f80 72 65 20 3d 20 30 2e 30 3b 20 20 20 20 20 20 20  re = 0.0;       
13f90 20 20 20 20 20 20 3c 69 3e 2f 2a 20 56 61 6c 75        <i>/* Valu
13fa0 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 3c 2f  e to return */</
13fb0 69 3e 0a 0a 20 20 61 73 73 65 72 74 28 20 73 69  i>..  assert( si
13fc0 7a 65 6f 66 28 69 6e 74 29 3d 3d 34 20 29 3b 0a  zeof(int)==4 );.
13fd0 0a 3c 69 3e 20 20 2f 2a 20 43 68 65 63 6b 20 74  .<i>  /* Check t
13fe0 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hat the number o
13ff0 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73  f arguments pass
14000 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ed to this funct
14010 69 6f 6e 20 69 73 20 63 6f 72 72 65 63 74 2e 3c  ion is correct.<
14020 2f 69 3e 0a 3c 69 3e 20 20 2a 2a 20 49 66 20 6e  /i>.<i>  ** If n
14030 6f 74 2c 20 6a 75 6d 70 20 74 6f 20 77 72 6f 6e  ot, jump to wron
14040 67 5f 6e 75 6d 62 65 72 5f 61 72 67 73 2e 20 53  g_number_args. S
14050 65 74 20 61 4d 61 74 63 68 69 6e 66 6f 20 74 6f  et aMatchinfo to
14060 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 61 72   point to the ar
14070 72 61 79 3c 2f 69 3e 0a 3c 69 3e 20 20 2a 2a 20  ray</i>.<i>  ** 
14080 6f 66 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65  of unsigned inte
14090 67 65 72 20 76 61 6c 75 65 73 20 72 65 74 75 72  ger values retur
140a0 6e 65 64 20 62 79 20 46 54 53 33 20 66 75 6e 63  ned by FTS3 func
140b0 74 69 6f 6e 20 6d 61 74 63 68 69 6e 66 6f 2e 20  tion matchinfo. 
140c0 53 65 74 3c 2f 69 3e 0a 3c 69 3e 20 20 2a 2a 20  Set</i>.<i>  ** 
140d0 6e 50 68 72 61 73 65 20 74 6f 20 63 6f 6e 74 61  nPhrase to conta
140e0 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  in the number of
140f0 20 72 65 70 6f 72 74 61 62 6c 65 20 70 68 72 61   reportable phra
14100 73 65 73 20 69 6e 20 74 68 65 20 75 73 65 72 73  ses in the users
14110 20 66 75 6c 6c 2d 74 65 78 74 3c 2f 69 3e 0a 3c   full-text</i>.<
14120 69 3e 20 20 2a 2a 20 71 75 65 72 79 2c 20 61 6e  i>  ** query, an
14130 64 20 6e 43 6f 6c 20 74 6f 20 74 68 65 20 6e 75  d nCol to the nu
14140 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
14150 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 3c 2f 69  in the table.</i
14160 3e 0a 3c 69 3e 20 20 2a 2f 3c 2f 69 3e 0a 20 20  >.<i>  */</i>.  
14170 69 66 28 20 6e 56 61 6c 26 6c 74 3b 31 20 29 20  if( nVal&lt;1 ) 
14180 67 6f 74 6f 20 77 72 6f 6e 67 5f 6e 75 6d 62 65  goto wrong_numbe
14190 72 5f 61 72 67 73 3b 0a 20 20 61 4d 61 74 63 68  r_args;.  aMatch
141a0 69 6e 66 6f 20 3d 20 28 75 6e 73 69 67 6e 65 64  info = (unsigned
141b0 20 69 6e 74 20 2a 29 73 71 6c 69 74 65 33 5f 76   int *)sqlite3_v
141c0 61 6c 75 65 5f 62 6c 6f 62 28 61 70 56 61 6c 5b  alue_blob(apVal[
141d0 30 5d 29 3b 0a 20 20 6e 50 68 72 61 73 65 20 3d  0]);.  nPhrase =
141e0 20 61 4d 61 74 63 68 69 6e 66 6f 5b 30 5d 3b 0a   aMatchinfo[0];.
141f0 20 20 6e 43 6f 6c 20 3d 20 61 4d 61 74 63 68 69    nCol = aMatchi
14200 6e 66 6f 5b 31 5d 3b 0a 20 20 69 66 28 20 6e 56  nfo[1];.  if( nV
14210 61 6c 21 3d 28 31 2b 6e 43 6f 6c 29 20 29 20 67  al!=(1+nCol) ) g
14220 6f 74 6f 20 77 72 6f 6e 67 5f 6e 75 6d 62 65 72  oto wrong_number
14230 5f 61 72 67 73 3b 0a 0a 3c 69 3e 20 20 2f 2a 20  _args;..<i>  /* 
14240 49 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  Iterate through 
14250 65 61 63 68 20 70 68 72 61 73 65 20 69 6e 20 74  each phrase in t
14260 68 65 20 75 73 65 72 73 20 71 75 65 72 79 2e 20  he users query. 
14270 2a 2f 3c 2f 69 3e 0a 20 20 66 6f 72 28 69 50 68  */</i>.  for(iPh
14280 72 61 73 65 3d 30 3b 20 69 50 68 72 61 73 65 26  rase=0; iPhrase&
14290 6c 74 3b 6e 50 68 72 61 73 65 3b 20 69 50 68 72  lt;nPhrase; iPhr
142a0 61 73 65 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ase++){.    int 
142b0 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  iCol;           
142c0 20 20 20 20 20 20 20 20 20 20 3c 69 3e 2f 2a 20            <i>/* 
142d0 43 75 72 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 2a  Current column *
142e0 2f 3c 2f 69 3e 0a 0a 3c 69 3e 20 20 20 20 2f 2a  /</i>..<i>    /*
142f0 20 4e 6f 77 20 69 74 65 72 61 74 65 20 74 68 72   Now iterate thr
14300 6f 75 67 68 20 65 61 63 68 20 63 6f 6c 75 6d 6e  ough each column
14310 20 69 6e 20 74 68 65 20 75 73 65 72 73 20 71 75   in the users qu
14320 65 72 79 2e 20 46 6f 72 20 65 61 63 68 20 63 6f  ery. For each co
14330 6c 75 6d 6e 2c 3c 2f 69 3e 0a 3c 69 3e 20 20 20  lumn,</i>.<i>   
14340 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 20 74 68   ** increment th
14350 65 20 72 65 6c 65 76 61 6e 63 79 20 73 63 6f 72  e relevancy scor
14360 65 20 62 79 3a 3c 2f 69 3e 0a 3c 69 3e 20 20 20  e by:</i>.<i>   
14370 20 2a 2a 3c 2f 69 3e 0a 3c 69 3e 20 20 20 20 2a   **</i>.<i>    *
14380 2a 20 20 20 28 26 6c 74 3b 68 69 74 20 63 6f 75  *   (&lt;hit cou
14390 6e 74 26 67 74 3b 20 2f 20 26 6c 74 3b 67 6c 6f  nt&gt; / &lt;glo
143a0 62 61 6c 20 68 69 74 20 63 6f 75 6e 74 26 67 74  bal hit count&gt
143b0 29 20 2a 20 26 6c 74 3b 63 6f 6c 75 6d 6e 20 77  ) * &lt;column w
143c0 65 69 67 68 74 26 67 74 3b 3c 2f 69 3e 0a 3c 69  eight&gt;</i>.<i
143d0 3e 20 20 20 20 2a 2a 3c 2f 69 3e 0a 3c 69 3e 20  >    **</i>.<i> 
143e0 20 20 20 2a 2a 20 61 50 68 72 61 73 65 69 6e 66     ** aPhraseinf
143f0 6f 5b 5d 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  o[] points to th
14400 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 64  e start of the d
14410 61 74 61 20 66 6f 72 20 70 68 72 61 73 65 20 69  ata for phrase i
14420 50 68 72 61 73 65 2e 20 53 6f 3c 2f 69 3e 0a 3c  Phrase. So</i>.<
14430 69 3e 20 20 20 20 2a 2a 20 74 68 65 20 68 69 74  i>    ** the hit
14440 20 63 6f 75 6e 74 20 61 6e 64 20 67 6c 6f 62 61   count and globa
14450 6c 20 68 69 74 20 63 6f 75 6e 74 73 20 66 6f 72  l hit counts for
14460 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 61 72 65   each column are
14470 20 66 6f 75 6e 64 20 69 6e 20 3c 2f 69 3e 0a 3c   found in </i>.<
14480 69 3e 20 20 20 20 2a 2a 20 61 50 68 72 61 73 65  i>    ** aPhrase
14490 69 6e 66 6f 5b 69 43 6f 6c 2a 33 5d 20 61 6e 64  info[iCol*3] and
144a0 20 61 50 68 72 61 73 65 69 6e 66 6f 5b 69 43 6f   aPhraseinfo[iCo
144b0 6c 2a 33 2b 31 5d 2c 20 72 65 73 70 65 63 74 69  l*3+1], respecti
144c0 76 65 6c 79 2e 3c 2f 69 3e 0a 3c 69 3e 20 20 20  vely.</i>.<i>   
144d0 20 2a 2f 3c 2f 69 3e 0a 20 20 20 20 69 6e 74 20   */</i>.    int 
144e0 2a 61 50 68 72 61 73 65 69 6e 66 6f 20 3d 20 26  *aPhraseinfo = &
144f0 61 4d 61 74 63 68 69 6e 66 6f 5b 32 20 2b 20 69  aMatchinfo[2 + i
14500 50 68 72 61 73 65 2a 6e 43 6f 6c 2a 33 5d 3b 0a  Phrase*nCol*3];.
14510 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20      for(iCol=0; 
14520 69 43 6f 6c 26 6c 74 3b 6e 43 6f 6c 3b 20 69 43  iCol&lt;nCol; iC
14530 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74  ol++){.      int
14540 20 6e 48 69 74 43 6f 75 6e 74 20 3d 20 61 50 68   nHitCount = aPh
14550 72 61 73 65 69 6e 66 6f 5b 33 2a 69 43 6f 6c 5d  raseinfo[3*iCol]
14560 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 47 6c 6f  ;.      int nGlo
14570 62 61 6c 48 69 74 43 6f 75 6e 74 20 3d 20 61 50  balHitCount = aP
14580 68 72 61 73 65 69 6e 66 6f 5b 33 2a 69 43 6f 6c  hraseinfo[3*iCol
14590 2b 31 5d 3b 0a 20 20 20 20 20 20 64 6f 75 62 6c  +1];.      doubl
145a0 65 20 77 65 69 67 68 74 20 3d 20 73 71 6c 69 74  e weight = sqlit
145b0 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28  e3_value_double(
145c0 61 70 56 61 6c 5b 69 43 6f 6c 2b 31 5d 29 3b 0a  apVal[iCol+1]);.
145d0 20 20 20 20 20 20 69 66 28 20 6e 48 69 74 43 6f        if( nHitCo
145e0 75 6e 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  unt>0 ){.       
145f0 20 73 63 6f 72 65 20 2b 3d 20 28 28 64 6f 75 62   score += ((doub
14600 6c 65 29 6e 48 69 74 43 6f 75 6e 74 20 2f 20 28  le)nHitCount / (
14610 64 6f 75 62 6c 65 29 6e 47 6c 6f 62 61 6c 48 69  double)nGlobalHi
14620 74 43 6f 75 6e 74 29 20 2a 20 77 65 69 67 68 74  tCount) * weight
14630 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
14640 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 72    }..  sqlite3_r
14650 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 70 43 74  esult_double(pCt
14660 78 2c 20 73 63 6f 72 65 29 3b 0a 20 20 72 65 74  x, score);.  ret
14670 75 72 6e 3b 0a 0a 3c 69 3e 20 20 2f 2a 20 4a 75  urn;..<i>  /* Ju
14680 6d 70 20 68 65 72 65 20 69 66 20 74 68 65 20 77  mp here if the w
14690 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61  rong number of a
146a0 72 67 75 6d 65 6e 74 73 20 61 72 65 20 70 61 73  rguments are pas
146b0 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
146c0 74 69 6f 6e 20 2a 2f 3c 2f 69 3e 0a 77 72 6f 6e  tion */</i>.wron
146d0 67 5f 6e 75 6d 62 65 72 5f 61 72 67 73 3a 0a 20  g_number_args:. 
146e0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
146f0 65 72 72 6f 72 28 70 43 74 78 2c 20 22 77 72 6f  error(pCtx, "wro
14700 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  ng number of arg
14710 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63 74 69  uments to functi
14720 6f 6e 20 72 61 6e 6b 28 29 22 2c 20 2d 31 29 3b  on rank()", -1);
14730 0a 7d 0a 7d 5d 5d 0a 0a 7d 0a 0a                 .}.}]]..}..