Documentation Source Text

Hex Artifact Content
Login

Artifact dcf34692449c6dcf5f4fb8898a483b369eaf0958:


0000: 0a 3c 74 63 6c 3e 68 64 5f 6b 65 79 77 6f 72 64  .<tcl>hd_keyword
0010: 73 20 2a 66 74 73 33 20 46 54 53 33 20 7b 66 75  s *fts3 FTS3 {fu
0020: 6c 6c 2d 74 65 78 74 20 73 65 61 72 63 68 7d 3c  ll-text search}<
0030: 2f 74 63 6c 3e 0a 3c 74 69 74 6c 65 3e 53 51 4c  /tcl>.<title>SQL
0040: 69 74 65 20 46 54 53 33 20 61 6e 64 20 46 54 53  ite FTS3 and FTS
0050: 34 20 45 78 74 65 6e 73 69 6f 6e 73 3c 2f 74 69  4 Extensions</ti
0060: 74 6c 65 3e 0a 0a 3c 74 61 62 6c 65 5f 6f 66 5f  tle>..<table_of_
0070: 63 6f 6e 74 65 6e 74 73 3e 0a 0a 3c 68 32 20 73  contents>..<h2 s
0080: 74 79 6c 65 3d 22 6d 61 72 67 69 6e 2d 6c 65 66  tyle="margin-lef
0090: 74 3a 31 2e 30 65 6d 22 20 6e 6f 74 6f 63 3e 20  t:1.0em" notoc> 
00a0: 4f 76 65 72 76 69 65 77 3c 2f 68 32 3e 0a 0a 3c  Overview</h2>..<
00b0: 70 3e 0a 20 20 46 54 53 33 20 61 6e 64 20 46 54  p>.  FTS3 and FT
00c0: 53 34 20 61 72 65 20 61 6e 20 53 51 4c 69 74 65  S4 are an SQLite
00d0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d   virtual table m
00e0: 6f 64 75 6c 65 73 20 74 68 61 74 20 61 6c 6c 6f  odules that allo
00f0: 77 73 20 75 73 65 72 73 20 74 6f 20 70 65 72 66  ws users to perf
0100: 6f 72 6d 20 0a 20 20 66 75 6c 6c 2d 74 65 78 74  orm .  full-text
0110: 20 73 65 61 72 63 68 65 73 20 6f 6e 20 61 20 73   searches on a s
0120: 65 74 20 6f 66 20 64 6f 63 75 6d 65 6e 74 73 2e  et of documents.
0130: 20 54 68 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e   The most common
0140: 20 28 61 6e 64 20 65 66 66 65 63 74 69 76 65 29   (and effective)
0150: 20 0a 20 20 77 61 79 20 74 6f 20 64 65 73 63 72   .  way to descr
0160: 69 62 65 20 66 75 6c 6c 2d 74 65 78 74 20 73 65  ibe full-text se
0170: 61 72 63 68 65 73 20 69 73 20 22 77 68 61 74 20  arches is "what 
0180: 47 6f 6f 67 6c 65 2c 20 59 61 68 6f 6f 20 61 6e  Google, Yahoo an
0190: 64 20 41 6c 74 61 76 69 73 74 61 20 64 6f 0a 20  d Altavista do. 
01a0: 20 77 69 74 68 20 64 6f 63 75 6d 65 6e 74 73 20   with documents 
01b0: 70 6c 61 63 65 64 20 6f 6e 20 74 68 65 20 57 6f  placed on the Wo
01c0: 72 6c 64 20 57 69 64 65 20 57 65 62 22 2e 20 55  rld Wide Web". U
01d0: 73 65 72 73 20 69 6e 70 75 74 20 61 20 74 65 72  sers input a ter
01e0: 6d 2c 20 6f 72 20 73 65 72 69 65 73 20 0a 20 20  m, or series .  
01f0: 6f 66 20 74 65 72 6d 73 2c 20 70 65 72 68 61 70  of terms, perhap
0200: 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 61  s connected by a
0210: 20 62 69 6e 61 72 79 20 6f 70 65 72 61 74 6f 72   binary operator
0220: 20 6f 72 20 67 72 6f 75 70 65 64 20 74 6f 67 65   or grouped toge
0230: 74 68 65 72 20 69 6e 74 6f 20 61 20 0a 20 20 70  ther into a .  p
0240: 68 72 61 73 65 2c 20 61 6e 64 20 74 68 65 20 66  hrase, and the f
0250: 75 6c 6c 2d 74 65 78 74 20 71 75 65 72 79 20 73  ull-text query s
0260: 79 73 74 65 6d 20 66 69 6e 64 73 20 74 68 65 20  ystem finds the 
0270: 73 65 74 20 6f 66 20 64 6f 63 75 6d 65 6e 74 73  set of documents
0280: 20 74 68 61 74 20 62 65 73 74 20 0a 20 20 6d 61   that best .  ma
0290: 74 63 68 65 73 20 74 68 6f 73 65 20 74 65 72 6d  tches those term
02a0: 73 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 74 68  s considering th
02b0: 65 20 6f 70 65 72 61 74 6f 72 73 20 61 6e 64 20  e operators and 
02c0: 67 72 6f 75 70 69 6e 67 73 20 74 68 65 20 75 73  groupings the us
02d0: 65 72 20 68 61 73 20 0a 20 20 73 70 65 63 69 66  er has .  specif
02e0: 69 65 64 2e 20 54 68 69 73 20 61 72 74 69 63 6c  ied. This articl
02f0: 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  e describes the 
0300: 64 65 70 6c 6f 79 6d 65 6e 74 20 61 6e 64 20 75  deployment and u
0310: 73 61 67 65 20 6f 66 20 46 54 53 33 20 61 6e 64  sage of FTS3 and
0320: 20 46 54 53 34 2e 0a 0a 3c 70 3e 0a 20 20 46 54   FTS4...<p>.  FT
0330: 53 31 20 61 6e 64 20 46 54 53 32 20 61 72 65 20  S1 and FTS2 are 
0340: 6f 62 73 6f 6c 65 74 65 20 66 75 6c 6c 2d 74 65  obsolete full-te
0350: 78 74 20 73 65 61 72 63 68 20 6d 6f 64 75 6c 65  xt search module
0360: 73 20 66 6f 72 20 53 51 4c 69 74 65 2e 20 20 54  s for SQLite.  T
0370: 68 65 72 65 20 61 72 65 20 6b 6e 6f 77 6e 0a 20  here are known. 
0380: 20 69 73 73 75 65 73 20 77 69 74 68 20 74 68 65   issues with the
0390: 73 65 20 6f 6c 64 65 72 20 6d 6f 64 75 6c 65 73  se older modules
03a0: 20 61 6e 64 20 74 68 65 69 72 20 75 73 65 20 73   and their use s
03b0: 68 6f 75 6c 64 20 62 65 20 61 76 6f 69 64 65 64  hould be avoided
03c0: 2e 0a 20 20 50 6f 72 74 69 6f 6e 73 20 6f 66 20  ..  Portions of 
03d0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 46 54 53  the original FTS
03e0: 33 20 63 6f 64 65 20 77 65 72 65 20 63 6f 6e 74  3 code were cont
03f0: 72 69 62 75 74 65 64 20 74 6f 20 74 68 65 20 53  ributed to the S
0400: 51 4c 69 74 65 20 70 72 6f 6a 65 63 74 20 0a 20  QLite project . 
0410: 20 62 79 20 53 63 6f 74 74 20 48 65 73 73 20 6f   by Scott Hess o
0420: 66 20 3c 61 20 68 72 65 66 3d 22 68 74 74 70 3a  f <a href="http:
0430: 2f 2f 77 77 77 2e 67 6f 6f 67 6c 65 2e 63 6f 6d  //www.google.com
0440: 22 3e 47 6f 6f 67 6c 65 3c 2f 61 3e 2e 20 49 74  ">Google</a>. It
0450: 20 69 73 20 6e 6f 77 20 0a 20 20 64 65 76 65 6c   is now .  devel
0460: 6f 70 65 64 20 61 6e 64 20 6d 61 69 6e 74 61 69  oped and maintai
0470: 6e 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 53  ned as part of S
0480: 51 4c 69 74 65 2e 0a 0a 3c 68 31 3e 49 6e 74 72  QLite...<h1>Intr
0490: 6f 64 75 63 74 69 6f 6e 20 74 6f 20 46 54 53 33  oduction to FTS3
04a0: 20 61 6e 64 20 46 54 53 34 3c 2f 68 31 3e 0a 0a   and FTS4</h1>..
04b0: 3c 70 3e 0a 20 20 54 68 65 20 46 54 53 33 20 61  <p>.  The FTS3 a
04c0: 6e 64 20 46 54 53 34 20 65 78 74 65 6e 73 69 6f  nd FTS4 extensio
04d0: 6e 20 6d 6f 64 75 6c 65 73 20 61 6c 6c 6f 77 73  n modules allows
04e0: 20 75 73 65 72 73 20 74 6f 20 63 72 65 61 74 65   users to create
04f0: 20 73 70 65 63 69 61 6c 20 74 61 62 6c 65 73 20   special tables 
0500: 77 69 74 68 20 61 20 0a 20 20 62 75 69 6c 74 2d  with a .  built-
0510: 69 6e 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64  in full-text ind
0520: 65 78 20 28 68 65 72 65 61 66 74 65 72 20 22 46  ex (hereafter "F
0530: 54 53 20 74 61 62 6c 65 73 22 29 2e 20 54 68 65  TS tables"). The
0540: 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78   full-text index
0550: 0a 20 20 61 6c 6c 6f 77 73 20 74 68 65 20 75 73  .  allows the us
0560: 65 72 20 74 6f 20 65 66 66 69 63 69 65 6e 74 6c  er to efficientl
0570: 79 20 71 75 65 72 79 20 74 68 65 20 64 61 74 61  y query the data
0580: 62 61 73 65 20 66 6f 72 20 61 6c 6c 20 72 6f 77  base for all row
0590: 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 0a 20  s that contain. 
05a0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 77 6f 72   one or more wor
05b0: 64 73 20 28 68 65 72 65 61 66 74 65 72 20 22 74  ds (hereafter "t
05c0: 6f 6b 65 6e 73 22 29 2c 20 65 76 65 6e 20 69 66  okens"), even if
05d0: 20 74 68 65 20 74 61 62 6c 65 0a 20 20 63 6f 6e   the table.  con
05e0: 74 61 69 6e 73 20 6d 61 6e 79 20 6c 61 72 67 65  tains many large
05f0: 20 64 6f 63 75 6d 65 6e 74 73 2e 0a 0a 3c 70 3e   documents...<p>
0600: 0a 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  .  For example, 
0610: 69 66 20 65 61 63 68 20 6f 66 20 74 68 65 20 35  if each of the 5
0620: 31 37 34 33 30 20 64 6f 63 75 6d 65 6e 74 73 20  17430 documents 
0630: 69 6e 20 74 68 65 20 0a 20 20 22 3c 61 20 68 72  in the .  "<a hr
0640: 65 66 3d 22 68 74 74 70 3a 2f 2f 77 77 77 2e 63  ef="http://www.c
0650: 73 2e 63 6d 75 2e 65 64 75 2f 7e 65 6e 72 6f 6e  s.cmu.edu/~enron
0660: 2f 22 3e 45 6e 72 6f 6e 20 45 2d 4d 61 69 6c 20  /">Enron E-Mail 
0670: 44 61 74 61 73 65 74 3c 2f 61 3e 22 0a 20 20 69  Dataset</a>".  i
0680: 73 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  s inserted into 
0690: 62 6f 74 68 20 61 6e 20 46 54 53 20 74 61 62 6c  both an FTS tabl
06a0: 65 20 61 6e 64 20 61 6e 20 6f 72 64 69 6e 61 72  e and an ordinar
06b0: 79 20 53 51 4c 69 74 65 20 74 61 62 6c 65 0a 20  y SQLite table. 
06c0: 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74   created using t
06d0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 51 4c  he following SQL
06e0: 20 73 63 72 69 70 74 3a 0a 0a 3c 63 6f 64 65 62   script:..<codeb
06f0: 6c 6f 63 6b 3e 0a 20 20 43 52 45 41 54 45 20 56  lock>.  CREATE V
0700: 49 52 54 55 41 4c 20 54 41 42 4c 45 20 65 6e 72  IRTUAL TABLE enr
0710: 6f 6e 64 61 74 61 31 20 55 53 49 4e 47 20 66 74  ondata1 USING ft
0720: 73 33 28 63 6f 6e 74 65 6e 74 20 54 45 58 54 29  s3(content TEXT)
0730: 3b 20 20 20 20 20 2f 2a 20 46 54 53 33 20 74 61  ;     /* FTS3 ta
0740: 62 6c 65 20 2a 2f 0a 20 20 43 52 45 41 54 45 20  ble */.  CREATE 
0750: 54 41 42 4c 45 20 65 6e 72 6f 6e 64 61 74 61 32  TABLE enrondata2
0760: 28 63 6f 6e 74 65 6e 74 20 54 45 58 54 29 3b 20  (content TEXT); 
0770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0780: 20 20 20 20 20 20 20 2f 2a 20 4f 72 64 69 6e 61         /* Ordina
0790: 72 79 20 74 61 62 6c 65 20 2a 2f 0a 3c 2f 63 6f  ry table */.</co
07a0: 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20  deblock>..<p>.  
07b0: 54 68 65 6e 20 65 69 74 68 65 72 20 6f 66 20 74  Then either of t
07c0: 68 65 20 74 77 6f 20 71 75 65 72 69 65 73 20 62  he two queries b
07d0: 65 6c 6f 77 20 6d 61 79 20 62 65 20 65 78 65 63  elow may be exec
07e0: 75 74 65 64 20 74 6f 20 66 69 6e 64 20 74 68 65  uted to find the
07f0: 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 64 6f 63   number of.  doc
0800: 75 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 64 61  uments in the da
0810: 74 61 62 61 73 65 20 74 68 61 74 20 63 6f 6e 74  tabase that cont
0820: 61 69 6e 20 74 68 65 20 77 6f 72 64 20 22 6c 69  ain the word "li
0830: 6e 75 78 22 20 28 33 35 31 29 2e 20 55 73 69 6e  nux" (351). Usin
0840: 67 20 6f 6e 65 0a 20 20 64 65 73 6b 74 6f 70 20  g one.  desktop 
0850: 50 43 20 68 61 72 64 77 61 72 65 20 63 6f 6e 66  PC hardware conf
0860: 69 67 75 72 61 74 69 6f 6e 2c 20 74 68 65 20 71  iguration, the q
0870: 75 65 72 79 20 6f 6e 20 74 68 65 20 46 54 53 33  uery on the FTS3
0880: 20 74 61 62 6c 65 20 72 65 74 75 72 6e 73 20 69   table returns i
0890: 6e 0a 20 20 61 70 70 72 6f 78 69 6d 61 74 65 6c  n.  approximatel
08a0: 79 20 30 2e 30 33 20 73 65 63 6f 6e 64 73 2c 20  y 0.03 seconds, 
08b0: 76 65 72 73 75 73 20 32 32 2e 35 20 66 6f 72 20  versus 22.5 for 
08c0: 71 75 65 72 79 69 6e 67 20 74 68 65 20 6f 72 64  querying the ord
08d0: 69 6e 61 72 79 20 74 61 62 6c 65 2e 0a 0a 3c 63  inary table...<c
08e0: 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 53 45 4c 45  odeblock>.  SELE
08f0: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
0900: 20 65 6e 72 6f 6e 64 61 74 61 31 20 57 48 45 52   enrondata1 WHER
0910: 45 20 63 6f 6e 74 65 6e 74 20 4d 41 54 43 48 20  E content MATCH 
0920: 27 6c 69 6e 75 78 27 3b 20 20 2f 2a 20 30 2e 30  'linux';  /* 0.0
0930: 33 20 73 65 63 6f 6e 64 73 20 2a 2f 0a 20 20 53  3 seconds */.  S
0940: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
0950: 52 4f 4d 20 65 6e 72 6f 6e 64 61 74 61 32 20 57  ROM enrondata2 W
0960: 48 45 52 45 20 63 6f 6e 74 65 6e 74 20 4c 49 4b  HERE content LIK
0970: 45 20 27 25 6c 69 6e 75 78 25 27 3b 20 2f 2a 20  E '%linux%'; /* 
0980: 32 32 2e 35 20 73 65 63 6f 6e 64 73 20 2a 2f 0a  22.5 seconds */.
0990: 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70  </codeblock>..<p
09a0: 3e 0a 20 20 4f 66 20 63 6f 75 72 73 65 2c 20 74  >.  Of course, t
09b0: 68 65 20 74 77 6f 20 71 75 65 72 69 65 73 20 61  he two queries a
09c0: 62 6f 76 65 20 61 72 65 20 6e 6f 74 20 65 6e 74  bove are not ent
09d0: 69 72 65 6c 79 20 65 71 75 69 76 61 6c 65 6e 74  irely equivalent
09e0: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 0a 20 20  . For example.  
09f0: 74 68 65 20 4c 49 4b 45 20 71 75 65 72 79 20 6d  the LIKE query m
0a00: 61 74 63 68 65 73 20 72 6f 77 73 20 74 68 61 74  atches rows that
0a10: 20 63 6f 6e 74 61 69 6e 20 74 65 72 6d 73 20 73   contain terms s
0a20: 75 63 68 20 61 73 20 22 6c 69 6e 75 78 6f 70 68  uch as "linuxoph
0a30: 6f 62 65 22 0a 20 20 6f 72 20 22 45 6e 74 65 72  obe".  or "Enter
0a40: 70 72 69 73 65 4c 69 6e 75 78 22 20 28 61 73 20  priseLinux" (as 
0a50: 69 74 20 68 61 70 70 65 6e 73 2c 20 74 68 65 20  it happens, the 
0a60: 45 6e 72 6f 6e 20 45 2d 4d 61 69 6c 20 44 61 74  Enron E-Mail Dat
0a70: 61 73 65 74 20 64 6f 65 73 20 6e 6f 74 0a 20 20  aset does not.  
0a80: 61 63 74 75 61 6c 6c 79 20 63 6f 6e 74 61 69 6e  actually contain
0a90: 20 61 6e 79 20 73 75 63 68 20 74 65 72 6d 73 29   any such terms)
0aa0: 2c 20 77 68 65 72 65 61 73 20 74 68 65 20 4d 41  , whereas the MA
0ab0: 54 43 48 20 71 75 65 72 79 20 6f 6e 20 74 68 65  TCH query on the
0ac0: 20 46 54 53 33 20 74 61 62 6c 65 0a 20 20 73 65   FTS3 table.  se
0ad0: 6c 65 63 74 73 20 6f 6e 6c 79 20 74 68 6f 73 65  lects only those
0ae0: 20 72 6f 77 73 20 74 68 61 74 20 63 6f 6e 74 61   rows that conta
0af0: 69 6e 20 22 6c 69 6e 75 78 22 20 61 73 20 61 20  in "linux" as a 
0b00: 64 69 73 63 72 65 74 65 20 74 6f 6b 65 6e 2e 20  discrete token. 
0b10: 42 6f 74 68 20 0a 20 20 73 65 61 72 63 68 65 73  Both .  searches
0b20: 20 61 72 65 20 63 61 73 65 2d 69 6e 73 65 6e 73   are case-insens
0b30: 69 74 69 76 65 2e 20 54 68 65 20 46 54 53 33 20  itive. The FTS3 
0b40: 74 61 62 6c 65 20 63 6f 6e 73 75 6d 65 73 20 61  table consumes a
0b50: 72 6f 75 6e 64 20 32 30 30 36 20 4d 42 20 6f 6e  round 2006 MB on
0b60: 0a 20 20 64 69 73 6b 20 63 6f 6d 70 61 72 65 64  .  disk compared
0b70: 20 74 6f 20 6a 75 73 74 20 31 34 35 33 20 4d 42   to just 1453 MB
0b80: 20 66 6f 72 20 74 68 65 20 6f 72 64 69 6e 61 72   for the ordinar
0b90: 79 20 74 61 62 6c 65 2e 20 55 73 69 6e 67 20 74  y table. Using t
0ba0: 68 65 20 73 61 6d 65 0a 20 20 68 61 72 64 77 61  he same.  hardwa
0bb0: 72 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  re configuration
0bc0: 20 75 73 65 64 20 74 6f 20 70 65 72 66 6f 72 6d   used to perform
0bd0: 20 74 68 65 20 53 45 4c 45 43 54 20 71 75 65 72   the SELECT quer
0be0: 69 65 73 20 61 62 6f 76 65 2c 20 74 68 65 20 46  ies above, the F
0bf0: 54 53 33 0a 20 20 74 61 62 6c 65 20 74 6f 6f 6b  TS3.  table took
0c00: 20 6a 75 73 74 20 75 6e 64 65 72 20 33 31 20 6d   just under 31 m
0c10: 69 6e 75 74 65 73 20 74 6f 20 70 6f 70 75 6c 61  inutes to popula
0c20: 74 65 2c 20 76 65 72 73 75 73 20 32 35 20 66 6f  te, versus 25 fo
0c30: 72 20 74 68 65 20 6f 72 64 69 6e 61 72 79 0a 20  r the ordinary. 
0c40: 20 74 61 62 6c 65 2e 0a 0a 3c 68 32 3e 44 69 66   table...<h2>Dif
0c50: 66 65 72 65 6e 63 65 73 20 62 65 74 77 65 65 6e  ferences between
0c60: 20 46 54 53 33 20 61 6e 64 20 46 54 53 34 3c 2f   FTS3 and FTS4</
0c70: 68 32 3e 0a 3c 74 63 6c 3e 68 64 5f 66 72 61 67  h2>.<tcl>hd_frag
0c80: 6d 65 6e 74 20 66 74 73 34 20 46 54 53 34 3c 2f  ment fts4 FTS4</
0c90: 74 63 6c 3e 0a 0a 3c 70 3e 0a 20 20 46 54 53 33  tcl>..<p>.  FTS3
0ca0: 20 61 6e 64 20 46 54 53 34 20 61 72 65 20 6e 65   and FTS4 are ne
0cb0: 61 72 6c 79 20 69 64 65 6e 74 69 63 61 6c 2e 20  arly identical. 
0cc0: 54 68 65 79 20 73 68 61 72 65 20 6d 6f 73 74 20  They share most 
0cd0: 6f 66 20 74 68 65 69 72 20 63 6f 64 65 20 69 6e  of their code in
0ce0: 20 63 6f 6d 6d 6f 6e 2c 0a 20 20 61 6e 64 20 74   common,.  and t
0cf0: 68 65 69 72 20 69 6e 74 65 72 66 61 63 65 73 20  heir interfaces 
0d00: 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 54 68  are the same. Th
0d10: 65 20 64 69 66 66 65 72 65 6e 63 65 73 20 61 72  e differences ar
0d20: 65 3a 0a 0a 3c 75 6c 3e 0a 20 20 3c 6c 69 3e 20  e:..<ul>.  <li> 
0d30: 3c 70 3e 46 54 53 34 20 63 6f 6e 74 61 69 6e 73  <p>FTS4 contains
0d40: 20 71 75 65 72 79 20 70 65 72 66 6f 72 6d 61 6e   query performan
0d50: 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  ce optimizations
0d60: 20 74 68 61 74 20 6d 61 79 20 73 69 67 6e 69 66   that may signif
0d70: 69 63 61 6e 74 6c 79 0a 20 20 20 20 20 20 20 69  icantly.       i
0d80: 6d 70 72 6f 76 65 20 74 68 65 20 70 65 72 66 6f  mprove the perfo
0d90: 72 6d 61 6e 63 65 20 6f 66 20 66 75 6c 6c 2d 74  rmance of full-t
0da0: 65 78 74 20 71 75 65 72 69 65 73 20 74 68 61 74  ext queries that
0db0: 20 63 6f 6e 74 61 69 6e 20 74 65 72 6d 73 20 74   contain terms t
0dc0: 68 61 74 20 61 72 65 0a 20 20 20 20 20 20 20 76  hat are.       v
0dd0: 65 72 79 20 63 6f 6d 6d 6f 6e 20 28 70 72 65 73  ery common (pres
0de0: 65 6e 74 20 69 6e 20 61 20 6c 61 72 67 65 20 70  ent in a large p
0df0: 65 72 63 65 6e 74 61 67 65 20 6f 66 20 74 61 62  ercentage of tab
0e00: 6c 65 20 72 6f 77 73 29 2e 0a 0a 20 20 3c 6c 69  le rows)...  <li
0e10: 3e 20 3c 70 3e 46 54 53 34 20 73 75 70 70 6f 72  > <p>FTS4 suppor
0e20: 74 73 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e  ts some addition
0e30: 61 6c 20 6f 70 74 69 6f 6e 73 20 74 68 61 74 20  al options that 
0e40: 6d 61 79 20 75 73 65 64 20 77 69 74 68 20 74 68  may used with th
0e50: 65 20 5b 6d 61 74 63 68 69 6e 66 6f 28 29 5d 0a  e [matchinfo()].
0e60: 20 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 2e         function.
0e70: 20 0a 0a 20 20 3c 6c 69 3e 20 3c 70 3e 42 65 63   ..  <li> <p>Bec
0e80: 61 75 73 65 20 69 74 20 73 74 6f 72 65 73 20 65  ause it stores e
0e90: 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  xtra information
0ea0: 20 6f 6e 20 64 69 73 6b 20 69 6e 20 74 77 6f 20   on disk in two 
0eb0: 6e 65 77 20 0a 20 20 20 20 20 20 20 5b 46 54 53  new .       [FTS
0ec0: 20 73 68 61 64 6f 77 20 74 61 62 6c 65 73 7c 73   shadow tables|s
0ed0: 68 61 64 6f 77 20 74 61 62 6c 65 73 5d 20 69 6e  hadow tables] in
0ee0: 20 6f 72 64 65 72 20 74 6f 20 73 75 70 70 6f 72   order to suppor
0ef0: 74 20 74 68 65 20 70 65 72 66 6f 72 6d 61 6e 63  t the performanc
0f00: 65 0a 20 20 20 20 20 20 20 6f 70 74 69 6d 69 7a  e.       optimiz
0f10: 61 74 69 6f 6e 73 20 61 6e 64 20 65 78 74 72 61  ations and extra
0f20: 20 6d 61 74 63 68 69 6e 66 6f 28 29 20 6f 70 74   matchinfo() opt
0f30: 69 6f 6e 73 2c 20 46 54 53 34 20 74 61 62 6c 65  ions, FTS4 table
0f40: 73 20 6d 61 79 20 63 6f 6e 73 75 6d 65 20 6d 6f  s may consume mo
0f50: 72 65 0a 20 20 20 20 20 20 20 64 69 73 6b 20 73  re.       disk s
0f60: 70 61 63 65 20 74 68 61 6e 20 74 68 65 20 65 71  pace than the eq
0f70: 75 69 76 61 6c 65 6e 74 20 74 61 62 6c 65 20 63  uivalent table c
0f80: 72 65 61 74 65 64 20 75 73 69 6e 67 20 46 54 53  reated using FTS
0f90: 33 2e 20 55 73 75 61 6c 6c 79 20 74 68 65 20 6f  3. Usually the o
0fa0: 76 65 72 68 65 61 64 0a 20 20 20 20 20 20 20 69  verhead.       i
0fb0: 73 20 31 2d 32 25 20 6f 72 20 6c 65 73 73 2c 20  s 1-2% or less, 
0fc0: 62 75 74 20 6d 61 79 20 62 65 20 61 73 20 68 69  but may be as hi
0fd0: 67 68 20 61 73 20 31 30 25 20 69 66 20 74 68 65  gh as 10% if the
0fe0: 20 64 6f 63 75 6d 65 6e 74 73 20 73 74 6f 72 65   documents store
0ff0: 64 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20  d in the.       
1000: 46 54 53 20 74 61 62 6c 65 20 61 72 65 20 76 65  FTS table are ve
1010: 72 79 20 73 6d 61 6c 6c 2e 20 54 68 65 20 6f 76  ry small. The ov
1020: 65 72 68 65 61 64 20 6d 61 79 20 62 65 20 72 65  erhead may be re
1030: 64 75 63 65 64 20 62 79 20 73 70 65 63 69 66 79  duced by specify
1040: 69 6e 67 20 74 68 65 0a 20 20 20 20 20 20 20 64  ing the.       d
1050: 69 72 65 63 74 69 76 65 20 5b 6d 61 74 63 68 69  irective [matchi
1060: 6e 66 6f 5f 66 74 73 33 7c 22 6d 61 74 63 68 69  nfo_fts3|"matchi
1070: 6e 66 6f 3d 66 74 73 33 22 5d 20 61 73 20 70 61  nfo=fts3"] as pa
1080: 72 74 20 6f 66 20 74 68 65 20 46 54 53 34 20 74  rt of the FTS4 t
1090: 61 62 6c 65 0a 20 20 20 20 20 20 20 64 65 63 6c  able.       decl
10a0: 61 72 61 74 69 6f 6e 2c 20 62 75 74 20 74 68 69  aration, but thi
10b0: 73 20 63 6f 6d 65 73 20 61 74 20 74 68 65 20 65  s comes at the e
10c0: 78 70 65 6e 73 65 20 6f 66 20 73 61 63 72 69 66  xpense of sacrif
10d0: 69 63 69 6e 67 20 73 6f 6d 65 20 6f 66 20 74 68  icing some of th
10e0: 65 0a 20 20 20 20 20 20 20 65 78 74 72 61 20 73  e.       extra s
10f0: 75 70 70 6f 72 74 65 64 20 6d 61 74 63 68 69 6e  upported matchin
1100: 66 6f 28 29 20 6f 70 74 69 6f 6e 73 2e 0a 0a 20  fo() options... 
1110: 20 3c 6c 69 3e 20 3c 70 3e 46 54 53 34 20 70 72   <li> <p>FTS4 pr
1120: 6f 76 69 64 65 73 20 68 6f 6f 6b 73 20 28 74 68  ovides hooks (th
1130: 65 20 63 6f 6d 70 72 65 73 73 20 61 6e 64 20 75  e compress and u
1140: 6e 63 6f 6d 70 72 65 73 73 20 0a 20 20 20 20 20  ncompress .     
1150: 20 20 5b 46 54 53 34 20 6f 70 74 69 6f 6e 73 7c    [FTS4 options|
1160: 6f 70 74 69 6f 6e 73 5d 29 20 61 6c 6c 6f 77 69  options]) allowi
1170: 6e 67 20 64 61 74 61 20 74 6f 20 62 65 20 73 74  ng data to be st
1180: 6f 72 65 64 20 69 6e 20 61 20 63 6f 6d 70 72 65  ored in a compre
1190: 73 73 65 64 20 0a 20 20 20 20 20 20 20 66 6f 72  ssed .       for
11a0: 6d 2c 20 72 65 64 75 63 69 6e 67 20 64 69 73 6b  m, reducing disk
11b0: 20 75 73 61 67 65 20 61 6e 64 20 49 4f 2e 0a 3c   usage and IO..<
11c0: 2f 75 6c 3e 0a 0a 3c 70 3e 0a 20 20 46 54 53 34  /ul>..<p>.  FTS4
11d0: 20 69 73 20 61 6e 20 65 6e 68 61 6e 63 65 6d 65   is an enhanceme
11e0: 6e 74 20 74 6f 20 46 54 53 33 2e 20 20 46 54 53  nt to FTS3.  FTS
11f0: 33 20 68 61 73 20 62 65 65 6e 20 61 76 61 69 6c  3 has been avail
1200: 61 62 6c 65 20 73 69 6e 63 65 20 53 51 4c 69 74  able since SQLit
1210: 65 20 5b 76 65 72 73 69 6f 6e 20 33 2e 35 2e 30  e [version 3.5.0
1220: 5d 20 69 6e 0a 20 20 32 30 30 37 2d 30 39 2d 30  ] in.  2007-09-0
1230: 34 2e 20 20 54 68 65 20 65 6e 68 61 6e 63 65 6d  4.  The enhancem
1240: 65 6e 74 73 20 66 6f 72 20 46 54 53 34 20 77 65  ents for FTS4 we
1250: 72 65 20 61 64 64 65 64 20 77 69 74 68 20 53 51  re added with SQ
1260: 4c 69 74 65 20 5b 76 65 72 73 69 6f 6e 20 33 2e  Lite [version 3.
1270: 37 2e 34 5d 20 6f 6e 20 32 30 31 30 2d 31 32 2d  7.4] on 2010-12-
1280: 30 38 2e 0a 0a 3c 70 3e 0a 20 20 57 68 69 63 68  08...<p>.  Which
1290: 20 6d 6f 64 75 6c 65 2c 20 46 54 53 33 20 6f 72   module, FTS3 or
12a0: 20 46 54 53 34 2c 20 73 68 6f 75 6c 64 20 79 6f   FTS4, should yo
12b0: 75 20 75 73 65 20 69 6e 20 79 6f 75 72 20 61 70  u use in your ap
12c0: 70 6c 69 63 61 74 69 6f 6e 3f 20 20 46 54 53 34  plication?  FTS4
12d0: 20 69 73 0a 20 20 73 6f 6d 65 74 69 6d 65 73 20   is.  sometimes 
12e0: 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 20 66 61  significantly fa
12f0: 73 74 65 72 20 74 68 61 6e 20 46 54 53 33 2c 20  ster than FTS3, 
1300: 65 76 65 6e 20 6f 72 64 65 72 73 20 6f 66 20 6d  even orders of m
1310: 61 67 6e 69 74 75 64 65 20 66 61 73 74 65 72 0a  agnitude faster.
1320: 20 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74    depending on t
1330: 68 65 20 71 75 65 72 79 2c 20 74 68 6f 75 67 68  he query, though
1340: 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   in the common c
1350: 61 73 65 20 74 68 65 20 70 65 72 66 6f 72 6d 61  ase the performa
1360: 6e 63 65 20 6f 66 20 74 68 65 20 74 77 6f 0a 20  nce of the two. 
1370: 20 6d 6f 64 75 6c 65 73 20 69 73 20 73 69 6d 69   modules is simi
1380: 6c 61 72 2e 20 46 54 53 34 20 61 6c 73 6f 20 6f  lar. FTS4 also o
1390: 66 66 65 72 73 20 74 68 65 20 65 6e 68 61 6e 63  ffers the enhanc
13a0: 65 64 20 5b 6d 61 74 63 68 69 6e 66 6f 28 29 5d  ed [matchinfo()]
13b0: 20 6f 75 74 70 75 74 73 20 77 68 69 63 68 0a 20   outputs which. 
13c0: 20 63 61 6e 20 62 65 20 75 73 65 66 75 6c 20 69   can be useful i
13d0: 6e 20 72 61 6e 6b 69 6e 67 20 74 68 65 20 72 65  n ranking the re
13e0: 73 75 6c 74 73 20 6f 66 20 61 20 5b 46 54 53 20  sults of a [FTS 
13f0: 4d 41 54 43 48 7c 4d 41 54 43 48 5d 20 6f 70 65  MATCH|MATCH] ope
1400: 72 61 74 69 6f 6e 2e 20 20 4f 6e 20 74 68 65 0a  ration.  On the.
1410: 20 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 6e    other hand, in
1420: 20 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20   the absence of 
1430: 61 20 5b 6d 61 74 63 68 69 6e 66 6f 5f 66 74 73  a [matchinfo_fts
1440: 33 7c 6d 61 74 63 68 69 6e 66 6f 3d 66 74 73 33  3|matchinfo=fts3
1450: 5d 20 64 69 72 65 63 74 69 76 65 20 46 54 53 34  ] directive FTS4
1460: 20 72 65 71 75 69 72 65 73 20 61 20 6c 69 74 74   requires a litt
1470: 6c 65 0a 20 20 6d 6f 72 65 20 64 69 73 6b 20 73  le.  more disk s
1480: 70 61 63 65 20 74 68 61 6e 20 46 54 53 33 2c 20  pace than FTS3, 
1490: 74 68 6f 75 67 68 20 6f 6e 6c 79 20 61 20 70 65  though only a pe
14a0: 72 63 65 6e 74 20 6f 66 20 74 77 6f 20 69 6e 20  rcent of two in 
14b0: 6d 6f 73 74 20 63 61 73 65 73 2e 0a 0a 3c 70 3e  most cases...<p>
14c0: 0a 20 20 46 6f 72 20 6e 65 77 65 72 20 61 70 70  .  For newer app
14d0: 6c 69 63 61 74 69 6f 6e 73 2c 20 46 54 53 34 20  lications, FTS4 
14e0: 69 73 20 72 65 63 6f 6d 6d 65 6e 64 65 64 3b 20  is recommended; 
14f0: 74 68 6f 75 67 68 20 69 66 20 63 6f 6d 70 61 74  though if compat
1500: 69 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c 64  ibility with old
1510: 65 72 20 0a 20 20 76 65 72 73 69 6f 6e 73 20 6f  er .  versions o
1520: 66 20 53 51 4c 69 74 65 20 69 73 20 69 6d 70 6f  f SQLite is impo
1530: 72 74 61 6e 74 2c 20 74 68 65 6e 20 46 54 53 33  rtant, then FTS3
1540: 20 77 69 6c 6c 20 75 73 75 61 6c 6c 79 20 73 65   will usually se
1550: 72 76 65 20 6a 75 73 74 20 61 73 20 77 65 6c 6c  rve just as well
1560: 2e 20 20 0a 0a 3c 68 32 3e 43 72 65 61 74 69 6e  .  ..<h2>Creatin
1570: 67 20 61 6e 64 20 44 65 73 74 72 6f 79 69 6e 67  g and Destroying
1580: 20 46 54 53 20 54 61 62 6c 65 73 3c 2f 68 32 3e   FTS Tables</h2>
1590: 0a 0a 3c 70 3e 0a 20 20 4c 69 6b 65 20 6f 74 68  ..<p>.  Like oth
15a0: 65 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  er virtual table
15b0: 20 74 79 70 65 73 2c 20 6e 65 77 20 46 54 53 20   types, new FTS 
15c0: 74 61 62 6c 65 73 20 61 72 65 20 63 72 65 61 74  tables are creat
15d0: 65 64 20 75 73 69 6e 67 20 61 20 0a 20 20 5b 43  ed using a .  [C
15e0: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
15f0: 42 4c 45 5d 20 73 74 61 74 65 6d 65 6e 74 2e 20  BLE] statement. 
1600: 54 68 65 20 6d 6f 64 75 6c 65 20 6e 61 6d 65 2c  The module name,
1610: 20 77 68 69 63 68 20 66 6f 6c 6c 6f 77 73 0a 20   which follows. 
1620: 20 74 68 65 20 55 53 49 4e 47 20 6b 65 79 77 6f   the USING keywo
1630: 72 64 2c 20 69 73 20 65 69 74 68 65 72 20 22 66  rd, is either "f
1640: 74 73 33 22 20 6f 72 20 22 66 74 73 34 22 2e 20  ts3" or "fts4". 
1650: 54 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  The virtual tabl
1660: 65 20 6d 6f 64 75 6c 65 20 61 72 67 75 6d 65 6e  e module argumen
1670: 74 73 20 6d 61 79 0a 20 20 62 65 20 6c 65 66 74  ts may.  be left
1680: 20 65 6d 70 74 79 2c 20 69 6e 20 77 68 69 63 68   empty, in which
1690: 20 63 61 73 65 20 61 6e 20 46 54 53 20 74 61 62   case an FTS tab
16a0: 6c 65 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65  le with a single
16b0: 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 0a 20   user-defined . 
16c0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 22 63   column named "c
16d0: 6f 6e 74 65 6e 74 22 20 69 73 20 63 72 65 61 74  ontent" is creat
16e0: 65 64 2e 20 41 6c 74 65 72 6e 61 74 69 76 65 6c  ed. Alternativel
16f0: 79 2c 20 74 68 65 20 6d 6f 64 75 6c 65 20 61 72  y, the module ar
1700: 67 75 6d 65 6e 74 73 0a 20 20 6d 61 79 20 62 65  guments.  may be
1710: 20 70 61 73 73 65 64 20 61 20 6c 69 73 74 20 6f   passed a list o
1720: 66 20 63 6f 6d 6d 61 20 73 65 70 61 72 61 74 65  f comma separate
1730: 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20  d column names. 
1740: 0a 0a 3c 70 3e 0a 20 20 49 66 20 63 6f 6c 75 6d  ..<p>.  If colum
1750: 6e 20 6e 61 6d 65 73 20 61 72 65 20 65 78 70 6c  n names are expl
1760: 69 63 69 74 6c 79 20 70 72 6f 76 69 64 65 64 20  icitly provided 
1770: 66 6f 72 20 74 68 65 20 46 54 53 20 74 61 62 6c  for the FTS tabl
1780: 65 20 61 73 20 70 61 72 74 20 6f 66 0a 20 20 74  e as part of.  t
1790: 68 65 20 43 52 45 41 54 45 20 56 49 52 54 55 41  he CREATE VIRTUA
17a0: 4c 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  L TABLE statemen
17b0: 74 2c 20 74 68 65 6e 20 61 20 64 61 74 61 74 79  t, then a dataty
17c0: 70 65 20 6e 61 6d 65 20 6d 61 79 20 62 65 20 6f  pe name may be o
17d0: 70 74 69 6f 6e 61 6c 6c 79 20 0a 20 20 73 70 65  ptionally .  spe
17e0: 63 69 66 69 65 64 20 66 6f 72 20 65 61 63 68 20  cified for each 
17f0: 63 6f 6c 75 6d 6e 2e 20 54 68 69 73 20 69 73 20  column. This is 
1800: 70 75 72 65 20 73 79 6e 74 61 63 74 69 63 20 73  pure syntactic s
1810: 75 67 61 72 2c 20 74 68 65 0a 20 20 73 75 70 70  ugar, the.  supp
1820: 6c 69 65 64 20 74 79 70 65 6e 61 6d 65 73 20 61  lied typenames a
1830: 72 65 20 6e 6f 74 20 75 73 65 64 20 62 79 20 46  re not used by F
1840: 54 53 20 6f 72 20 74 68 65 20 53 51 4c 69 74 65  TS or the SQLite
1850: 20 63 6f 72 65 20 66 6f 72 20 61 6e 79 0a 20 20   core for any.  
1860: 70 75 72 70 6f 73 65 2e 20 54 68 65 20 73 61 6d  purpose. The sam
1870: 65 20 61 70 70 6c 69 65 73 20 74 6f 20 61 6e 79  e applies to any
1880: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 73 70 65   constraints spe
1890: 63 69 66 69 65 64 20 61 6c 6f 6e 67 20 77 69 74  cified along wit
18a0: 68 20 61 6e 0a 20 20 46 54 53 20 63 6f 6c 75 6d  h an.  FTS colum
18b0: 6e 20 6e 61 6d 65 20 2d 20 74 68 65 79 20 61 72  n name - they ar
18c0: 65 20 70 61 72 73 65 64 20 62 75 74 20 6e 6f 74  e parsed but not
18d0: 20 75 73 65 64 20 6f 72 20 72 65 63 6f 72 64 65   used or recorde
18e0: 64 20 62 79 20 74 68 65 20 73 79 73 74 65 6d 0a  d by the system.
18f0: 20 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 0a 3c    in any way...<
1900: 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e  codeblock>.  <i>
1910: 2d 2d 20 43 72 65 61 74 65 20 61 6e 20 46 54 53  -- Create an FTS
1920: 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 22 64 61   table named "da
1930: 74 61 22 20 77 69 74 68 20 6f 6e 65 20 63 6f 6c  ta" with one col
1940: 75 6d 6e 20 2d 20 22 63 6f 6e 74 65 6e 74 22 3a  umn - "content":
1950: 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45 20 56 49  </i>.  CREATE VI
1960: 52 54 55 41 4c 20 54 41 42 4c 45 20 64 61 74 61  RTUAL TABLE data
1970: 20 55 53 49 4e 47 20 66 74 73 33 28 29 3b 0a 0a   USING fts3();..
1980: 20 20 3c 69 3e 2d 2d 20 43 72 65 61 74 65 20 61    <i>-- Create a
1990: 6e 20 46 54 53 20 74 61 62 6c 65 20 6e 61 6d 65  n FTS table name
19a0: 64 20 22 70 61 67 65 73 22 20 77 69 74 68 20 74  d "pages" with t
19b0: 68 72 65 65 20 63 6f 6c 75 6d 6e 73 3a 3c 2f 69  hree columns:</i
19c0: 3e 0a 20 20 43 52 45 41 54 45 20 56 49 52 54 55  >.  CREATE VIRTU
19d0: 41 4c 20 54 41 42 4c 45 20 70 61 67 65 73 20 55  AL TABLE pages U
19e0: 53 49 4e 47 20 66 74 73 34 28 74 69 74 6c 65 2c  SING fts4(title,
19f0: 20 6b 65 79 77 6f 72 64 73 2c 20 62 6f 64 79 29   keywords, body)
1a00: 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 43 72 65 61 74  ;..  <i>-- Creat
1a10: 65 20 61 6e 20 46 54 53 20 74 61 62 6c 65 20 6e  e an FTS table n
1a20: 61 6d 65 64 20 22 6d 61 69 6c 22 20 77 69 74 68  amed "mail" with
1a30: 20 74 77 6f 20 63 6f 6c 75 6d 6e 73 2e 20 44 61   two columns. Da
1a40: 74 61 74 79 70 65 73 0a 20 20 2d 2d 20 61 6e 64  tatypes.  -- and
1a50: 20 63 6f 6c 75 6d 6e 20 63 6f 6e 73 74 72 61 69   column constrai
1a60: 6e 74 73 20 61 72 65 20 73 70 65 63 69 66 69 65  nts are specifie
1a70: 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 65 61 63  d along with eac
1a80: 68 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 73 65 0a  h column. These.
1a90: 20 20 2d 2d 20 61 72 65 20 63 6f 6d 70 6c 65 74    -- are complet
1aa0: 65 6c 79 20 69 67 6e 6f 72 65 64 20 62 79 20 46  ely ignored by F
1ab0: 54 53 20 61 6e 64 20 53 51 4c 69 74 65 2e 20 3c  TS and SQLite. <
1ac0: 2f 69 3e 0a 20 20 43 52 45 41 54 45 20 56 49 52  /i>.  CREATE VIR
1ad0: 54 55 41 4c 20 54 41 42 4c 45 20 6d 61 69 6c 20  TUAL TABLE mail 
1ae0: 55 53 49 4e 47 20 66 74 73 33 28 0a 20 20 20 20  USING fts3(.    
1af0: 73 75 62 6a 65 63 74 20 56 41 52 43 48 41 52 28  subject VARCHAR(
1b00: 32 35 36 29 20 4e 4f 54 20 4e 55 4c 4c 2c 0a 20  256) NOT NULL,. 
1b10: 20 20 20 62 6f 64 79 20 54 45 58 54 20 43 48 45     body TEXT CHE
1b20: 43 4b 28 6c 65 6e 67 74 68 28 62 6f 64 79 29 26  CK(length(body)&
1b30: 6c 74 3b 31 30 32 34 30 29 0a 20 20 29 3b 0a 3c  lt;10240).  );.<
1b40: 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e  /codeblock>..<p>
1b50: 0a 20 20 41 73 20 77 65 6c 6c 20 61 73 20 61 20  .  As well as a 
1b60: 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 2c  list of columns,
1b70: 20 74 68 65 20 6d 6f 64 75 6c 65 20 61 72 67 75   the module argu
1b80: 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20  ments passed to 
1b90: 61 20 43 52 45 41 54 45 0a 20 20 56 49 52 54 55  a CREATE.  VIRTU
1ba0: 41 4c 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  AL TABLE stateme
1bb0: 6e 74 20 75 73 65 64 20 74 6f 20 63 72 65 61 74  nt used to creat
1bc0: 65 20 61 6e 20 46 54 53 20 74 61 62 6c 65 20 6d  e an FTS table m
1bd0: 61 79 20 62 65 20 75 73 65 64 20 74 6f 20 73 70  ay be used to sp
1be0: 65 63 69 66 79 0a 20 20 61 20 5b 74 6f 6b 65 6e  ecify.  a [token
1bf0: 69 7a 65 72 5d 2e 20 54 68 69 73 20 69 73 20 64  izer]. This is d
1c00: 6f 6e 65 20 62 79 20 73 70 65 63 69 66 79 69 6e  one by specifyin
1c10: 67 20 61 20 73 74 72 69 6e 67 20 6f 66 20 74 68  g a string of th
1c20: 65 20 66 6f 72 6d 0a 20 20 22 74 6f 6b 65 6e 69  e form.  "tokeni
1c30: 7a 65 3d 26 6c 74 3b 74 6f 6b 65 6e 69 7a 65 72  ze=&lt;tokenizer
1c40: 20 6e 61 6d 65 26 67 74 3b 20 26 6c 74 3b 74 6f   name&gt; &lt;to
1c50: 6b 65 6e 69 7a 65 72 20 61 72 67 73 26 67 74 3b  kenizer args&gt;
1c60: 22 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 61 20  " in place of a 
1c70: 63 6f 6c 75 6d 6e 0a 20 20 6e 61 6d 65 2c 20 77  column.  name, w
1c80: 68 65 72 65 20 26 6c 74 3b 74 6f 6b 65 6e 69 7a  here &lt;tokeniz
1c90: 65 72 20 6e 61 6d 65 26 67 74 3b 20 69 73 20 74  er name&gt; is t
1ca0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
1cb0: 6f 6b 65 6e 69 7a 65 72 20 74 6f 20 75 73 65 20  okenizer to use 
1cc0: 61 6e 64 0a 20 20 26 6c 74 3b 74 6f 6b 65 6e 69  and.  &lt;tokeni
1cd0: 7a 65 72 20 61 72 67 73 26 67 74 3b 20 69 73 20  zer args&gt; is 
1ce0: 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 6c 69 73 74  an optional list
1cf0: 20 6f 66 20 77 68 69 74 65 73 70 61 63 65 20 73   of whitespace s
1d00: 65 70 61 72 61 74 65 64 20 71 75 61 6c 69 66 69  eparated qualifi
1d10: 65 72 73 0a 20 20 74 6f 20 70 61 73 73 20 74 6f  ers.  to pass to
1d20: 20 74 68 65 20 74 6f 6b 65 6e 69 7a 65 72 20 69   the tokenizer i
1d30: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 41  mplementation. A
1d40: 20 74 6f 6b 65 6e 69 7a 65 72 20 73 70 65 63 69   tokenizer speci
1d50: 66 69 63 61 74 69 6f 6e 20 6d 61 79 20 62 65 0a  fication may be.
1d60: 20 20 70 6c 61 63 65 64 20 61 6e 79 77 68 65 72    placed anywher
1d70: 65 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20  e in the column 
1d80: 6c 69 73 74 2c 20 62 75 74 20 61 74 20 6d 6f 73  list, but at mos
1d90: 74 20 6f 6e 65 20 74 6f 6b 65 6e 69 7a 65 72 20  t one tokenizer 
1da0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 69 73 0a 20  declaration is. 
1db0: 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 65 61 63   allowed for eac
1dc0: 68 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c  h CREATE VIRTUAL
1dd0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
1de0: 2e 20 5b 74 6f 6b 65 6e 69 7a 65 72 7c 53 65 65  . [tokenizer|See
1df0: 20 62 65 6c 6f 77 5d 20 66 6f 72 20 61 20 0a 20   below] for a . 
1e00: 20 64 65 74 61 69 6c 65 64 20 64 65 73 63 72 69   detailed descri
1e10: 70 74 69 6f 6e 20 6f 66 20 75 73 69 6e 67 20 28  ption of using (
1e20: 61 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72  and, if necessar
1e30: 79 2c 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 29  y, implementing)
1e40: 20 61 20 74 6f 6b 65 6e 69 7a 65 72 2e 0a 0a 3c   a tokenizer...<
1e50: 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e  codeblock>.  <i>
1e60: 2d 2d 20 43 72 65 61 74 65 20 61 6e 20 46 54 53  -- Create an FTS
1e70: 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 22 70 61   table named "pa
1e80: 70 65 72 73 22 20 77 69 74 68 20 74 77 6f 20 63  pers" with two c
1e90: 6f 6c 75 6d 6e 73 20 74 68 61 74 20 75 73 65 73  olumns that uses
1ea0: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 68 65  </i>.  <i>-- the
1eb0: 20 74 6f 6b 65 6e 69 7a 65 72 20 22 70 6f 72 74   tokenizer "port
1ec0: 65 72 22 2e 3c 2f 69 3e 0a 20 20 43 52 45 41 54  er".</i>.  CREAT
1ed0: 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  E VIRTUAL TABLE 
1ee0: 70 61 70 65 72 73 20 55 53 49 4e 47 20 66 74 73  papers USING fts
1ef0: 33 28 61 75 74 68 6f 72 2c 20 64 6f 63 75 6d 65  3(author, docume
1f00: 6e 74 2c 20 74 6f 6b 65 6e 69 7a 65 3d 70 6f 72  nt, tokenize=por
1f10: 74 65 72 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 43  ter);..  <i>-- C
1f20: 72 65 61 74 65 20 61 6e 20 46 54 53 20 74 61 62  reate an FTS tab
1f30: 6c 65 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65  le with a single
1f40: 20 63 6f 6c 75 6d 6e 20 2d 20 22 63 6f 6e 74 65   column - "conte
1f50: 6e 74 22 20 2d 20 74 68 61 74 20 75 73 65 73 3c  nt" - that uses<
1f60: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 68 65 20  /i>.  <i>-- the 
1f70: 22 73 69 6d 70 6c 65 22 20 74 6f 6b 65 6e 69 7a  "simple" tokeniz
1f80: 65 72 2e 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45  er.</i>.  CREATE
1f90: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 64   VIRTUAL TABLE d
1fa0: 61 74 61 20 55 53 49 4e 47 20 66 74 73 34 28 74  ata USING fts4(t
1fb0: 6f 6b 65 6e 69 7a 65 3d 73 69 6d 70 6c 65 29 3b  okenize=simple);
1fc0: 0a 0a 20 20 3c 69 3e 2d 2d 20 43 72 65 61 74 65  ..  <i>-- Create
1fd0: 20 61 6e 20 46 54 53 20 74 61 62 6c 65 20 77 69   an FTS table wi
1fe0: 74 68 20 74 77 6f 20 63 6f 6c 75 6d 6e 73 20 74  th two columns t
1ff0: 68 61 74 20 75 73 65 73 20 74 68 65 20 22 69 63  hat uses the "ic
2000: 75 22 20 74 6f 6b 65 6e 69 7a 65 72 2e 3c 2f 69  u" tokenizer.</i
2010: 3e 0a 20 20 3c 69 3e 2d 2d 20 54 68 65 20 71 75  >.  <i>-- The qu
2020: 61 6c 69 66 69 65 72 20 22 65 6e 5f 41 55 22 20  alifier "en_AU" 
2030: 69 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  is passed to the
2040: 20 74 6f 6b 65 6e 69 7a 65 72 20 69 6d 70 6c 65   tokenizer imple
2050: 6d 65 6e 74 61 74 69 6f 6e 3c 2f 69 3e 0a 20 20  mentation</i>.  
2060: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
2070: 41 42 4c 45 20 6e 61 6d 65 73 20 55 53 49 4e 47  ABLE names USING
2080: 20 66 74 73 33 28 61 2c 20 62 2c 20 74 6f 6b 65   fts3(a, b, toke
2090: 6e 69 7a 65 3d 69 63 75 20 65 6e 5f 41 55 29 3b  nize=icu en_AU);
20a0: 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c  .</codeblock>..<
20b0: 70 3e 0a 20 20 46 54 53 20 74 61 62 6c 65 73 20  p>.  FTS tables 
20c0: 6d 61 79 20 62 65 20 64 72 6f 70 70 65 64 20 66  may be dropped f
20d0: 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
20e0: 20 75 73 69 6e 67 20 61 6e 20 6f 72 64 69 6e 61   using an ordina
20f0: 72 79 20 5b 44 52 4f 50 20 54 41 42 4c 45 5d 0a  ry [DROP TABLE].
2100: 20 20 73 74 61 74 65 6d 65 6e 74 2e 20 46 6f 72    statement. For
2110: 20 65 78 61 6d 70 6c 65 3a 0a 0a 3c 63 6f 64 65   example:..<code
2120: 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d 20 43  block>.  <i>-- C
2130: 72 65 61 74 65 2c 20 74 68 65 6e 20 69 6d 6d 65  reate, then imme
2140: 64 69 61 74 65 6c 79 20 64 72 6f 70 2c 20 61 6e  diately drop, an
2150: 20 46 54 53 34 20 74 61 62 6c 65 2e 3c 2f 69 3e   FTS4 table.</i>
2160: 0a 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41  .  CREATE VIRTUA
2170: 4c 20 54 41 42 4c 45 20 64 61 74 61 20 55 53 49  L TABLE data USI
2180: 4e 47 20 66 74 73 34 28 29 3b 0a 20 20 44 52 4f  NG fts4();.  DRO
2190: 50 20 54 41 42 4c 45 20 64 61 74 61 3b 0a 3c 2f  P TABLE data;.</
21a0: 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 68 33 20  codeblock>..<h3 
21b0: 69 64 3d 66 74 73 34 5f 6f 70 74 69 6f 6e 73 20  id=fts4_options 
21c0: 74 61 67 73 3d 22 46 54 53 34 20 6f 70 74 69 6f  tags="FTS4 optio
21d0: 6e 73 22 3e 46 54 53 34 20 4f 70 74 69 6f 6e 73  ns">FTS4 Options
21e0: 3c 2f 68 33 3e 0a 0a 3c 70 3e 0a 3c 74 63 6c 3e  </h3>..<p>.<tcl>
21f0: 68 64 5f 66 72 61 67 6d 65 6e 74 20 2a 6d 61 74  hd_fragment *mat
2200: 63 68 69 6e 66 6f 5f 66 74 73 33 20 7b 6d 61 74  chinfo_fts3 {mat
2210: 63 68 69 6e 66 6f 5f 66 74 73 33 7d 3c 2f 74 63  chinfo_fts3}</tc
2220: 6c 3e 0a 0a 20 20 49 66 20 74 68 65 20 22 43 52  l>..  If the "CR
2230: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
2240: 4c 45 22 20 73 74 61 74 65 6d 65 6e 74 20 73 70  LE" statement sp
2250: 65 63 69 66 69 65 73 20 6d 6f 64 75 6c 65 20 46  ecifies module F
2260: 54 53 34 20 28 6e 6f 74 20 46 54 53 33 29 2c 20  TS4 (not FTS3), 
2270: 0a 20 20 74 68 65 6e 20 73 70 65 63 69 61 6c 20  .  then special 
2280: 64 69 72 65 63 74 69 76 65 73 20 2d 20 46 54 53  directives - FTS
2290: 34 20 6f 70 74 69 6f 6e 73 20 2d 20 73 69 6d 69  4 options - simi
22a0: 6c 61 72 20 74 6f 20 74 68 65 20 22 74 6f 6b 65  lar to the "toke
22b0: 6e 69 7a 65 3d 2a 22 20 6f 70 74 69 6f 6e 0a 20  nize=*" option. 
22c0: 20 6d 61 79 20 61 6c 73 6f 20 61 70 70 65 61 72   may also appear
22d0: 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 63 6f 6c   in place of col
22e0: 75 6d 6e 20 6e 61 6d 65 73 2e 20 41 6e 20 46 54  umn names. An FT
22f0: 53 34 20 6f 70 74 69 6f 6e 20 63 6f 6e 73 69 73  S4 option consis
2300: 74 73 20 6f 66 20 74 68 65 0a 20 20 6f 70 74 69  ts of the.  opti
2310: 6f 6e 20 6e 61 6d 65 2c 20 66 6f 6c 6c 6f 77 65  on name, followe
2320: 64 20 62 79 20 61 6e 20 22 3d 22 20 63 68 61 72  d by an "=" char
2330: 61 63 74 65 72 2c 20 66 6f 6c 6c 6f 77 65 64 20  acter, followed 
2340: 62 79 20 74 68 65 20 6f 70 74 69 6f 6e 20 76 61  by the option va
2350: 6c 75 65 2e 0a 20 20 54 68 65 20 6f 70 74 69 6f  lue..  The optio
2360: 6e 20 76 61 6c 75 65 20 6d 61 79 20 6f 70 74 69  n value may opti
2370: 6f 6e 61 6c 6c 79 20 62 65 20 65 6e 63 6c 6f 73  onally be enclos
2380: 65 64 20 69 6e 20 73 69 6e 67 6c 65 20 6f 72 20  ed in single or 
2390: 64 6f 75 62 6c 65 20 71 75 6f 74 65 73 2c 20 77  double quotes, w
23a0: 69 74 68 0a 20 20 65 6d 62 65 64 64 65 64 20 71  ith.  embedded q
23b0: 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 73 20  uote characters 
23c0: 65 73 63 61 70 65 64 20 69 6e 20 74 68 65 20 73  escaped in the s
23d0: 61 6d 65 20 77 61 79 20 61 73 20 66 6f 72 20 53  ame way as for S
23e0: 51 4c 20 6c 69 74 65 72 61 6c 73 2e 20 54 68 65  QL literals. The
23f0: 72 65 0a 20 20 6d 61 79 20 6e 6f 74 20 62 65 20  re.  may not be 
2400: 77 68 69 74 65 73 70 61 63 65 20 6f 6e 20 65 69  whitespace on ei
2410: 74 68 65 72 20 73 69 64 65 20 6f 66 20 74 68 65  ther side of the
2420: 20 22 3d 22 20 63 68 61 72 61 63 74 65 72 2e 20   "=" character. 
2430: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 20 20 74  For example,.  t
2440: 6f 20 63 72 65 61 74 65 20 61 6e 20 46 54 53 34  o create an FTS4
2450: 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20   table with the 
2460: 76 61 6c 75 65 20 6f 66 20 6f 70 74 69 6f 6e 20  value of option 
2470: 22 6d 61 74 63 68 69 6e 66 6f 22 20 73 65 74 20  "matchinfo" set 
2480: 74 6f 20 22 66 74 73 33 22 3a 0a 0a 3c 63 6f 64  to "fts3":..<cod
2490: 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d 20  eblock>.  <i>-- 
24a0: 43 72 65 61 74 65 20 61 20 72 65 64 75 63 65 64  Create a reduced
24b0: 2d 66 6f 6f 74 70 72 69 6e 74 20 46 54 53 34 20  -footprint FTS4 
24c0: 74 61 62 6c 65 2e 3c 2f 69 3e 0a 20 20 43 52 45  table.</i>.  CRE
24d0: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
24e0: 45 20 70 61 70 65 72 73 20 55 53 49 4e 47 20 66  E papers USING f
24f0: 74 73 34 28 61 75 74 68 6f 72 2c 20 64 6f 63 75  ts4(author, docu
2500: 6d 65 6e 74 2c 20 6d 61 74 63 68 69 6e 66 6f 3d  ment, matchinfo=
2510: 66 74 73 33 29 3b 0a 3c 2f 63 6f 64 65 62 6c 6f  fts3);.</codeblo
2520: 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 46 54 53 34 20  ck>..<p>.  FTS4 
2530: 63 75 72 72 65 6e 74 6c 79 20 73 75 70 70 6f 72  currently suppor
2540: 74 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ts the following
2550: 20 74 68 72 65 65 20 6f 70 74 69 6f 6e 73 3a 0a   three options:.
2560: 0a 3c 74 61 62 6c 65 20 73 74 72 69 70 65 64 3d  .<table striped=
2570: 31 3e 0a 20 20 3c 74 72 3e 3c 74 68 3e 4f 70 74  1>.  <tr><th>Opt
2580: 69 6f 6e 3c 74 68 3e 49 6e 74 65 72 70 72 65 74  ion<th>Interpret
2590: 61 74 69 6f 6e 0a 20 20 3c 74 72 3e 3c 74 64 3e  ation.  <tr><td>
25a0: 6d 61 74 63 68 69 6e 66 6f 3c 74 64 3e 20 54 68  matchinfo<td> Th
25b0: 69 73 20 6f 70 74 69 6f 6e 20 6d 61 79 20 6f 6e  is option may on
25c0: 6c 79 20 62 65 20 73 65 74 20 74 6f 20 74 68 65  ly be set to the
25d0: 20 76 61 6c 75 65 20 22 66 74 73 33 22 2e 0a 20   value "fts3".. 
25e0: 20 20 20 41 74 74 65 6d 70 74 69 6e 67 20 74 6f     Attempting to
25f0: 20 73 65 74 20 69 74 20 6f 74 68 65 72 77 69 73   set it otherwis
2600: 65 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 49  e is an error. I
2610: 66 20 74 68 69 73 20 6f 70 74 69 6f 6e 20 69 73  f this option is
2620: 20 73 70 65 63 69 66 69 65 64 2c 0a 20 20 20 20   specified,.    
2630: 74 68 65 6e 20 73 6f 6d 65 20 6f 66 20 74 68 65  then some of the
2640: 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69   extra informati
2650: 6f 6e 20 73 74 6f 72 65 64 20 62 79 20 46 54 53  on stored by FTS
2660: 34 20 69 73 20 6f 6d 69 74 74 65 64 2e 20 54 68  4 is omitted. Th
2670: 69 73 20 72 65 64 75 63 65 73 0a 20 20 20 20 74  is reduces.    t
2680: 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 64 69 73  he amount of dis
2690: 6b 20 73 70 61 63 65 20 63 6f 6e 73 75 6d 65 64  k space consumed
26a0: 20 62 79 20 61 6e 20 46 54 53 34 20 74 61 62 6c   by an FTS4 tabl
26b0: 65 20 75 6e 74 69 6c 20 69 74 20 69 73 20 61 6c  e until it is al
26c0: 6d 6f 73 74 20 74 68 65 0a 20 20 20 20 73 61 6d  most the.    sam
26d0: 65 20 61 73 20 74 68 65 20 61 6d 6f 75 6e 74 20  e as the amount 
26e0: 74 68 61 74 20 77 6f 75 6c 64 20 62 65 20 75 73  that would be us
26f0: 65 64 20 62 79 20 74 68 65 20 65 71 75 69 76 61  ed by the equiva
2700: 6c 65 6e 74 20 46 54 53 33 20 74 61 62 6c 65 2c  lent FTS3 table,
2710: 20 62 75 74 20 0a 20 20 20 20 61 6c 73 6f 20 6d   but .    also m
2720: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 64 61  eans that the da
2730: 74 61 20 61 63 63 65 73 73 65 64 20 62 79 20 70  ta accessed by p
2740: 61 73 73 69 6e 67 20 74 68 65 20 27 6c 27 20 66  assing the 'l' f
2750: 6c 61 67 20 74 6f 20 74 68 65 20 0a 20 20 20 20  lag to the .    
2760: 5b 6d 61 74 63 68 69 6e 66 6f 28 29 5d 20 66 75  [matchinfo()] fu
2770: 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 61 76  nction is not av
2780: 61 69 6c 61 62 6c 65 2e 20 46 6f 72 20 65 78 61  ailable. For exa
2790: 6d 70 6c 65 3a 0a 0a 20 20 3c 74 72 3e 3c 74 64  mple:..  <tr><td
27a0: 3e 63 6f 6d 70 72 65 73 73 3c 74 64 3e 0a 20 20  >compress<td>.  
27b0: 20 20 54 68 69 73 20 6f 70 74 69 6f 6e 20 69 73    This option is
27c0: 20 75 73 65 64 20 74 6f 20 73 70 65 63 69 66 79   used to specify
27d0: 20 74 68 65 20 63 6f 6d 70 72 65 73 73 20 66 75   the compress fu
27e0: 6e 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 61 6e  nction. It is an
27f0: 20 65 72 72 6f 72 20 74 6f 0a 20 20 20 20 73 70   error to.    sp
2800: 65 63 69 66 79 20 61 20 63 6f 6d 70 72 65 73 73  ecify a compress
2810: 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 6f 75   function withou
2820: 74 20 61 6c 73 6f 20 73 70 65 63 69 66 79 69 6e  t also specifyin
2830: 67 20 61 6e 20 75 6e 63 6f 6d 70 72 65 73 73 0a  g an uncompress.
2840: 20 20 20 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20      function..  
2850: 20 20 0a 20 20 3c 74 72 3e 3c 74 64 3e 75 6e 63    .  <tr><td>unc
2860: 6f 6d 70 72 65 73 73 3c 74 64 3e 0a 20 20 20 20  ompress<td>.    
2870: 54 68 69 73 20 6f 70 74 69 6f 6e 20 69 73 20 75  This option is u
2880: 73 65 64 20 74 6f 20 73 70 65 63 69 66 79 20 74  sed to specify t
2890: 68 65 20 75 6e 63 6f 6d 70 72 65 73 73 20 66 75  he uncompress fu
28a0: 6e 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 61 6e  nction. It is an
28b0: 20 65 72 72 6f 72 20 74 6f 0a 20 20 20 20 73 70   error to.    sp
28c0: 65 63 69 66 79 20 61 6e 20 75 6e 63 6f 6d 70 72  ecify an uncompr
28d0: 65 73 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  ess function wit
28e0: 68 6f 75 74 20 61 6c 73 6f 20 73 70 65 63 69 66  hout also specif
28f0: 79 69 6e 67 20 61 20 63 6f 6d 70 72 65 73 73 0a  ying a compress.
2900: 20 20 20 20 66 75 6e 63 74 69 6f 6e 2e 0a 3c 2f      function..</
2910: 74 61 62 6c 65 3e 0a 0a 3c 74 63 6c 3e 68 64 5f  table>..<tcl>hd_
2920: 66 72 61 67 6d 65 6e 74 20 2a 66 74 73 34 63 6f  fragment *fts4co
2930: 6d 70 72 65 73 73 69 6f 6e 20 7b 63 6f 6d 70 72  mpression {compr
2940: 65 73 73 65 64 20 46 54 53 34 20 63 6f 6e 74 65  essed FTS4 conte
2950: 6e 74 7d 3c 2f 74 63 6c 3e 0a 3c 70 3e 0a 20 20  nt}</tcl>.<p>.  
2960: 54 68 65 20 63 6f 6d 70 72 65 73 73 20 61 6e 64  The compress and
2970: 20 75 6e 63 6f 6d 70 72 65 73 73 20 6f 70 74 69   uncompress opti
2980: 6f 6e 73 20 61 6c 6c 6f 77 20 46 54 53 34 20 63  ons allow FTS4 c
2990: 6f 6e 74 65 6e 74 20 74 6f 20 62 65 20 73 74 6f  ontent to be sto
29a0: 72 65 64 20 69 6e 0a 20 20 74 68 65 20 64 61 74  red in.  the dat
29b0: 61 62 61 73 65 20 69 6e 20 61 20 63 6f 6d 70 72  abase in a compr
29c0: 65 73 73 65 64 20 66 6f 72 6d 2e 20 42 6f 74 68  essed form. Both
29d0: 20 6f 70 74 69 6f 6e 73 20 73 68 6f 75 6c 64 20   options should 
29e0: 62 65 20 73 65 74 20 74 6f 20 74 68 65 20 6e 61  be set to the na
29f0: 6d 65 0a 20 20 6f 66 20 61 6e 20 53 51 4c 20 73  me.  of an SQL s
2a00: 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 72  calar function r
2a10: 65 67 69 73 74 65 72 65 64 20 75 73 69 6e 67 20  egistered using 
2a20: 5b 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f  [sqlite3_create_
2a30: 66 75 6e 63 74 69 6f 6e 28 29 5d 0a 20 20 74 68  function()].  th
2a40: 61 74 20 61 63 63 65 70 74 73 20 61 20 73 69 6e  at accepts a sin
2a50: 67 6c 65 20 61 72 67 75 6d 65 6e 74 2e 20 0a 0a  gle argument. ..
2a60: 3c 70 3e 0a 20 20 54 68 65 20 63 6f 6d 70 72 65  <p>.  The compre
2a70: 73 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  ss function shou
2a80: 6c 64 20 72 65 74 75 72 6e 20 61 20 63 6f 6d 70  ld return a comp
2a90: 72 65 73 73 65 64 20 76 65 72 73 69 6f 6e 20 6f  ressed version o
2aa0: 66 20 74 68 65 20 76 61 6c 75 65 20 0a 20 20 70  f the value .  p
2ab0: 61 73 73 65 64 20 74 6f 20 69 74 20 61 73 20 61  assed to it as a
2ac0: 6e 20 61 72 67 75 6d 65 6e 74 2e 20 45 61 63 68  n argument. Each
2ad0: 20 74 69 6d 65 20 64 61 74 61 20 69 73 20 77 72   time data is wr
2ae0: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 46 54 53  itten to the FTS
2af0: 34 20 74 61 62 6c 65 2c 20 0a 20 20 65 61 63 68  4 table, .  each
2b00: 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 73   column value is
2b10: 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 63   passed to the c
2b20: 6f 6d 70 72 65 73 73 20 66 75 6e 63 74 69 6f 6e  ompress function
2b30: 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74 20   and the result 
2b40: 76 61 6c 75 65 20 0a 20 20 73 74 6f 72 65 64 20  value .  stored 
2b50: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
2b60: 20 54 68 65 20 63 6f 6d 70 72 65 73 73 20 66 75   The compress fu
2b70: 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75 72  nction may retur
2b80: 6e 20 61 6e 79 20 74 79 70 65 20 6f 66 20 53 51  n any type of SQ
2b90: 4c 69 74 65 20 0a 20 20 76 61 6c 75 65 20 28 62  Lite .  value (b
2ba0: 6c 6f 62 2c 20 74 65 78 74 2c 20 72 65 61 6c 2c  lob, text, real,
2bb0: 20 69 6e 74 65 67 65 72 20 6f 72 20 6e 75 6c 6c   integer or null
2bc0: 29 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 75 6e  )...<p>.  The un
2bd0: 63 6f 6d 70 72 65 73 73 20 66 75 6e 63 74 69 6f  compress functio
2be0: 6e 20 73 68 6f 75 6c 64 20 75 6e 63 6f 6d 70 72  n should uncompr
2bf0: 65 73 73 20 64 61 74 61 20 70 72 65 76 69 6f 75  ess data previou
2c00: 73 6c 79 20 63 6f 6d 70 72 65 73 73 65 64 20 62  sly compressed b
2c10: 79 0a 20 20 74 68 65 20 63 6f 6d 70 72 65 73 73  y.  the compress
2c20: 20 66 75 6e 63 74 69 6f 6e 2e 20 49 6e 20 6f 74   function. In ot
2c30: 68 65 72 20 77 6f 72 64 73 2c 20 66 6f 72 20 61  her words, for a
2c40: 6c 6c 20 53 51 4c 69 74 65 20 76 61 6c 75 65 73  ll SQLite values
2c50: 20 58 2c 20 69 74 20 73 68 6f 75 6c 64 0a 20 20   X, it should.  
2c60: 62 65 20 74 72 75 65 20 74 68 61 74 20 75 6e 63  be true that unc
2c70: 6f 6d 70 72 65 73 73 28 63 6f 6d 70 72 65 73 73  ompress(compress
2c80: 28 58 29 29 20 65 71 75 61 6c 73 20 58 2e 20 57  (X)) equals X. W
2c90: 68 65 6e 20 64 61 74 61 20 74 68 61 74 20 68 61  hen data that ha
2ca0: 73 20 62 65 65 6e 0a 20 20 63 6f 6d 70 72 65 73  s been.  compres
2cb0: 73 65 64 20 62 79 20 74 68 65 20 63 6f 6d 70 72  sed by the compr
2cc0: 65 73 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  ess function is 
2cd0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
2ce0: 74 61 62 61 73 65 20 62 79 20 46 54 53 34 2c 20  tabase by FTS4, 
2cf0: 69 74 0a 20 20 69 73 20 70 61 73 73 65 64 20 74  it.  is passed t
2d00: 6f 20 74 68 65 20 75 6e 63 6f 6d 70 72 65 73 73  o the uncompress
2d10: 20 66 75 6e 63 74 69 6f 6e 20 62 65 66 6f 72 65   function before
2d20: 20 69 74 20 69 73 20 75 73 65 64 2e 0a 0a 3c 70   it is used...<p
2d30: 3e 0a 20 20 49 66 20 74 68 65 20 73 70 65 63 69  >.  If the speci
2d40: 66 69 65 64 20 63 6f 6d 70 72 65 73 73 20 6f 72  fied compress or
2d50: 20 75 6e 63 6f 6d 70 72 65 73 73 20 66 75 6e 63   uncompress func
2d60: 74 69 6f 6e 73 20 64 6f 20 6e 6f 74 20 65 78 69  tions do not exi
2d70: 73 74 2c 20 74 68 65 20 74 61 62 6c 65 0a 20 20  st, the table.  
2d80: 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 63 72 65  may still be cre
2d90: 61 74 65 64 2e 20 41 6e 20 65 72 72 6f 72 20 69  ated. An error i
2da0: 73 20 6e 6f 74 20 72 65 74 75 72 6e 65 64 20 75  s not returned u
2db0: 6e 74 69 6c 20 74 68 65 20 46 54 53 34 20 74 61  ntil the FTS4 ta
2dc0: 62 6c 65 20 69 73 0a 20 20 72 65 61 64 20 28 69  ble is.  read (i
2dd0: 66 20 74 68 65 20 75 6e 63 6f 6d 70 72 65 73 73  f the uncompress
2de0: 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
2df0: 6f 74 20 65 78 69 73 74 29 20 6f 72 20 77 72 69  ot exist) or wri
2e00: 74 74 65 6e 20 28 69 66 20 69 74 20 69 73 20 74  tten (if it is t
2e10: 68 65 20 0a 20 20 63 6f 6d 70 72 65 73 73 20 66  he .  compress f
2e20: 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 64 6f 65  unction that doe
2e30: 73 20 6e 6f 74 20 65 78 69 73 74 29 2e 0a 0a 3c  s not exist)...<
2e40: 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e  codeblock>.  <i>
2e50: 2d 2d 20 43 72 65 61 74 65 20 61 6e 20 46 54 53  -- Create an FTS
2e60: 34 20 74 61 62 6c 65 20 74 68 61 74 20 73 74 6f  4 table that sto
2e70: 72 65 73 20 64 61 74 61 20 69 6e 20 63 6f 6d 70  res data in comp
2e80: 72 65 73 73 65 64 20 66 6f 72 6d 2e 20 54 68 69  ressed form. Thi
2e90: 73 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 61 73  s</i>.  <i>-- as
2ea0: 73 75 6d 65 73 20 74 68 61 74 20 74 68 65 20 73  sumes that the s
2eb0: 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 73 20  calar functions 
2ec0: 7a 69 70 28 29 20 61 6e 64 20 75 6e 7a 69 70 28  zip() and unzip(
2ed0: 29 20 68 61 76 65 20 62 65 65 6e 20 28 6f 72 3c  ) have been (or<
2ee0: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 77 69 6c 6c  /i>.  <i>-- will
2ef0: 20 62 65 29 20 61 64 64 65 64 20 74 6f 20 74 68   be) added to th
2f00: 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
2f10: 65 2e 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45 20  e.</i>.  CREATE 
2f20: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 70 61  VIRTUAL TABLE pa
2f30: 70 65 72 73 20 55 53 49 4e 47 20 66 74 73 34 28  pers USING fts4(
2f40: 61 75 74 68 6f 72 2c 20 64 6f 63 75 6d 65 6e 74  author, document
2f50: 2c 20 63 6f 6d 70 72 65 73 73 3d 7a 69 70 2c 20  , compress=zip, 
2f60: 75 6e 63 6f 6d 70 72 65 73 73 3d 75 6e 7a 69 70  uncompress=unzip
2f70: 29 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a  );.</codeblock>.
2f80: 0a 3c 70 3e 0a 20 20 57 68 65 6e 20 75 73 69 6e  .<p>.  When usin
2f90: 67 20 46 54 53 34 2c 20 73 70 65 63 69 66 79 69  g FTS4, specifyi
2fa0: 6e 67 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  ng a column name
2fb0: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61   that contains a
2fc0: 6e 20 22 3d 22 20 63 68 61 72 61 63 74 65 72 0a  n "=" character.
2fd0: 20 20 61 6e 64 20 69 73 20 6e 6f 74 20 65 69 74    and is not eit
2fe0: 68 65 72 20 61 20 22 74 6f 6b 65 6e 69 7a 65 3d  her a "tokenize=
2ff0: 2a 22 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e  *" specification
3000: 20 6f 72 20 61 20 72 65 63 6f 67 6e 69 7a 65 64   or a recognized
3010: 20 46 54 53 34 20 6f 70 74 69 6f 6e 0a 20 20 69   FTS4 option.  i
3020: 73 20 61 6e 20 65 72 72 6f 72 2e 20 57 69 74 68  s an error. With
3030: 20 46 54 53 33 2c 20 74 68 65 20 66 69 72 73 74   FTS3, the first
3040: 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 75 6e   token in the un
3050: 72 65 63 6f 67 6e 69 7a 65 64 20 64 69 72 65 63  recognized direc
3060: 74 69 76 65 20 69 73 20 0a 20 20 69 6e 74 65 72  tive is .  inter
3070: 70 72 65 74 65 64 20 61 73 20 61 20 63 6f 6c 75  preted as a colu
3080: 6d 6e 20 6e 61 6d 65 2e 20 53 69 6d 69 6c 61 72  mn name. Similar
3090: 6c 79 2c 20 73 70 65 63 69 66 79 69 6e 67 20 6d  ly, specifying m
30a0: 75 6c 74 69 70 6c 65 20 22 74 6f 6b 65 6e 69 7a  ultiple "tokeniz
30b0: 65 3d 2a 22 0a 20 20 64 69 72 65 63 74 69 76 65  e=*".  directive
30c0: 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 74 61  s in a single ta
30d0: 62 6c 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  ble declaration 
30e0: 69 73 20 61 6e 20 65 72 72 6f 72 20 77 68 65 6e  is an error when
30f0: 20 75 73 69 6e 67 20 46 54 53 34 2c 20 77 68 65   using FTS4, whe
3100: 72 65 61 73 0a 20 20 74 68 65 20 73 65 63 6f 6e  reas.  the secon
3110: 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74  d and subsequent
3120: 20 22 74 6f 6b 65 6e 69 7a 65 3d 2a 22 20 64 69   "tokenize=*" di
3130: 72 65 63 74 69 76 65 73 20 61 72 65 20 69 6e 74  rectives are int
3140: 65 72 70 72 65 74 65 64 20 61 73 20 63 6f 6c 75  erpreted as colu
3150: 6d 6e 0a 20 20 6e 61 6d 65 73 20 62 79 20 46 54  mn.  names by FT
3160: 53 33 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a  S3. For example:
3170: 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20  ..<codeblock>.  
3180: 3c 69 3e 2d 2d 20 41 6e 20 65 72 72 6f 72 2e 20  <i>-- An error. 
3190: 46 54 53 34 20 64 6f 65 73 20 6e 6f 74 20 72 65  FTS4 does not re
31a0: 63 6f 67 6e 69 7a 65 20 74 68 65 20 64 69 72 65  cognize the dire
31b0: 63 74 69 76 65 20 22 78 79 7a 3d 61 62 63 22 2e  ctive "xyz=abc".
31c0: 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45 20 56 49  </i>.  CREATE VI
31d0: 52 54 55 41 4c 20 54 41 42 4c 45 20 70 61 70 65  RTUAL TABLE pape
31e0: 72 73 20 55 53 49 4e 47 20 66 74 73 34 28 61 75  rs USING fts4(au
31f0: 74 68 6f 72 2c 20 64 6f 63 75 6d 65 6e 74 2c 20  thor, document, 
3200: 78 79 7a 3d 61 62 63 29 3b 0a 0a 20 20 3c 69 3e  xyz=abc);..  <i>
3210: 2d 2d 20 43 72 65 61 74 65 20 61 6e 20 46 54 53  -- Create an FTS
3220: 33 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 72  3 table with thr
3230: 65 65 20 63 6f 6c 75 6d 6e 73 20 2d 20 22 61 75  ee columns - "au
3240: 74 68 6f 72 22 2c 20 22 64 6f 63 75 6d 65 6e 74  thor", "document
3250: 22 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 61 6e  "</i>.  <i>-- an
3260: 64 20 22 78 79 7a 22 2e 3c 2f 69 3e 0a 20 20 43  d "xyz".</i>.  C
3270: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
3280: 42 4c 45 20 70 61 70 65 72 73 20 55 53 49 4e 47  BLE papers USING
3290: 20 66 74 73 33 28 61 75 74 68 6f 72 2c 20 64 6f   fts3(author, do
32a0: 63 75 6d 65 6e 74 2c 20 78 79 7a 3d 61 62 63 29  cument, xyz=abc)
32b0: 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 41 6e 20 65 72  ;..  <i>-- An er
32c0: 72 6f 72 2e 20 46 54 53 34 20 64 6f 65 73 20 6e  ror. FTS4 does n
32d0: 6f 74 20 61 6c 6c 6f 77 20 6d 75 6c 74 69 70 6c  ot allow multipl
32e0: 65 20 74 6f 6b 65 6e 69 7a 65 3d 2a 20 64 69 72  e tokenize=* dir
32f0: 65 63 74 69 76 65 73 3c 2f 69 3e 0a 20 20 43 52  ectives</i>.  CR
3300: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
3310: 4c 45 20 70 61 70 65 72 73 20 55 53 49 4e 47 20  LE papers USING 
3320: 66 74 73 34 28 74 6f 6b 65 6e 69 7a 65 3d 70 6f  fts4(tokenize=po
3330: 72 74 65 72 2c 20 74 6f 6b 65 6e 69 7a 65 3d 73  rter, tokenize=s
3340: 69 6d 70 6c 65 29 3b 0a 0a 20 20 3c 69 3e 2d 2d  imple);..  <i>--
3350: 20 43 72 65 61 74 65 20 61 6e 20 46 54 53 33 20   Create an FTS3 
3360: 74 61 62 6c 65 20 77 69 74 68 20 61 20 73 69 6e  table with a sin
3370: 67 6c 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64  gle column named
3380: 20 22 74 6f 6b 65 6e 69 7a 65 22 2e 20 54 68 65   "tokenize". The
3390: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 61 62  </i>.  <i>-- tab
33a0: 6c 65 20 75 73 65 73 20 74 68 65 20 22 70 6f 72  le uses the "por
33b0: 74 65 72 22 20 74 6f 6b 65 6e 69 7a 65 72 2e 3c  ter" tokenizer.<
33c0: 2f 69 3e 0a 20 20 43 52 45 41 54 45 20 56 49 52  /i>.  CREATE VIR
33d0: 54 55 41 4c 20 54 41 42 4c 45 20 70 61 70 65 72  TUAL TABLE paper
33e0: 73 20 55 53 49 4e 47 20 66 74 73 33 28 74 6f 6b  s USING fts3(tok
33f0: 65 6e 69 7a 65 3d 70 6f 72 74 65 72 2c 20 74 6f  enize=porter, to
3400: 6b 65 6e 69 7a 65 3d 73 69 6d 70 6c 65 29 3b 0a  kenize=simple);.
3410: 0a 20 20 3c 69 3e 2d 2d 20 41 6e 20 65 72 72 6f  .  <i>-- An erro
3420: 72 2e 20 43 61 6e 6e 6f 74 20 63 72 65 61 74 65  r. Cannot create
3430: 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 74 77   a table with tw
3440: 6f 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 64 20  o columns named 
3450: 22 74 6f 6b 65 6e 69 7a 65 22 2e 3c 2f 69 3e 0a  "tokenize".</i>.
3460: 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c    CREATE VIRTUAL
3470: 20 54 41 42 4c 45 20 70 61 70 65 72 73 20 55 53   TABLE papers US
3480: 49 4e 47 20 66 74 73 33 28 74 6f 6b 65 6e 69 7a  ING fts3(tokeniz
3490: 65 3d 70 6f 72 74 65 72 2c 20 74 6f 6b 65 6e 69  e=porter, tokeni
34a0: 7a 65 3d 73 69 6d 70 6c 65 2c 20 74 6f 6b 65 6e  ze=simple, token
34b0: 69 7a 65 3d 69 63 75 29 3b 0a 3c 2f 63 6f 64 65  ize=icu);.</code
34c0: 62 6c 6f 63 6b 3e 0a 0a 3c 68 32 3e 50 6f 70 75  block>..<h2>Popu
34d0: 6c 61 74 69 6e 67 20 46 54 53 20 54 61 62 6c 65  lating FTS Table
34e0: 73 3c 2f 68 32 3e 0a 0a 20 20 3c 70 3e 0a 20 20  s</h2>..  <p>.  
34f0: 20 20 46 54 53 20 74 61 62 6c 65 73 20 61 72 65    FTS tables are
3500: 20 70 6f 70 75 6c 61 74 65 64 20 75 73 69 6e 67   populated using
3510: 20 5b 49 4e 53 45 52 54 5d 2c 20 5b 55 50 44 41   [INSERT], [UPDA
3520: 54 45 5d 20 61 6e 64 20 5b 44 45 4c 45 54 45 5d  TE] and [DELETE]
3530: 0a 20 20 20 20 73 74 61 74 65 6d 65 6e 74 73 20  .    statements 
3540: 69 6e 20 74 68 65 20 73 61 6d 65 20 77 61 79 20  in the same way 
3550: 61 73 20 6f 72 64 69 6e 61 72 79 20 53 51 4c 69  as ordinary SQLi
3560: 74 65 20 74 61 62 6c 65 73 20 61 72 65 2e 0a 0a  te tables are...
3570: 20 20 3c 70 3e 0a 20 20 20 20 41 73 20 77 65 6c    <p>.    As wel
3580: 6c 20 61 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73  l as the columns
3590: 20 6e 61 6d 65 64 20 62 79 20 74 68 65 20 75 73   named by the us
35a0: 65 72 20 28 6f 72 20 74 68 65 20 22 63 6f 6e 74  er (or the "cont
35b0: 65 6e 74 22 20 63 6f 6c 75 6d 6e 20 69 66 20 6e  ent" column if n
35c0: 6f 0a 20 20 20 20 6d 6f 64 75 6c 65 20 61 72 67  o.    module arg
35d0: 75 6d 65 6e 74 73 20 77 65 72 65 20 73 70 65 63  uments were spec
35e0: 69 66 69 65 64 20 61 73 20 70 61 72 74 20 6f 66  ified as part of
35f0: 20 74 68 65 20 5b 43 52 45 41 54 45 20 56 49 52   the [CREATE VIR
3600: 54 55 41 4c 20 54 41 42 4c 45 5d 20 0a 20 20 20  TUAL TABLE] .   
3610: 20 73 74 61 74 65 6d 65 6e 74 29 2c 20 65 61 63   statement), eac
3620: 68 20 46 54 53 20 74 61 62 6c 65 20 68 61 73 20  h FTS table has 
3630: 61 20 22 72 6f 77 69 64 22 20 63 6f 6c 75 6d 6e  a "rowid" column
3640: 2e 20 54 68 65 20 72 6f 77 69 64 20 6f 66 20 61  . The rowid of a
3650: 6e 20 46 54 53 0a 20 20 20 20 74 61 62 6c 65 20  n FTS.    table 
3660: 62 65 68 61 76 65 73 20 69 6e 20 74 68 65 20 73  behaves in the s
3670: 61 6d 65 20 77 61 79 20 61 73 20 74 68 65 20 72  ame way as the r
3680: 6f 77 69 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 61  owid column of a
3690: 6e 20 6f 72 64 69 6e 61 72 79 20 53 51 4c 69 74  n ordinary SQLit
36a0: 65 20 0a 20 20 20 20 74 61 62 6c 65 2c 20 65 78  e .    table, ex
36b0: 63 65 70 74 20 74 68 61 74 20 74 68 65 20 76 61  cept that the va
36c0: 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74  lues stored in t
36d0: 68 65 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 20  he rowid column 
36e0: 6f 66 20 61 6e 20 46 54 53 20 74 61 62 6c 65 20  of an FTS table 
36f0: 0a 20 20 20 20 72 65 6d 61 69 6e 20 75 6e 63 68  .    remain unch
3700: 61 6e 67 65 64 20 69 66 20 74 68 65 20 64 61 74  anged if the dat
3710: 61 62 61 73 65 20 69 73 20 72 65 62 75 69 6c 74  abase is rebuilt
3720: 20 75 73 69 6e 67 20 74 68 65 20 5b 56 41 43 55   using the [VACU
3730: 55 4d 5d 20 63 6f 6d 6d 61 6e 64 2e 20 0a 20 20  UM] command. .  
3740: 20 20 46 6f 72 20 46 54 53 20 74 61 62 6c 65 73    For FTS tables
3750: 2c 20 22 64 6f 63 69 64 22 20 69 73 20 61 6c 6c  , "docid" is all
3760: 6f 77 65 64 20 61 73 20 61 6e 20 61 6c 69 61 73  owed as an alias
3770: 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20   along with the 
3780: 75 73 75 61 6c 20 22 72 6f 77 69 64 22 2c 0a 20  usual "rowid",. 
3790: 20 20 20 22 6f 69 64 22 20 61 6e 64 20 22 5f 6f     "oid" and "_o
37a0: 69 64 5f 22 20 69 64 65 6e 74 69 66 69 65 72 73  id_" identifiers
37b0: 2e 20 41 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  . Attempting to 
37c0: 69 6e 73 65 72 74 20 6f 72 20 75 70 64 61 74 65  insert or update
37d0: 20 61 20 72 6f 77 20 77 69 74 68 20 61 20 0a 20   a row with a . 
37e0: 20 20 20 64 6f 63 69 64 20 76 61 6c 75 65 20 74     docid value t
37f0: 68 61 74 20 61 6c 72 65 61 64 79 20 65 78 69 73  hat already exis
3800: 74 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ts in the table 
3810: 69 73 20 61 6e 20 65 72 72 6f 72 2c 20 6a 75 73  is an error, jus
3820: 74 20 61 73 20 69 74 20 77 6f 75 6c 64 20 0a 20  t as it would . 
3830: 20 20 20 62 65 20 77 69 74 68 20 61 6e 20 6f 72     be with an or
3840: 64 69 6e 61 72 79 20 53 51 4c 69 74 65 20 74 61  dinary SQLite ta
3850: 62 6c 65 2e 0a 0a 20 20 3c 70 3e 0a 20 20 20 20  ble...  <p>.    
3860: 54 68 65 72 65 20 69 73 20 6f 6e 65 20 6f 74 68  There is one oth
3870: 65 72 20 73 75 62 74 6c 65 20 64 69 66 66 65 72  er subtle differ
3880: 65 6e 63 65 20 62 65 74 77 65 65 6e 20 22 64 6f  ence between "do
3890: 63 69 64 22 20 61 6e 64 20 74 68 65 20 6e 6f 72  cid" and the nor
38a0: 6d 61 6c 20 53 51 4c 69 74 65 0a 20 20 20 20 61  mal SQLite.    a
38b0: 6c 69 61 73 65 73 20 66 6f 72 20 74 68 65 20 72  liases for the r
38c0: 6f 77 69 64 20 63 6f 6c 75 6d 6e 2e 20 4e 6f 72  owid column. Nor
38d0: 6d 61 6c 6c 79 2c 20 69 66 20 61 6e 20 49 4e 53  mally, if an INS
38e0: 45 52 54 20 6f 72 20 55 50 44 41 54 45 20 73 74  ERT or UPDATE st
38f0: 61 74 65 6d 65 6e 74 20 0a 20 20 20 20 61 73 73  atement .    ass
3900: 69 67 6e 73 20 64 69 73 63 72 65 74 65 20 76 61  igns discrete va
3910: 6c 75 65 73 20 74 6f 20 74 77 6f 20 6f 72 20 6d  lues to two or m
3920: 6f 72 65 20 61 6c 69 61 73 65 73 20 6f 66 20 74  ore aliases of t
3930: 68 65 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 2c  he rowid column,
3940: 20 53 51 4c 69 74 65 20 0a 20 20 20 20 77 72 69   SQLite .    wri
3950: 74 65 73 20 74 68 65 20 72 69 67 68 74 6d 6f 73  tes the rightmos
3960: 74 20 6f 66 20 73 75 63 68 20 76 61 6c 75 65 73  t of such values
3970: 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68   specified in th
3980: 65 20 49 4e 53 45 52 54 20 6f 72 20 55 50 44 41  e INSERT or UPDA
3990: 54 45 0a 20 20 20 20 73 74 61 74 65 6d 65 6e 74  TE.    statement
39a0: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
39b0: 2e 20 48 6f 77 65 76 65 72 2c 20 61 73 73 69 67  . However, assig
39c0: 6e 69 6e 67 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20  ning a non-NULL 
39d0: 76 61 6c 75 65 20 74 6f 20 62 6f 74 68 0a 20 20  value to both.  
39e0: 20 20 74 68 65 20 22 64 6f 63 69 64 22 20 61 6e    the "docid" an
39f0: 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66  d one or more of
3a00: 20 74 68 65 20 53 51 4c 69 74 65 20 72 6f 77 69   the SQLite rowi
3a10: 64 20 61 6c 69 61 73 65 73 20 77 68 65 6e 20 69  d aliases when i
3a20: 6e 73 65 72 74 69 6e 67 20 6f 72 0a 20 20 20 20  nserting or.    
3a30: 75 70 64 61 74 69 6e 67 20 61 6e 20 46 54 53 20  updating an FTS 
3a40: 74 61 62 6c 65 20 69 73 20 63 6f 6e 73 69 64 65  table is conside
3a50: 72 65 64 20 61 6e 20 65 72 72 6f 72 2e 20 53 65  red an error. Se
3a60: 65 20 62 65 6c 6f 77 20 66 6f 72 20 61 6e 20 65  e below for an e
3a70: 78 61 6d 70 6c 65 2e 0a 0a 3c 63 6f 64 65 62 6c  xample...<codebl
3a80: 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d 20 43 72 65  ock>.  <i>-- Cre
3a90: 61 74 65 20 61 6e 20 46 54 53 20 74 61 62 6c 65  ate an FTS table
3aa0: 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45 20 56 49  </i>.  CREATE VI
3ab0: 52 54 55 41 4c 20 54 41 42 4c 45 20 70 61 67 65  RTUAL TABLE page
3ac0: 73 20 55 53 49 4e 47 20 66 74 73 34 28 74 69 74  s USING fts4(tit
3ad0: 6c 65 2c 20 62 6f 64 79 29 3b 0a 0a 20 20 3c 69  le, body);..  <i
3ae0: 3e 2d 2d 20 49 6e 73 65 72 74 20 61 20 72 6f 77  >-- Insert a row
3af0: 20 77 69 74 68 20 61 20 73 70 65 63 69 66 69 63   with a specific
3b00: 20 64 6f 63 69 64 20 76 61 6c 75 65 2e 3c 2f 69   docid value.</i
3b10: 3e 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  >.  INSERT INTO 
3b20: 70 61 67 65 73 28 64 6f 63 69 64 2c 20 74 69 74  pages(docid, tit
3b30: 6c 65 2c 20 62 6f 64 79 29 20 56 41 4c 55 45 53  le, body) VALUES
3b40: 28 35 33 2c 20 27 48 6f 6d 65 20 50 61 67 65 27  (53, 'Home Page'
3b50: 2c 20 27 53 51 4c 69 74 65 20 69 73 20 61 20 73  , 'SQLite is a s
3b60: 6f 66 74 77 61 72 65 2e 2e 2e 27 29 3b 0a 0a 20  oftware...');.. 
3b70: 20 3c 69 3e 2d 2d 20 49 6e 73 65 72 74 20 61 20   <i>-- Insert a 
3b80: 72 6f 77 20 61 6e 64 20 61 6c 6c 6f 77 20 46 54  row and allow FT
3b90: 53 20 74 6f 20 61 73 73 69 67 6e 20 61 20 64 6f  S to assign a do
3ba0: 63 69 64 20 76 61 6c 75 65 20 75 73 69 6e 67 20  cid value using 
3bb0: 74 68 65 20 73 61 6d 65 20 61 6c 67 6f 72 69 74  the same algorit
3bc0: 68 6d 20 61 73 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  hm as</i>.  <i>-
3bd0: 2d 20 53 51 4c 69 74 65 20 75 73 65 73 20 66 6f  - SQLite uses fo
3be0: 72 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65  r ordinary table
3bf0: 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  s. In this case 
3c00: 74 68 65 20 6e 65 77 20 64 6f 63 69 64 20 77 69  the new docid wi
3c10: 6c 6c 20 62 65 20 35 34 2c 3c 2f 69 3e 0a 20 20  ll be 54,</i>.  
3c20: 3c 69 3e 2d 2d 20 6f 6e 65 20 67 72 65 61 74 65  <i>-- one greate
3c30: 72 20 74 68 61 6e 20 74 68 65 20 6c 61 72 67 65  r than the large
3c40: 73 74 20 64 6f 63 69 64 20 63 75 72 72 65 6e 74  st docid current
3c50: 6c 79 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  ly present in th
3c60: 65 20 74 61 62 6c 65 2e 3c 2f 69 3e 0a 20 20 49  e table.</i>.  I
3c70: 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 67 65 73  NSERT INTO pages
3c80: 28 74 69 74 6c 65 2c 20 62 6f 64 79 29 20 56 41  (title, body) VA
3c90: 4c 55 45 53 28 27 44 6f 77 6e 6c 6f 61 64 27 2c  LUES('Download',
3ca0: 20 27 41 6c 6c 20 53 51 4c 69 74 65 20 73 6f 75   'All SQLite sou
3cb0: 72 63 65 20 63 6f 64 65 2e 2e 2e 27 29 3b 0a 0a  rce code...');..
3cc0: 20 20 3c 69 3e 2d 2d 20 43 68 61 6e 67 65 20 74    <i>-- Change t
3cd0: 68 65 20 74 69 74 6c 65 20 6f 66 20 74 68 65 20  he title of the 
3ce0: 72 6f 77 20 6a 75 73 74 20 69 6e 73 65 72 74 65  row just inserte
3cf0: 64 2e 3c 2f 69 3e 0a 20 20 55 50 44 41 54 45 20  d.</i>.  UPDATE 
3d00: 70 61 67 65 73 20 53 45 54 20 74 69 74 6c 65 20  pages SET title 
3d10: 3d 20 27 44 6f 77 6e 6c 6f 61 64 20 53 51 4c 69  = 'Download SQLi
3d20: 74 65 27 20 57 48 45 52 45 20 72 6f 77 69 64 20  te' WHERE rowid 
3d30: 3d 20 35 34 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 44  = 54;..  <i>-- D
3d40: 65 6c 65 74 65 20 74 68 65 20 65 6e 74 69 72 65  elete the entire
3d50: 20 74 61 62 6c 65 20 63 6f 6e 74 65 6e 74 73 2e   table contents.
3d60: 3c 2f 69 3e 0a 20 20 44 45 4c 45 54 45 20 46 52  </i>.  DELETE FR
3d70: 4f 4d 20 70 61 67 65 73 3b 0a 0a 20 20 3c 69 3e  OM pages;..  <i>
3d80: 2d 2d 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  -- The following
3d90: 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 49 74   is an error. It
3da0: 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
3db0: 20 74 6f 20 61 73 73 69 67 6e 20 6e 6f 6e 2d 4e   to assign non-N
3dc0: 55 4c 4c 20 76 61 6c 75 65 73 20 74 6f 20 62 6f  ULL values to bo
3dd0: 74 68 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74  th</i>.  <i>-- t
3de0: 68 65 20 72 6f 77 69 64 20 61 6e 64 20 64 6f 63  he rowid and doc
3df0: 69 64 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 61 6e  id columns of an
3e00: 20 46 54 53 20 74 61 62 6c 65 2e 3c 2f 69 3e 0a   FTS table.</i>.
3e10: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61    INSERT INTO pa
3e20: 67 65 73 28 72 6f 77 69 64 2c 20 64 6f 63 69 64  ges(rowid, docid
3e30: 2c 20 74 69 74 6c 65 2c 20 62 6f 64 79 29 20 56  , title, body) V
3e40: 41 4c 55 45 53 28 31 2c 20 32 2c 20 27 41 20 74  ALUES(1, 2, 'A t
3e50: 69 74 6c 65 27 2c 20 27 41 20 64 6f 63 75 6d 65  itle', 'A docume
3e60: 6e 74 20 62 6f 64 79 27 29 3b 0a 3c 2f 63 6f 64  nt body');.</cod
3e70: 65 62 6c 6f 63 6b 3e 0a 0a 20 20 3c 70 3e 0a 20  eblock>..  <p>. 
3e80: 20 20 20 54 6f 20 73 75 70 70 6f 72 74 20 66 75     To support fu
3e90: 6c 6c 2d 74 65 78 74 20 71 75 65 72 69 65 73 2c  ll-text queries,
3ea0: 20 46 54 53 20 6d 61 69 6e 74 61 69 6e 73 20 61   FTS maintains a
3eb0: 6e 20 69 6e 76 65 72 74 65 64 20 69 6e 64 65 78  n inverted index
3ec0: 20 74 68 61 74 20 6d 61 70 73 0a 20 20 20 20 66   that maps.    f
3ed0: 72 6f 6d 20 65 61 63 68 20 75 6e 69 71 75 65 20  rom each unique 
3ee0: 74 65 72 6d 20 6f 72 20 77 6f 72 64 20 74 68 61  term or word tha
3ef0: 74 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65  t appears in the
3f00: 20 64 61 74 61 73 65 74 20 74 6f 20 74 68 65 20   dataset to the 
3f10: 6c 6f 63 61 74 69 6f 6e 73 0a 20 20 20 20 69 6e  locations.    in
3f20: 20 77 68 69 63 68 20 69 74 20 61 70 70 65 61 72   which it appear
3f30: 73 20 77 69 74 68 69 6e 20 74 68 65 20 74 61 62  s within the tab
3f40: 6c 65 20 63 6f 6e 74 65 6e 74 73 2e 20 46 6f 72  le contents. For
3f50: 20 74 68 65 20 63 75 72 69 6f 75 73 2c 20 61 20   the curious, a 
3f60: 0a 20 20 20 20 63 6f 6d 70 6c 65 74 65 20 64 65  .    complete de
3f70: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
3f80: 20 5b 73 65 67 6d 65 6e 74 20 62 74 72 65 65 7c   [segment btree|
3f90: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 5d 20  data structure] 
3fa0: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
3fb0: 20 20 74 68 69 73 20 69 6e 64 65 78 20 77 69 74    this index wit
3fc0: 68 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  hin the database
3fd0: 20 66 69 6c 65 20 61 70 70 65 61 72 73 20 62 65   file appears be
3fe0: 6c 6f 77 2e 20 41 20 66 65 61 74 75 72 65 20 6f  low. A feature o
3ff0: 66 0a 20 20 20 20 74 68 69 73 20 64 61 74 61 20  f.    this data 
4000: 73 74 72 75 63 74 75 72 65 20 69 73 20 74 68 61  structure is tha
4010: 74 20 61 74 20 61 6e 79 20 74 69 6d 65 20 74 68  t at any time th
4020: 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 63  e database may c
4030: 6f 6e 74 61 69 6e 20 6e 6f 74 0a 20 20 20 20 6f  ontain not.    o
4040: 6e 65 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2c  ne index b-tree,
4050: 20 62 75 74 20 73 65 76 65 72 61 6c 20 64 69 66   but several dif
4060: 66 65 72 65 6e 74 20 62 2d 74 72 65 65 73 20 74  ferent b-trees t
4070: 68 61 74 20 61 72 65 20 69 6e 63 72 65 6d 65 6e  hat are incremen
4080: 74 61 6c 6c 79 0a 20 20 20 20 6d 65 72 67 65 64  tally.    merged
4090: 20 61 73 20 72 6f 77 73 20 61 72 65 20 69 6e 73   as rows are ins
40a0: 65 72 74 65 64 2c 20 75 70 64 61 74 65 64 20 61  erted, updated a
40b0: 6e 64 20 64 65 6c 65 74 65 64 2e 20 54 68 69 73  nd deleted. This
40c0: 20 74 65 63 68 6e 69 71 75 65 20 69 6d 70 72 6f   technique impro
40d0: 76 65 73 20 0a 20 20 20 20 70 65 72 66 6f 72 6d  ves .    perform
40e0: 61 6e 63 65 20 77 68 65 6e 20 77 72 69 74 69 6e  ance when writin
40f0: 67 20 74 6f 20 61 6e 20 46 54 53 20 74 61 62 6c  g to an FTS tabl
4100: 65 2c 20 62 75 74 20 63 61 75 73 65 73 20 73 6f  e, but causes so
4110: 6d 65 20 6f 76 65 72 68 65 61 64 20 66 6f 72 0a  me overhead for.
4120: 20 20 20 20 66 75 6c 6c 2d 74 65 78 74 20 71 75      full-text qu
4130: 65 72 69 65 73 20 74 68 61 74 20 75 73 65 20 74  eries that use t
4140: 68 65 20 69 6e 64 65 78 2e 20 45 78 65 63 75 74  he index. Execut
4150: 69 6e 67 20 61 6e 20 53 51 4c 20 73 74 61 74 65  ing an SQL state
4160: 6d 65 6e 74 20 6f 66 20 74 68 65 0a 20 20 20 20  ment of the.    
4170: 66 6f 72 6d 20 22 49 4e 53 45 52 54 20 49 4e 54  form "INSERT INT
4180: 4f 20 26 6c 74 3b 66 74 73 2d 74 61 62 6c 65 26  O &lt;fts-table&
4190: 67 74 3b 28 26 6c 74 3b 66 74 73 2d 74 61 62 6c  gt;(&lt;fts-tabl
41a0: 65 26 67 74 3b 29 20 56 41 4c 55 45 53 28 27 6f  e&gt;) VALUES('o
41b0: 70 74 69 6d 69 7a 65 27 29 22 0a 20 20 20 20 63  ptimize')".    c
41c0: 61 75 73 65 73 20 46 54 53 20 74 6f 20 6d 65 72  auses FTS to mer
41d0: 67 65 20 61 6c 6c 20 65 78 69 73 74 69 6e 67 20  ge all existing 
41e0: 69 6e 64 65 78 20 62 2d 74 72 65 65 73 20 69 6e  index b-trees in
41f0: 74 6f 20 61 20 73 69 6e 67 6c 65 20 6c 61 72 67  to a single larg
4200: 65 0a 20 20 20 20 62 2d 74 72 65 65 20 63 6f 6e  e.    b-tree con
4210: 74 61 69 6e 69 6e 67 20 74 68 65 20 65 6e 74 69  taining the enti
4220: 72 65 20 69 6e 64 65 78 2e 20 54 68 69 73 20 63  re index. This c
4230: 61 6e 20 62 65 20 61 6e 20 65 78 70 65 6e 73 69  an be an expensi
4240: 76 65 20 6f 70 65 72 61 74 69 6f 6e 2c 0a 20 20  ve operation,.  
4250: 20 20 62 75 74 20 6d 61 79 20 73 70 65 65 64 20    but may speed 
4260: 75 70 20 66 75 74 75 72 65 20 71 75 65 72 69 65  up future querie
4270: 73 2e 20 0a 0a 20 20 3c 70 3e 0a 20 20 20 20 46  s. ..  <p>.    F
4280: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 6f 20 6f  or example, to o
4290: 70 74 69 6d 69 7a 65 20 74 68 65 20 66 75 6c 6c  ptimize the full
42a0: 2d 74 65 78 74 20 69 6e 64 65 78 20 66 6f 72 20  -text index for 
42b0: 61 6e 20 46 54 53 20 74 61 62 6c 65 20 6e 61 6d  an FTS table nam
42c0: 65 64 0a 20 20 20 20 22 64 6f 63 73 22 3a 0a 0a  ed.    "docs":..
42d0: 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69  <codeblock>.  <i
42e0: 3e 2d 2d 20 4f 70 74 69 6d 69 7a 65 20 74 68 65  >-- Optimize the
42f0: 20 69 6e 74 65 72 6e 61 6c 20 73 74 72 75 63 74   internal struct
4300: 75 72 65 20 6f 66 20 46 54 53 20 74 61 62 6c 65  ure of FTS table
4310: 20 22 64 6f 63 73 22 2e 3c 2f 69 3e 0a 20 20 49   "docs".</i>.  I
4320: 4e 53 45 52 54 20 49 4e 54 4f 20 64 6f 63 73 28  NSERT INTO docs(
4330: 64 6f 63 73 29 20 56 41 4c 55 45 53 28 27 6f 70  docs) VALUES('op
4340: 74 69 6d 69 7a 65 27 29 3b 0a 3c 2f 63 6f 64 65  timize');.</code
4350: 62 6c 6f 63 6b 3e 0a 0a 20 20 3c 70 3e 0a 20 20  block>..  <p>.  
4360: 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20    The statement 
4370: 61 62 6f 76 65 20 6d 61 79 20 61 70 70 65 61 72  above may appear
4380: 20 73 79 6e 74 61 63 74 69 63 61 6c 6c 79 20 69   syntactically i
4390: 6e 63 6f 72 72 65 63 74 20 74 6f 20 73 6f 6d 65  ncorrect to some
43a0: 2e 20 52 65 66 65 72 20 74 6f 0a 20 20 20 20 74  . Refer to.    t
43b0: 68 65 20 73 65 63 74 69 6f 6e 20 64 65 73 63 72  he section descr
43c0: 69 62 69 6e 67 20 74 68 65 20 5b 73 69 6d 70 6c  ibing the [simpl
43d0: 65 20 66 74 73 20 71 75 65 72 69 65 73 5d 20 66  e fts queries] f
43e0: 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f  or an explanatio
43f0: 6e 2e 0a 0a 20 20 3c 70 3e 0a 20 20 20 20 54 68  n...  <p>.    Th
4400: 65 72 65 20 69 73 20 61 6e 6f 74 68 65 72 2c 20  ere is another, 
4410: 64 65 70 72 65 63 61 74 65 64 2c 20 6d 65 74 68  deprecated, meth
4420: 6f 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20  od for invoking 
4430: 74 68 65 20 6f 70 74 69 6d 69 7a 65 20 0a 20 20  the optimize .  
4440: 20 20 6f 70 65 72 61 74 69 6f 6e 20 75 73 69 6e    operation usin
4450: 67 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  g a SELECT state
4460: 6d 65 6e 74 2e 20 4e 65 77 20 63 6f 64 65 20 73  ment. New code s
4470: 68 6f 75 6c 64 20 75 73 65 20 73 74 61 74 65 6d  hould use statem
4480: 65 6e 74 73 0a 20 20 20 20 73 69 6d 69 6c 61 72  ents.    similar
4490: 20 74 6f 20 74 68 65 20 49 4e 53 45 52 54 20 61   to the INSERT a
44a0: 62 6f 76 65 20 74 6f 20 6f 70 74 69 6d 69 7a 65  bove to optimize
44b0: 20 46 54 53 20 73 74 72 75 63 74 75 72 65 73 2e   FTS structures.
44c0: 0a 0a 3c 68 32 20 74 61 67 73 3d 22 73 69 6d 70  ..<h2 tags="simp
44d0: 6c 65 20 66 74 73 20 71 75 65 72 69 65 73 22 3e  le fts queries">
44e0: 53 69 6d 70 6c 65 20 46 54 53 20 51 75 65 72 69  Simple FTS Queri
44f0: 65 73 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a 20 20 41  es</h2>..<p>.  A
4500: 73 20 66 6f 72 20 61 6c 6c 20 6f 74 68 65 72 20  s for all other 
4510: 53 51 4c 69 74 65 20 74 61 62 6c 65 73 2c 20 76  SQLite tables, v
4520: 69 72 74 75 61 6c 20 6f 72 20 6f 74 68 65 72 77  irtual or otherw
4530: 69 73 65 2c 20 64 61 74 61 20 69 73 20 72 65 74  ise, data is ret
4540: 72 69 65 76 65 64 0a 20 20 66 72 6f 6d 20 46 54  rieved.  from FT
4550: 53 20 74 61 62 6c 65 73 20 75 73 69 6e 67 20 61  S tables using a
4560: 20 5b 53 45 4c 45 43 54 5d 20 73 74 61 74 65 6d   [SELECT] statem
4570: 65 6e 74 2e 0a 0a 3c 70 3e 0a 20 20 46 54 53 20  ent...<p>.  FTS 
4580: 74 61 62 6c 65 73 20 63 61 6e 20 62 65 20 71 75  tables can be qu
4590: 65 72 69 65 64 20 65 66 66 69 63 69 65 6e 74 6c  eried efficientl
45a0: 79 20 75 73 69 6e 67 20 53 45 4c 45 43 54 20 73  y using SELECT s
45b0: 74 61 74 65 6d 65 6e 74 73 20 6f 66 20 74 77 6f  tatements of two
45c0: 0a 20 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72  .  different for
45d0: 6d 73 3a 0a 0a 3c 75 6c 3e 0a 20 20 3c 6c 69 3e  ms:..<ul>.  <li>
45e0: 3c 70 3e 0a 20 20 20 20 3c 62 3e 51 75 65 72 79  <p>.    <b>Query
45f0: 20 62 79 20 72 6f 77 69 64 3c 2f 62 3e 2e 20 49   by rowid</b>. I
4600: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
4610: 73 65 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  se of the SELECT
4620: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 63   statement.    c
4630: 6f 6e 74 61 69 6e 73 20 61 20 73 75 62 2d 63 6c  ontains a sub-cl
4640: 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  ause of the form
4650: 20 22 72 6f 77 69 64 20 3d 20 3f 22 2c 20 77 68   "rowid = ?", wh
4660: 65 72 65 20 3f 20 69 73 20 61 6e 20 53 51 4c 20  ere ? is an SQL 
4670: 65 78 70 72 65 73 73 69 6f 6e 2c 0a 20 20 20 20  expression,.    
4680: 46 54 53 20 69 73 20 61 62 6c 65 20 74 6f 20 72  FTS is able to r
4690: 65 74 72 69 65 76 65 20 74 68 65 20 72 65 71 75  etrieve the requ
46a0: 65 73 74 65 64 20 72 6f 77 20 64 69 72 65 63 74  ested row direct
46b0: 6c 79 20 75 73 69 6e 67 20 74 68 65 20 65 71 75  ly using the equ
46c0: 69 76 61 6c 65 6e 74 20 0a 20 20 20 20 6f 66 20  ivalent .    of 
46d0: 61 6e 20 53 51 4c 69 74 65 20 5b 49 4e 54 45 47  an SQLite [INTEG
46e0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 5d 20  ER PRIMARY KEY] 
46f0: 69 6e 64 65 78 2e 0a 0a 20 20 3c 6c 69 3e 3c 70  index...  <li><p
4700: 3e 0a 20 20 20 20 3c 62 3e 46 75 6c 6c 2d 74 65  >.    <b>Full-te
4710: 78 74 20 71 75 65 72 79 3c 2f 62 3e 2e 20 49 66  xt query</b>. If
4720: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
4730: 65 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  e of the SELECT 
4740: 73 74 61 74 65 6d 65 6e 74 20 63 6f 6e 74 61 69  statement contai
4750: 6e 73 0a 20 20 20 20 61 20 73 75 62 2d 63 6c 61  ns.    a sub-cla
4760: 75 73 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  use of the form 
4770: 22 26 6c 74 3b 63 6f 6c 75 6d 6e 26 67 74 3b 20  "&lt;column&gt; 
4780: 4d 41 54 43 48 20 3f 22 2c 20 46 54 53 20 69 73  MATCH ?", FTS is
4790: 20 61 62 6c 65 20 74 6f 20 75 73 65 20 0a 20 20   able to use .  
47a0: 20 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 66    the built-in f
47b0: 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 20 74  ull-text index t
47c0: 6f 20 72 65 73 74 72 69 63 74 20 74 68 65 20 73  o restrict the s
47d0: 65 61 72 63 68 20 74 6f 20 74 68 6f 73 65 20 64  earch to those d
47e0: 6f 63 75 6d 65 6e 74 73 20 0a 20 20 20 20 74 68  ocuments .    th
47f0: 61 74 20 6d 61 74 63 68 20 74 68 65 20 66 75 6c  at match the ful
4800: 6c 2d 74 65 78 74 20 71 75 65 72 79 20 73 74 72  l-text query str
4810: 69 6e 67 20 73 70 65 63 69 66 69 65 64 20 61 73  ing specified as
4820: 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   the right-hand 
4830: 6f 70 65 72 61 6e 64 0a 20 20 20 20 6f 66 20 74  operand.    of t
4840: 68 65 20 4d 41 54 43 48 20 63 6c 61 75 73 65 2e  he MATCH clause.
4850: 0a 3c 2f 75 6c 3e 0a 0a 3c 70 3e 0a 20 20 49 66  .</ul>..<p>.  If
4860: 20 6e 65 69 74 68 65 72 20 6f 66 20 74 68 65 73   neither of thes
4870: 65 20 74 77 6f 20 71 75 65 72 79 20 73 74 72 61  e two query stra
4880: 74 65 67 69 65 73 20 63 61 6e 20 62 65 20 75 73  tegies can be us
4890: 65 64 2c 20 61 6c 6c 0a 20 20 71 75 65 72 69 65  ed, all.  querie
48a0: 73 20 6f 6e 20 46 54 53 20 74 61 62 6c 65 73 20  s on FTS tables 
48b0: 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20  are implemented 
48c0: 75 73 69 6e 67 20 61 20 6c 69 6e 65 61 72 20 73  using a linear s
48d0: 63 61 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72  can of the entir
48e0: 65 0a 20 20 74 61 62 6c 65 2e 20 49 66 20 74 68  e.  table. If th
48f0: 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73  e table contains
4900: 20 6c 61 72 67 65 20 61 6d 6f 75 6e 74 73 20 6f   large amounts o
4910: 66 20 64 61 74 61 2c 20 74 68 69 73 20 6d 61 79  f data, this may
4920: 20 62 65 20 61 6e 20 0a 20 20 69 6d 70 72 61 63   be an .  imprac
4930: 74 69 63 61 6c 20 61 70 70 72 6f 61 63 68 20 28  tical approach (
4940: 74 68 65 20 66 69 72 73 74 20 65 78 61 6d 70 6c  the first exampl
4950: 65 20 6f 6e 20 74 68 69 73 20 70 61 67 65 20 73  e on this page s
4960: 68 6f 77 73 20 74 68 61 74 20 61 20 6c 69 6e 65  hows that a line
4970: 61 72 0a 20 20 73 63 61 6e 20 6f 66 20 31 2e 35  ar.  scan of 1.5
4980: 20 47 42 20 6f 66 20 64 61 74 61 20 74 61 6b 65   GB of data take
4990: 73 20 61 72 6f 75 6e 64 20 33 30 20 73 65 63 6f  s around 30 seco
49a0: 6e 64 73 20 75 73 69 6e 67 20 61 20 6d 6f 64 65  nds using a mode
49b0: 72 6e 20 50 43 29 2e 0a 0a 3c 63 6f 64 65 62 6c  rn PC)...<codebl
49c0: 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d 20 54 68 65  ock>.  <i>-- The
49d0: 20 65 78 61 6d 70 6c 65 73 20 69 6e 20 74 68 69   examples in thi
49e0: 73 20 62 6c 6f 63 6b 20 61 73 73 75 6d 65 20 74  s block assume t
49f0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 46 54 53  he following FTS
4a00: 20 74 61 62 6c 65 3a 3c 2f 69 3e 0a 20 20 43 52   table:</i>.  CR
4a10: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
4a20: 4c 45 20 6d 61 69 6c 20 55 53 49 4e 47 20 66 74  LE mail USING ft
4a30: 73 33 28 73 75 62 6a 65 63 74 2c 20 62 6f 64 79  s3(subject, body
4a40: 29 3b 0a 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  );..  SELECT * F
4a50: 52 4f 4d 20 6d 61 69 6c 20 57 48 45 52 45 20 72  ROM mail WHERE r
4a60: 6f 77 69 64 20 3d 20 31 35 3b 20 20 20 20 20 20  owid = 15;      
4a70: 20 20 20 20 20 20 20 20 20 20 3c 69 3e 2d 2d 20            <i>-- 
4a80: 46 61 73 74 2e 20 52 6f 77 69 64 20 6c 6f 6f 6b  Fast. Rowid look
4a90: 75 70 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54  up.</i>.  SELECT
4aa0: 20 2a 20 46 52 4f 4d 20 6d 61 69 6c 20 57 48 45   * FROM mail WHE
4ab0: 52 45 20 62 6f 64 79 20 4d 41 54 43 48 20 27 73  RE body MATCH 's
4ac0: 71 6c 69 74 65 27 3b 20 20 20 20 20 20 20 3c 69  qlite';       <i
4ad0: 3e 2d 2d 20 46 61 73 74 2e 20 46 75 6c 6c 2d 74  >-- Fast. Full-t
4ae0: 65 78 74 20 71 75 65 72 79 2e 3c 2f 69 3e 0a 20  ext query.</i>. 
4af0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6d   SELECT * FROM m
4b00: 61 69 6c 20 57 48 45 52 45 20 6d 61 69 6c 20 4d  ail WHERE mail M
4b10: 41 54 43 48 20 27 73 65 61 72 63 68 27 3b 20 20  ATCH 'search';  
4b20: 20 20 20 20 20 3c 69 3e 2d 2d 20 46 61 73 74 2e       <i>-- Fast.
4b30: 20 46 75 6c 6c 2d 74 65 78 74 20 71 75 65 72 79   Full-text query
4b40: 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a  .</i>.  SELECT *
4b50: 20 46 52 4f 4d 20 6d 61 69 6c 20 57 48 45 52 45   FROM mail WHERE
4b60: 20 72 6f 77 69 64 20 42 45 54 57 45 45 4e 20 31   rowid BETWEEN 1
4b70: 35 20 41 4e 44 20 32 30 3b 20 20 20 3c 69 3e 2d  5 AND 20;   <i>-
4b80: 2d 20 53 6c 6f 77 2e 20 4c 69 6e 65 61 72 20 73  - Slow. Linear s
4b90: 63 61 6e 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43  can.</i>.  SELEC
4ba0: 54 20 2a 20 46 52 4f 4d 20 6d 61 69 6c 20 57 48  T * FROM mail WH
4bb0: 45 52 45 20 73 75 62 6a 65 63 74 20 3d 20 27 64  ERE subject = 'd
4bc0: 61 74 61 62 61 73 65 27 3b 20 20 20 20 20 20 3c  atabase';      <
4bd0: 69 3e 2d 2d 20 53 6c 6f 77 2e 20 4c 69 6e 65 61  i>-- Slow. Linea
4be0: 72 20 73 63 61 6e 2e 3c 2f 69 3e 0a 20 20 53 45  r scan.</i>.  SE
4bf0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6d 61 69 6c  LECT * FROM mail
4c00: 20 57 48 45 52 45 20 73 75 62 6a 65 63 74 20 4d   WHERE subject M
4c10: 41 54 43 48 20 27 64 61 74 61 62 61 73 65 27 3b  ATCH 'database';
4c20: 20 20 3c 69 3e 2d 2d 20 46 61 73 74 2e 20 46 75    <i>-- Fast. Fu
4c30: 6c 6c 2d 74 65 78 74 20 71 75 65 72 79 2e 3c 2f  ll-text query.</
4c40: 69 3e 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a  i>.</codeblock>.
4c50: 0a 3c 70 3e 0a 20 20 49 6e 20 61 6c 6c 20 6f 66  .<p>.  In all of
4c60: 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 71   the full-text q
4c70: 75 65 72 69 65 73 20 61 62 6f 76 65 2c 20 74 68  ueries above, th
4c80: 65 20 72 69 67 68 74 2d 68 61 6e 64 20 6f 70 65  e right-hand ope
4c90: 72 61 6e 64 20 6f 66 20 74 68 65 20 4d 41 54 43  rand of the MATC
4ca0: 48 0a 20 20 6f 70 65 72 61 74 6f 72 20 69 73 20  H.  operator is 
4cb0: 61 20 73 74 72 69 6e 67 20 63 6f 6e 73 69 73 74  a string consist
4cc0: 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ing of a single 
4cd0: 74 65 72 6d 2e 20 49 6e 20 74 68 69 73 20 63 61  term. In this ca
4ce0: 73 65 2c 20 74 68 65 20 4d 41 54 43 48 0a 20 20  se, the MATCH.  
4cf0: 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75  expression evalu
4d00: 61 74 65 73 20 74 6f 20 74 72 75 65 20 66 6f 72  ates to true for
4d10: 20 61 6c 6c 20 64 6f 63 75 6d 65 6e 74 73 20 74   all documents t
4d20: 68 61 74 20 63 6f 6e 74 61 69 6e 20 6f 6e 65 20  hat contain one 
4d30: 6f 72 20 6d 6f 72 65 20 0a 20 20 69 6e 73 74 61  or more .  insta
4d40: 6e 63 65 73 20 6f 66 20 74 68 65 20 73 70 65 63  nces of the spec
4d50: 69 66 69 65 64 20 77 6f 72 64 20 28 22 73 71 6c  ified word ("sql
4d60: 69 74 65 22 2c 20 22 73 65 61 72 63 68 22 20 6f  ite", "search" o
4d70: 72 20 22 64 61 74 61 62 61 73 65 22 2c 20 64 65  r "database", de
4d80: 70 65 6e 64 69 6e 67 20 0a 20 20 6f 6e 20 77 68  pending .  on wh
4d90: 69 63 68 20 65 78 61 6d 70 6c 65 20 79 6f 75 20  ich example you 
4da0: 6c 6f 6f 6b 20 61 74 29 2e 20 53 70 65 63 69 66  look at). Specif
4db0: 79 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 74 65  ying a single te
4dc0: 72 6d 20 61 73 20 74 68 65 20 72 69 67 68 74 2d  rm as the right-
4dd0: 68 61 6e 64 0a 20 20 6f 70 65 72 61 6e 64 20 6f  hand.  operand o
4de0: 66 20 74 68 65 20 4d 41 54 43 48 20 6f 70 65 72  f the MATCH oper
4df0: 61 74 6f 72 20 72 65 73 75 6c 74 73 20 69 6e 20  ator results in 
4e00: 74 68 65 20 73 69 6d 70 6c 65 73 74 20 61 6e 64  the simplest and
4e10: 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e 20 74 79 70   most common typ
4e20: 65 20 0a 20 20 6f 66 20 66 75 6c 6c 2d 74 65 78  e .  of full-tex
4e30: 74 20 71 75 65 72 79 20 70 6f 73 73 69 62 6c 65  t query possible
4e40: 2e 20 48 6f 77 65 76 65 72 20 6d 6f 72 65 20 63  . However more c
4e50: 6f 6d 70 6c 69 63 61 74 65 64 20 71 75 65 72 69  omplicated queri
4e60: 65 73 20 61 72 65 20 70 6f 73 73 69 62 6c 65 2c  es are possible,
4e70: 0a 20 20 69 6e 63 6c 75 64 69 6e 67 20 70 68 72  .  including phr
4e80: 61 73 65 20 73 65 61 72 63 68 65 73 2c 20 74 65  ase searches, te
4e90: 72 6d 2d 70 72 65 66 69 78 20 73 65 61 72 63 68  rm-prefix search
4ea0: 65 73 20 61 6e 64 20 73 65 61 72 63 68 65 73 20  es and searches 
4eb0: 66 6f 72 20 64 6f 63 75 6d 65 6e 74 73 20 0a 20  for documents . 
4ec0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 6d 62   containing comb
4ed0: 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74 65 72 6d  inations of term
4ee0: 73 20 6f 63 63 75 72 69 6e 67 20 77 69 74 68 69  s occuring withi
4ef0: 6e 20 61 20 64 65 66 69 6e 65 64 20 70 72 6f 78  n a defined prox
4f00: 69 6d 69 74 79 20 6f 66 20 65 61 63 68 0a 20 20  imity of each.  
4f10: 6f 74 68 65 72 2e 20 54 68 65 20 76 61 72 69 6f  other. The vario
4f20: 75 73 20 77 61 79 73 20 69 6e 20 77 68 69 63 68  us ways in which
4f30: 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 69   the full-text i
4f40: 6e 64 65 78 20 6d 61 79 20 62 65 20 71 75 65 72  ndex may be quer
4f50: 69 65 64 20 61 72 65 0a 20 20 5b 46 54 53 20 4d  ied are.  [FTS M
4f60: 41 54 43 48 7c 64 65 73 63 72 69 62 65 64 20 62  ATCH|described b
4f70: 65 6c 6f 77 5d 2e 0a 0a 3c 70 3e 0a 20 20 4e 6f  elow]...<p>.  No
4f80: 72 6d 61 6c 6c 79 2c 20 66 75 6c 6c 2d 74 65 78  rmally, full-tex
4f90: 74 20 71 75 65 72 69 65 73 20 61 72 65 20 63 61  t queries are ca
4fa0: 73 65 2d 69 6e 73 65 6e 73 69 74 69 76 65 2e 20  se-insensitive. 
4fb0: 48 6f 77 65 76 65 72 2c 20 74 68 69 73 20 69 73  However, this is
4fc0: 0a 20 20 69 73 20 64 65 70 65 6e 64 65 6e 74 20  .  is dependent 
4fd0: 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 63 20  on the specific 
4fe0: 5b 74 6f 6b 65 6e 69 7a 65 72 5d 20 75 73 65 64  [tokenizer] used
4ff0: 20 62 79 20 74 68 65 20 46 54 53 20 74 61 62 6c   by the FTS tabl
5000: 65 0a 20 20 62 65 69 6e 67 20 71 75 65 72 69 65  e.  being querie
5010: 64 2e 20 52 65 66 65 72 20 74 6f 20 74 68 65 20  d. Refer to the 
5020: 73 65 63 74 69 6f 6e 20 6f 6e 20 5b 74 6f 6b 65  section on [toke
5030: 6e 69 7a 65 72 7c 74 6f 6b 65 6e 69 7a 65 72 73  nizer|tokenizers
5040: 5d 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 0a  ] for details...
5050: 3c 70 3e 0a 20 20 54 68 65 20 70 61 72 61 67 72  <p>.  The paragr
5060: 61 70 68 20 61 62 6f 76 65 20 6e 6f 74 65 73 20  aph above notes 
5070: 74 68 61 74 20 61 20 4d 41 54 43 48 20 6f 70 65  that a MATCH ope
5080: 72 61 74 6f 72 20 77 69 74 68 20 61 20 73 69 6d  rator with a sim
5090: 70 6c 65 20 74 65 72 6d 20 61 73 20 74 68 65 0a  ple term as the.
50a0: 20 20 72 69 67 68 74 2d 68 61 6e 64 20 6f 70 65    right-hand ope
50b0: 72 61 6e 64 20 65 76 61 6c 75 61 74 65 73 20 74  rand evaluates t
50c0: 6f 20 74 72 75 65 20 66 6f 72 20 61 6c 6c 20 64  o true for all d
50d0: 6f 63 75 6d 65 6e 74 73 20 74 68 61 74 20 63 6f  ocuments that co
50e0: 6e 74 61 69 6e 20 74 68 65 0a 20 20 73 70 65 63  ntain the.  spec
50f0: 69 66 69 65 64 20 74 65 72 6d 2e 20 49 6e 20 74  ified term. In t
5100: 68 69 73 20 63 6f 6e 74 65 78 74 2c 20 74 68 65  his context, the
5110: 20 22 64 6f 63 75 6d 65 6e 74 22 20 6d 61 79 20   "document" may 
5120: 72 65 66 65 72 20 74 6f 20 65 69 74 68 65 72 20  refer to either 
5130: 74 68 65 20 0a 20 20 64 61 74 61 20 73 74 6f 72  the .  data stor
5140: 65 64 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 63  ed in a single c
5150: 6f 6c 75 6d 6e 20 6f 66 20 61 20 72 6f 77 20 6f  olumn of a row o
5160: 66 20 61 6e 20 46 54 53 20 74 61 62 6c 65 2c 20  f an FTS table, 
5170: 6f 72 20 74 6f 20 74 68 65 20 63 6f 6e 74 65 6e  or to the conten
5180: 74 73 0a 20 20 6f 66 20 61 6c 6c 20 63 6f 6c 75  ts.  of all colu
5190: 6d 6e 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20  mns in a single 
51a0: 72 6f 77 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f  row, depending o
51b0: 6e 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72  n the identifier
51c0: 20 75 73 65 64 20 61 73 20 74 68 65 0a 20 20 6c   used as the.  l
51d0: 65 66 74 2d 68 61 6e 64 20 6f 70 65 72 61 6e 64  eft-hand operand
51e0: 20 74 6f 20 74 68 65 20 4d 41 54 43 48 20 6f 70   to the MATCH op
51f0: 65 72 61 74 6f 72 2e 20 49 66 20 74 68 65 20 69  erator. If the i
5200: 64 65 6e 74 69 66 69 65 72 20 73 70 65 63 69 66  dentifier specif
5210: 69 65 64 20 61 73 0a 20 20 74 68 65 20 6c 65 66  ied as.  the lef
5220: 74 2d 68 61 6e 64 20 6f 70 65 72 61 6e 64 20 6f  t-hand operand o
5230: 66 20 74 68 65 20 4d 41 54 43 48 20 6f 70 65 72  f the MATCH oper
5240: 61 74 6f 72 20 69 73 20 61 6e 20 46 54 53 20 74  ator is an FTS t
5250: 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  able column name
5260: 2c 0a 20 20 74 68 65 6e 20 74 68 65 20 64 6f 63  ,.  then the doc
5270: 75 6d 65 6e 74 20 74 68 61 74 20 74 68 65 20 73  ument that the s
5280: 65 61 72 63 68 20 74 65 72 6d 20 6d 75 73 74 20  earch term must 
5290: 62 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  be contained in 
52a0: 69 73 20 74 68 65 20 76 61 6c 75 65 0a 20 20 73  is the value.  s
52b0: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 73 70 65  tored in the spe
52c0: 63 69 66 69 65 64 20 63 6f 6c 75 6d 6e 2e 20 48  cified column. H
52d0: 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 69  owever, if the i
52e0: 64 65 6e 74 69 66 69 65 72 20 69 73 20 74 68 65  dentifier is the
52f0: 20 6e 61 6d 65 0a 20 20 6f 66 20 74 68 65 20 46   name.  of the F
5300: 54 53 20 3c 69 3e 74 61 62 6c 65 3c 2f 69 3e 20  TS <i>table</i> 
5310: 69 74 73 65 6c 66 2c 20 74 68 65 6e 20 74 68 65  itself, then the
5320: 20 4d 41 54 43 48 20 6f 70 65 72 61 74 6f 72 20   MATCH operator 
5330: 65 76 61 6c 75 61 74 65 73 20 74 6f 20 74 72 75  evaluates to tru
5340: 65 0a 20 20 66 6f 72 20 65 61 63 68 20 72 6f 77  e.  for each row
5350: 20 6f 66 20 74 68 65 20 46 54 53 20 74 61 62 6c   of the FTS tabl
5360: 65 20 66 6f 72 20 77 68 69 63 68 20 61 6e 79 20  e for which any 
5370: 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20  column contains 
5380: 74 68 65 20 73 65 61 72 63 68 20 0a 20 20 74 65  the search .  te
5390: 72 6d 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  rm. The followin
53a0: 67 20 65 78 61 6d 70 6c 65 20 64 65 6d 6f 6e 73  g example demons
53b0: 74 72 61 74 65 73 20 74 68 69 73 3a 0a 0a 3c 63  trates this:..<c
53c0: 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d  odeblock>.  <i>-
53d0: 2d 20 45 78 61 6d 70 6c 65 20 73 63 68 65 6d 61  - Example schema
53e0: 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45 20 56 49  </i>.  CREATE VI
53f0: 52 54 55 41 4c 20 54 41 42 4c 45 20 6d 61 69 6c  RTUAL TABLE mail
5400: 20 55 53 49 4e 47 20 66 74 73 33 28 73 75 62 6a   USING fts3(subj
5410: 65 63 74 2c 20 62 6f 64 79 29 3b 0a 0a 20 20 3c  ect, body);..  <
5420: 69 3e 2d 2d 20 45 78 61 6d 70 6c 65 20 74 61 62  i>-- Example tab
5430: 6c 65 20 70 6f 70 75 6c 61 74 69 6f 6e 3c 2f 69  le population</i
5440: 3e 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  >.  INSERT INTO 
5450: 6d 61 69 6c 28 64 6f 63 69 64 2c 20 73 75 62 6a  mail(docid, subj
5460: 65 63 74 2c 20 62 6f 64 79 29 20 56 41 4c 55 45  ect, body) VALUE
5470: 53 28 31 2c 20 27 73 6f 66 74 77 61 72 65 20 66  S(1, 'software f
5480: 65 65 64 62 61 63 6b 27 2c 20 27 66 6f 75 6e 64  eedback', 'found
5490: 20 69 74 20 74 6f 6f 20 73 6c 6f 77 27 29 3b 0a   it too slow');.
54a0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6d 61    INSERT INTO ma
54b0: 69 6c 28 64 6f 63 69 64 2c 20 73 75 62 6a 65 63  il(docid, subjec
54c0: 74 2c 20 62 6f 64 79 29 20 56 41 4c 55 45 53 28  t, body) VALUES(
54d0: 32 2c 20 27 73 6f 66 74 77 61 72 65 20 66 65 65  2, 'software fee
54e0: 64 62 61 63 6b 27 2c 20 27 6e 6f 20 66 65 65 64  dback', 'no feed
54f0: 62 61 63 6b 27 29 3b 0a 20 20 49 4e 53 45 52 54  back');.  INSERT
5500: 20 49 4e 54 4f 20 6d 61 69 6c 28 64 6f 63 69 64   INTO mail(docid
5510: 2c 20 73 75 62 6a 65 63 74 2c 20 62 6f 64 79 29  , subject, body)
5520: 20 56 41 4c 55 45 53 28 33 2c 20 27 73 6c 6f 77   VALUES(3, 'slow
5530: 20 6c 75 6e 63 68 20 6f 72 64 65 72 27 2c 20 20   lunch order',  
5540: 27 77 61 73 20 61 20 73 6f 66 74 77 61 72 65 20  'was a software 
5550: 70 72 6f 62 6c 65 6d 27 29 3b 0a 0a 20 20 3c 69  problem');..  <i
5560: 3e 2d 2d 20 45 78 61 6d 70 6c 65 20 71 75 65 72  >-- Example quer
5570: 69 65 73 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54  ies</i>.  SELECT
5580: 20 2a 20 46 52 4f 4d 20 6d 61 69 6c 20 57 48 45   * FROM mail WHE
5590: 52 45 20 73 75 62 6a 65 63 74 20 4d 41 54 43 48  RE subject MATCH
55a0: 20 27 73 6f 66 74 77 61 72 65 27 3b 20 20 20 20   'software';    
55b0: 3c 69 3e 2d 2d 20 53 65 6c 65 63 74 73 20 72 6f  <i>-- Selects ro
55c0: 77 73 20 31 20 61 6e 64 20 32 3c 2f 69 3e 0a 20  ws 1 and 2</i>. 
55d0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6d   SELECT * FROM m
55e0: 61 69 6c 20 57 48 45 52 45 20 62 6f 64 79 20 20  ail WHERE body  
55f0: 20 20 4d 41 54 43 48 20 27 66 65 65 64 62 61 63    MATCH 'feedbac
5600: 6b 27 3b 20 20 20 20 3c 69 3e 2d 2d 20 53 65 6c  k';    <i>-- Sel
5610: 65 63 74 73 20 72 6f 77 20 32 3c 2f 69 3e 0a 20  ects row 2</i>. 
5620: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6d   SELECT * FROM m
5630: 61 69 6c 20 57 48 45 52 45 20 6d 61 69 6c 20 20  ail WHERE mail  
5640: 20 20 4d 41 54 43 48 20 27 73 6f 66 74 77 61 72    MATCH 'softwar
5650: 65 27 3b 20 20 20 20 3c 69 3e 2d 2d 20 53 65 6c  e';    <i>-- Sel
5660: 65 63 74 73 20 72 6f 77 73 20 31 2c 20 32 20 61  ects rows 1, 2 a
5670: 6e 64 20 33 3c 2f 69 3e 0a 20 20 53 45 4c 45 43  nd 3</i>.  SELEC
5680: 54 20 2a 20 46 52 4f 4d 20 6d 61 69 6c 20 57 48  T * FROM mail WH
5690: 45 52 45 20 6d 61 69 6c 20 20 20 20 4d 41 54 43  ERE mail    MATC
56a0: 48 20 27 73 6c 6f 77 27 3b 20 20 20 20 20 20 20  H 'slow';       
56b0: 20 3c 69 3e 2d 2d 20 53 65 6c 65 63 74 73 20 72   <i>-- Selects r
56c0: 6f 77 73 20 31 20 61 6e 64 20 33 3c 2f 69 3e 0a  ows 1 and 3</i>.
56d0: 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 0a  </codeblock>.  .
56e0: 3c 70 3e 0a 20 20 41 74 20 66 69 72 73 74 20 67  <p>.  At first g
56f0: 6c 61 6e 63 65 2c 20 74 68 65 20 66 69 6e 61 6c  lance, the final
5700: 20 74 77 6f 20 66 75 6c 6c 2d 74 65 78 74 20 71   two full-text q
5710: 75 65 72 69 65 73 20 69 6e 20 74 68 65 20 65 78  ueries in the ex
5720: 61 6d 70 6c 65 20 61 62 6f 76 65 20 73 65 65 6d  ample above seem
5730: 0a 20 20 74 6f 20 62 65 20 73 79 6e 74 61 63 74  .  to be syntact
5740: 69 63 61 6c 6c 79 20 69 6e 63 6f 72 72 65 63 74  ically incorrect
5750: 2c 20 61 73 20 74 68 65 72 65 20 69 73 20 61 20  , as there is a 
5760: 74 61 62 6c 65 20 6e 61 6d 65 20 28 22 6d 61 69  table name ("mai
5770: 6c 22 29 20 75 73 65 64 20 61 73 0a 20 20 61 6e  l") used as.  an
5780: 20 53 51 4c 20 65 78 70 72 65 73 73 69 6f 6e 2e   SQL expression.
5790: 20 54 68 65 20 72 65 61 73 6f 6e 20 74 68 69 73   The reason this
57a0: 20 69 73 20 61 63 63 65 70 74 61 62 6c 65 20 69   is acceptable i
57b0: 73 20 74 68 61 74 20 65 61 63 68 20 46 54 53 20  s that each FTS 
57c0: 74 61 62 6c 65 0a 20 20 61 63 74 75 61 6c 6c 79  table.  actually
57d0: 20 68 61 73 20 61 20 5b 73 71 6c 69 74 65 33 5f   has a [sqlite3_
57e0: 64 65 63 6c 61 72 65 5f 76 74 61 62 7c 48 49 44  declare_vtab|HID
57f0: 44 45 4e 5d 20 63 6f 6c 75 6d 6e 20 77 69 74 68  DEN] column with
5800: 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 0a 20   the same name. 
5810: 20 61 73 20 74 68 65 20 74 61 62 6c 65 20 69 74   as the table it
5820: 73 65 6c 66 20 28 69 6e 20 74 68 69 73 20 63 61  self (in this ca
5830: 73 65 2c 20 22 6d 61 69 6c 22 29 2e 20 54 68 65  se, "mail"). The
5840: 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
5850: 20 74 68 69 73 0a 20 20 63 6f 6c 75 6d 6e 20 69   this.  column i
5860: 73 20 6e 6f 74 20 6d 65 61 6e 69 6e 67 66 75 6c  s not meaningful
5870: 20 74 6f 20 74 68 65 20 61 70 70 6c 69 63 61 74   to the applicat
5880: 69 6f 6e 2c 20 62 75 74 20 63 61 6e 20 62 65 20  ion, but can be 
5890: 75 73 65 64 20 61 73 20 74 68 65 20 0a 20 20 6c  used as the .  l
58a0: 65 66 74 2d 68 61 6e 64 20 6f 70 65 72 61 6e 64  eft-hand operand
58b0: 20 74 6f 20 61 20 4d 41 54 43 48 20 6f 70 65 72   to a MATCH oper
58c0: 61 74 6f 72 2e 20 54 68 69 73 20 73 70 65 63 69  ator. This speci
58d0: 61 6c 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 61 6c  al column may al
58e0: 73 6f 20 62 65 0a 20 20 70 61 73 73 65 64 20 61  so be.  passed a
58f0: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f  s an argument to
5900: 20 74 68 65 20 5b 73 6e 69 70 70 65 74 28 29 7c   the [snippet()|
5910: 46 54 53 20 61 75 78 69 6c 69 61 72 79 20 66 75  FTS auxiliary fu
5920: 6e 63 74 69 6f 6e 73 5d 2e 0a 0a 3c 70 3e 0a 20  nctions]...<p>. 
5930: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65   The following e
5940: 78 61 6d 70 6c 65 20 69 6c 6c 75 73 74 72 61 74  xample illustrat
5950: 65 73 20 74 68 65 20 61 62 6f 76 65 2e 20 54 68  es the above. Th
5960: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 22 64  e expressions "d
5970: 6f 63 73 22 2c 20 0a 20 20 22 64 6f 63 73 2e 64  ocs", .  "docs.d
5980: 6f 63 73 22 20 61 6e 64 20 22 6d 61 69 6e 2e 64  ocs" and "main.d
5990: 6f 63 73 2e 64 6f 63 73 22 20 61 6c 6c 20 72 65  ocs.docs" all re
59a0: 66 65 72 20 74 6f 20 63 6f 6c 75 6d 6e 20 22 64  fer to column "d
59b0: 6f 63 73 22 2e 20 48 6f 77 65 76 65 72 2c 20 74  ocs". However, t
59c0: 68 65 20 0a 20 20 65 78 70 72 65 73 73 69 6f 6e  he .  expression
59d0: 20 22 6d 61 69 6e 2e 64 6f 63 73 22 20 64 6f 65   "main.docs" doe
59e0: 73 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 20 61  s not refer to a
59f0: 6e 79 20 63 6f 6c 75 6d 6e 2e 20 49 74 20 63 6f  ny column. It co
5a00: 75 6c 64 20 62 65 20 75 73 65 64 20 74 6f 20 0a  uld be used to .
5a10: 20 20 72 65 66 65 72 20 74 6f 20 61 20 74 61 62    refer to a tab
5a20: 6c 65 2c 20 62 75 74 20 61 20 74 61 62 6c 65 20  le, but a table 
5a30: 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  name is not allo
5a40: 77 65 64 20 69 6e 20 74 68 65 20 63 6f 6e 74 65  wed in the conte
5a50: 78 74 20 69 6e 20 77 68 69 63 68 0a 20 20 69 74  xt in which.  it
5a60: 20 69 73 20 75 73 65 64 20 62 65 6c 6f 77 2e 0a   is used below..
5a70: 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c  .<codeblock>.  <
5a80: 69 3e 2d 2d 20 45 78 61 6d 70 6c 65 20 73 63 68  i>-- Example sch
5a90: 65 6d 61 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45  ema</i>.  CREATE
5aa0: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 64   VIRTUAL TABLE d
5ab0: 6f 63 73 20 55 53 49 4e 47 20 66 74 73 34 28 63  ocs USING fts4(c
5ac0: 6f 6e 74 65 6e 74 29 3b 0a 0a 20 20 3c 69 3e 2d  ontent);..  <i>-
5ad0: 2d 20 45 78 61 6d 70 6c 65 20 71 75 65 72 69 65  - Example querie
5ae0: 73 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a  s</i>.  SELECT *
5af0: 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45   FROM docs WHERE
5b00: 20 64 6f 63 73 20 4d 41 54 43 48 20 27 73 71 6c   docs MATCH 'sql
5b10: 69 74 65 27 3b 20 20 20 20 20 20 20 20 20 20 20  ite';           
5b20: 20 20 20 3c 69 3e 2d 2d 20 4f 4b 2e 3c 2f 69 3e     <i>-- OK.</i>
5b30: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
5b40: 20 64 6f 63 73 20 57 48 45 52 45 20 64 6f 63 73   docs WHERE docs
5b50: 2e 64 6f 63 73 20 4d 41 54 43 48 20 27 73 71 6c  .docs MATCH 'sql
5b60: 69 74 65 27 3b 20 20 20 20 20 20 20 20 20 3c 69  ite';         <i
5b70: 3e 2d 2d 20 4f 4b 2e 3c 2f 69 3e 0a 20 20 53 45  >-- OK.</i>.  SE
5b80: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73  LECT * FROM docs
5b90: 20 57 48 45 52 45 20 6d 61 69 6e 2e 64 6f 63 73   WHERE main.docs
5ba0: 2e 64 6f 63 73 20 4d 41 54 43 48 20 27 73 71 6c  .docs MATCH 'sql
5bb0: 69 74 65 27 3b 20 20 20 20 3c 69 3e 2d 2d 20 4f  ite';    <i>-- O
5bc0: 4b 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20  K.</i>.  SELECT 
5bd0: 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52  * FROM docs WHER
5be0: 45 20 6d 61 69 6e 2e 64 6f 63 73 20 4d 41 54 43  E main.docs MATC
5bf0: 48 20 27 73 71 6c 69 74 65 27 3b 20 20 20 20 20  H 'sqlite';     
5c00: 20 20 20 20 3c 69 3e 2d 2d 20 45 72 72 6f 72 2e      <i>-- Error.
5c10: 3c 2f 69 3e 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b  </i>.</codeblock
5c20: 3e 0a 20 0a 3c 68 32 3e 53 75 6d 6d 61 72 79 3c  >. .<h2>Summary<
5c30: 2f 68 32 3e 0a 0a 3c 70 3e 0a 20 20 46 72 6f 6d  /h2>..<p>.  From
5c40: 20 74 68 65 20 75 73 65 72 73 20 70 6f 69 6e 74   the users point
5c50: 20 6f 66 20 76 69 65 77 2c 20 46 54 53 20 74 61   of view, FTS ta
5c60: 62 6c 65 73 20 61 72 65 20 73 69 6d 69 6c 61 72  bles are similar
5c70: 20 74 6f 20 6f 72 64 69 6e 61 72 79 20 53 51 4c   to ordinary SQL
5c80: 69 74 65 0a 20 20 74 61 62 6c 65 73 20 69 6e 20  ite.  tables in 
5c90: 6d 61 6e 79 20 77 61 79 73 2e 20 44 61 74 61 20  many ways. Data 
5ca0: 6d 61 79 20 62 65 20 61 64 64 65 64 20 74 6f 2c  may be added to,
5cb0: 20 6d 6f 64 69 66 69 65 64 20 77 69 74 68 69 6e   modified within
5cc0: 20 61 6e 64 20 72 65 6d 6f 76 65 64 20 0a 20 20   and removed .  
5cd0: 66 72 6f 6d 20 46 54 53 20 74 61 62 6c 65 73 20  from FTS tables 
5ce0: 75 73 69 6e 67 20 74 68 65 20 49 4e 53 45 52 54  using the INSERT
5cf0: 2c 20 55 50 44 41 54 45 20 61 6e 64 20 44 45 4c  , UPDATE and DEL
5d00: 45 54 45 20 63 6f 6d 6d 61 6e 64 73 20 6a 75 73  ETE commands jus
5d10: 74 20 61 73 20 0a 20 20 69 74 20 6d 61 79 20 62  t as .  it may b
5d20: 65 20 77 69 74 68 20 6f 72 64 69 6e 61 72 79 20  e with ordinary 
5d30: 74 61 62 6c 65 73 2e 20 53 69 6d 69 6c 61 72 6c  tables. Similarl
5d40: 79 2c 20 74 68 65 20 53 45 4c 45 43 54 20 63 6f  y, the SELECT co
5d50: 6d 6d 61 6e 64 20 6d 61 79 20 62 65 20 75 73 65  mmand may be use
5d60: 64 20 0a 20 20 74 6f 20 71 75 65 72 79 20 64 61  d .  to query da
5d70: 74 61 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  ta. The followin
5d80: 67 20 6c 69 73 74 20 73 75 6d 6d 61 72 69 7a 65  g list summarize
5d90: 73 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65  s the difference
5da0: 73 20 62 65 74 77 65 65 6e 20 46 54 53 0a 20 20  s between FTS.  
5db0: 61 6e 64 20 6f 72 64 69 6e 61 72 79 20 74 61 62  and ordinary tab
5dc0: 6c 65 73 3a 0a 0a 3c 6f 6c 3e 0a 20 20 3c 6c 69  les:..<ol>.  <li
5dd0: 3e 3c 70 3e 20 0a 20 20 20 20 41 73 20 77 69 74  ><p> .    As wit
5de0: 68 20 61 6c 6c 20 76 69 72 74 75 61 6c 20 74 61  h all virtual ta
5df0: 62 6c 65 20 74 79 70 65 73 2c 20 69 74 20 69 73  ble types, it is
5e00: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
5e10: 20 63 72 65 61 74 65 20 69 6e 64 69 63 65 73 20   create indices 
5e20: 6f 72 0a 20 20 20 20 74 72 69 67 67 65 72 73 20  or.    triggers 
5e30: 61 74 74 61 63 68 65 64 20 74 6f 20 46 54 53 20  attached to FTS 
5e40: 74 61 62 6c 65 73 2e 20 4e 6f 72 20 69 73 20 69  tables. Nor is i
5e50: 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73  t possible to us
5e60: 65 20 74 68 65 20 41 4c 54 45 52 20 54 41 42 4c  e the ALTER TABL
5e70: 45 0a 20 20 20 20 63 6f 6d 6d 61 6e 64 20 74 6f  E.    command to
5e80: 20 61 64 64 20 65 78 74 72 61 20 63 6f 6c 75 6d   add extra colum
5e90: 6e 73 20 74 6f 20 46 54 53 20 74 61 62 6c 65 73  ns to FTS tables
5ea0: 20 28 61 6c 74 68 6f 75 67 68 20 69 74 20 69 73   (although it is
5eb0: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65   possible to use
5ec0: 0a 20 20 20 20 41 4c 54 45 52 20 54 41 42 4c 45  .    ALTER TABLE
5ed0: 20 74 6f 20 72 65 6e 61 6d 65 20 61 6e 20 46 54   to rename an FT
5ee0: 53 20 74 61 62 6c 65 29 2e 0a 0a 20 20 3c 6c 69  S table)...  <li
5ef0: 3e 3c 70 3e 20 0a 20 20 20 20 44 61 74 61 2d 74  ><p> .    Data-t
5f00: 79 70 65 73 20 73 70 65 63 69 66 69 65 64 20 61  ypes specified a
5f10: 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 22 43  s part of the "C
5f20: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
5f30: 42 4c 45 22 20 73 74 61 74 65 6d 65 6e 74 0a 20  BLE" statement. 
5f40: 20 20 20 75 73 65 64 20 74 6f 20 63 72 65 61 74     used to creat
5f50: 65 20 61 6e 20 46 54 53 20 74 61 62 6c 65 20 61  e an FTS table a
5f60: 72 65 20 69 67 6e 6f 72 65 64 20 63 6f 6d 70 6c  re ignored compl
5f70: 65 74 65 6c 79 2e 20 49 6e 73 74 65 61 64 20 6f  etely. Instead o
5f80: 66 20 74 68 65 0a 20 20 20 20 6e 6f 72 6d 61 6c  f the.    normal
5f90: 20 72 75 6c 65 73 20 66 6f 72 20 61 70 70 6c 79   rules for apply
5fa0: 69 6e 67 20 74 79 70 65 20 5b 61 66 66 69 6e 69  ing type [affini
5fb0: 74 79 5d 20 74 6f 20 69 6e 73 65 72 74 65 64 20  ty] to inserted 
5fc0: 76 61 6c 75 65 73 2c 20 61 6c 6c 0a 20 20 20 20  values, all.    
5fd0: 76 61 6c 75 65 73 20 69 6e 73 65 72 74 65 64 20  values inserted 
5fe0: 69 6e 74 6f 20 46 54 53 20 74 61 62 6c 65 20 63  into FTS table c
5ff0: 6f 6c 75 6d 6e 73 20 28 65 78 63 65 70 74 20 74  olumns (except t
6000: 68 65 20 73 70 65 63 69 61 6c 20 72 6f 77 69 64  he special rowid
6010: 0a 20 20 20 20 63 6f 6c 75 6d 6e 29 20 61 72 65  .    column) are
6020: 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 74 79   converted to ty
6030: 70 65 20 54 45 58 54 20 62 65 66 6f 72 65 20 62  pe TEXT before b
6040: 65 69 6e 67 20 73 74 6f 72 65 64 2e 0a 0a 20 20  eing stored...  
6050: 3c 6c 69 3e 3c 70 3e 20 0a 20 20 20 20 46 54 53  <li><p> .    FTS
6060: 20 74 61 62 6c 65 73 20 70 65 72 6d 69 74 20 74   tables permit t
6070: 68 65 20 73 70 65 63 69 61 6c 20 61 6c 69 61 73  he special alias
6080: 20 22 64 6f 63 69 64 22 20 74 6f 20 62 65 20 75   "docid" to be u
6090: 73 65 64 20 74 6f 20 72 65 66 65 72 20 74 6f 20  sed to refer to 
60a0: 74 68 65 0a 20 20 20 20 72 6f 77 69 64 20 63 6f  the.    rowid co
60b0: 6c 75 6d 6e 20 73 75 70 70 6f 72 74 65 64 20 62  lumn supported b
60c0: 79 20 61 6c 6c 20 5b 76 69 72 74 75 61 6c 20 74  y all [virtual t
60d0: 61 62 6c 65 73 5d 2e 0a 0a 20 20 3c 6c 69 3e 3c  ables]...  <li><
60e0: 70 3e 20 0a 20 20 20 20 54 68 65 20 5b 46 54 53  p> .    The [FTS
60f0: 20 4d 41 54 43 48 5d 20 6f 70 65 72 61 74 6f 72   MATCH] operator
6100: 20 69 73 20 73 75 70 70 6f 72 74 65 64 20 66 6f   is supported fo
6110: 72 20 71 75 65 72 69 65 73 20 62 61 73 65 64 20  r queries based 
6120: 6f 6e 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 0a  on the built-in.
6130: 20 20 20 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e      full-text in
6140: 64 65 78 2e 20 0a 0a 20 20 3c 6c 69 3e 3c 70 3e  dex. ..  <li><p>
6150: 20 0a 20 20 20 20 54 68 65 20 5b 46 54 53 20 61   .    The [FTS a
6160: 75 78 69 6c 69 61 72 79 20 66 75 6e 63 74 69 6f  uxiliary functio
6170: 6e 73 5d 2c 20 5b 73 6e 69 70 70 65 74 28 29 5d  ns], [snippet()]
6180: 2c 20 5b 6f 66 66 73 65 74 73 28 29 5d 2c 20 61  , [offsets()], a
6190: 6e 64 20 5b 6d 61 74 63 68 69 6e 66 6f 28 29 5d  nd [matchinfo()]
61a0: 20 61 72 65 20 0a 20 20 20 20 61 76 61 69 6c 61   are .    availa
61b0: 62 6c 65 20 74 6f 20 73 75 70 70 6f 72 74 20 66  ble to support f
61c0: 75 6c 6c 2d 74 65 78 74 20 71 75 65 72 69 65 73  ull-text queries
61d0: 2e 0a 0a 20 20 3c 6c 69 3e 3c 70 3e 0a 20 20 20  ...  <li><p>.   
61e0: 20 3c 74 63 6c 3e 68 64 5f 66 72 61 67 6d 65 6e   <tcl>hd_fragmen
61f0: 74 20 68 69 64 64 65 6e 63 6f 6c 20 7b 46 54 53  t hiddencol {FTS
6200: 20 68 69 64 64 65 6e 20 63 6f 6c 75 6d 6e 7d 3c   hidden column}<
6210: 2f 74 63 6c 3e 0a 20 20 20 20 45 76 65 72 79 20  /tcl>.    Every 
6220: 46 54 53 20 74 61 62 6c 65 20 68 61 73 20 61 20  FTS table has a 
6230: 5b 68 69 64 64 65 6e 20 63 6f 6c 75 6d 6e 5d 20  [hidden column] 
6240: 77 69 74 68 20 74 68 65 20 0a 20 20 20 20 73 61  with the .    sa
6250: 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 74  me name as the t
6260: 61 62 6c 65 20 69 74 73 65 6c 66 2e 20 54 68 65  able itself. The
6270: 20 76 61 6c 75 65 20 63 6f 6e 74 61 69 6e 65 64   value contained
6280: 20 69 6e 20 65 61 63 68 20 72 6f 77 20 66 6f 72   in each row for
6290: 20 74 68 65 0a 20 20 20 20 68 69 64 64 65 6e 20   the.    hidden 
62a0: 63 6f 6c 75 6d 6e 20 69 73 20 61 20 62 6c 6f 62  column is a blob
62b0: 20 74 68 61 74 20 69 73 20 6f 6e 6c 79 20 75 73   that is only us
62c0: 65 66 75 6c 20 61 73 20 74 68 65 20 6c 65 66 74  eful as the left
62d0: 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 0a 20 20   operand of a.  
62e0: 20 20 5b 46 54 53 20 4d 41 54 43 48 7c 4d 41 54    [FTS MATCH|MAT
62f0: 43 48 5d 20 6f 70 65 72 61 74 6f 72 2c 20 6f 72  CH] operator, or
6300: 20 61 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73   as the left-mos
6310: 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6f 6e  t argument to on
6320: 65 0a 20 20 20 20 6f 66 20 74 68 65 20 5b 46 54  e.    of the [FT
6330: 53 20 61 75 78 69 6c 69 61 72 79 20 66 75 6e 63  S auxiliary func
6340: 74 69 6f 6e 73 5d 2e 0a 20 20 20 20 0a 0a 3c 2f  tions]..    ..</
6350: 6f 6c 3e 0a 0a 0a 3c 68 31 20 74 61 67 73 3d 22  ol>...<h1 tags="
6360: 63 6f 6d 70 69 6c 65 20 66 74 73 22 3e 43 6f 6d  compile fts">Com
6370: 70 69 6c 69 6e 67 20 61 6e 64 20 45 6e 61 62 6c  piling and Enabl
6380: 69 6e 67 20 46 54 53 33 20 61 6e 64 20 46 54 53  ing FTS3 and FTS
6390: 34 3c 2f 68 31 3e 0a 0a 3c 70 3e 0a 20 20 41 6c  4</h1>..<p>.  Al
63a0: 74 68 6f 75 67 68 20 46 54 53 33 20 61 6e 64 20  though FTS3 and 
63b0: 46 54 53 34 20 61 72 65 20 69 6e 63 6c 75 64 65  FTS4 are include
63c0: 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 69 74  d with the SQLit
63d0: 65 20 63 6f 72 65 20 73 6f 75 72 63 65 20 63 6f  e core source co
63e0: 64 65 2c 20 74 68 65 79 20 61 72 65 20 6e 6f 74  de, they are not
63f0: 0a 20 20 65 6e 61 62 6c 65 64 20 62 79 20 64 65  .  enabled by de
6400: 66 61 75 6c 74 2e 20 54 6f 20 62 75 69 6c 64 20  fault. To build 
6410: 53 51 4c 69 74 65 20 77 69 74 68 20 46 54 53 20  SQLite with FTS 
6420: 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 20 65 6e  functionality en
6430: 61 62 6c 65 64 2c 20 64 65 66 69 6e 65 0a 20 20  abled, define.  
6440: 74 68 65 20 70 72 65 70 72 6f 63 65 73 73 6f 72  the preprocessor
6450: 20 6d 61 63 72 6f 20 5b 53 51 4c 49 54 45 5f 45   macro [SQLITE_E
6460: 4e 41 42 4c 45 5f 46 54 53 33 5d 20 77 68 65 6e  NABLE_FTS3] when
6470: 20 63 6f 6d 70 69 6c 69 6e 67 2e 20 4e 65 77 20   compiling. New 
6480: 61 70 70 6c 69 63 61 74 69 6f 6e 73 0a 20 20 73  applications.  s
6490: 68 6f 75 6c 64 20 61 6c 73 6f 20 64 65 66 69 6e  hould also defin
64a0: 65 20 74 68 65 20 5b 53 51 4c 49 54 45 5f 45 4e  e the [SQLITE_EN
64b0: 41 42 4c 45 5f 46 54 53 33 5f 50 41 52 45 4e 54  ABLE_FTS3_PARENT
64c0: 48 45 53 49 53 5d 20 6d 61 63 72 6f 20 74 6f 20  HESIS] macro to 
64d0: 65 6e 61 62 6c 65 20 74 68 65 0a 20 20 5b 65 6e  enable the.  [en
64e0: 68 61 6e 63 65 64 20 71 75 65 72 79 20 73 79 6e  hanced query syn
64f0: 74 61 78 5d 20 28 73 65 65 20 62 65 6c 6f 77 29  tax] (see below)
6500: 2e 20 55 73 75 61 6c 6c 79 2c 20 74 68 69 73 20  . Usually, this 
6510: 69 73 20 64 6f 6e 65 20 62 79 20 61 64 64 69 6e  is done by addin
6520: 67 20 74 68 65 20 0a 20 20 66 6f 6c 6c 6f 77 69  g the .  followi
6530: 6e 67 20 74 77 6f 20 73 77 69 74 63 68 65 73 20  ng two switches 
6540: 74 6f 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20  to the compiler 
6550: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 3a 0a 0a 3c  command line:..<
6560: 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 2d 44 53  codeblock>.  -DS
6570: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53  QLITE_ENABLE_FTS
6580: 33 0a 20 20 2d 44 53 51 4c 49 54 45 5f 45 4e 41  3.  -DSQLITE_ENA
6590: 42 4c 45 5f 46 54 53 33 5f 50 41 52 45 4e 54 48  BLE_FTS3_PARENTH
65a0: 45 53 49 53 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b  ESIS.</codeblock
65b0: 3e 0a 0a 3c 70 3e 0a 20 20 4e 6f 74 65 20 74 68  >..<p>.  Note th
65c0: 61 74 20 65 6e 61 62 6c 69 6e 67 20 46 54 53 33  at enabling FTS3
65d0: 20 61 6c 73 6f 20 6d 61 6b 65 73 20 46 54 53 34   also makes FTS4
65e0: 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 54 68 65   available.  The
65f0: 72 65 20 69 73 20 6e 6f 74 20 61 20 73 65 70 61  re is not a sepa
6600: 72 61 74 65 0a 20 20 53 51 4c 49 54 45 5f 45 4e  rate.  SQLITE_EN
6610: 41 42 4c 45 5f 46 54 53 34 20 63 6f 6d 70 69 6c  ABLE_FTS4 compil
6620: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 2e 20 20  e-time option.  
6630: 41 6e 20 62 75 69 6c 64 20 6f 66 20 53 51 4c 69  An build of SQLi
6640: 74 65 20 65 69 74 68 65 72 20 73 75 70 70 6f 72  te either suppor
6650: 74 73 0a 20 20 62 6f 74 68 20 46 54 53 33 20 61  ts.  both FTS3 a
6660: 6e 64 20 46 54 53 34 20 6f 72 20 69 74 20 73 75  nd FTS4 or it su
6670: 70 70 6f 72 74 73 20 6e 65 69 74 68 65 72 2e 0a  pports neither..
6680: 0a 3c 70 3e 0a 20 20 49 66 20 75 73 69 6e 67 20  .<p>.  If using 
6690: 74 68 65 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e  the amalgamation
66a0: 20 61 75 74 6f 63 6f 6e 66 20 62 61 73 65 64 20   autoconf based 
66b0: 62 75 69 6c 64 20 73 79 73 74 65 6d 2c 20 73 65  build system, se
66c0: 74 74 69 6e 67 20 74 68 65 20 43 50 50 46 4c 41  tting the CPPFLA
66d0: 47 53 0a 20 20 65 6e 76 69 72 6f 6e 6d 65 6e 74  GS.  environment
66e0: 20 76 61 72 69 61 62 6c 65 20 77 68 69 6c 65 20   variable while 
66f0: 72 75 6e 6e 69 6e 67 20 74 68 65 20 27 63 6f 6e  running the 'con
6700: 66 69 67 75 72 65 27 20 73 63 72 69 70 74 20 69  figure' script i
6710: 73 20 61 6e 20 65 61 73 79 0a 20 20 77 61 79 20  s an easy.  way 
6720: 74 6f 20 73 65 74 20 74 68 65 73 65 20 6d 61 63  to set these mac
6730: 72 6f 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  ros. For example
6740: 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  , the following 
6750: 63 6f 6d 6d 61 6e 64 3a 0a 0a 3c 63 6f 64 65 62  command:..<codeb
6760: 6c 6f 63 6b 3e 0a 20 20 43 50 50 46 4c 41 47 53  lock>.  CPPFLAGS
6770: 3d 22 2d 44 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ="-DSQLITE_ENABL
6780: 45 5f 46 54 53 33 20 2d 44 53 51 4c 49 54 45 5f  E_FTS3 -DSQLITE_
6790: 45 4e 41 42 4c 45 5f 46 54 53 33 5f 50 41 52 45  ENABLE_FTS3_PARE
67a0: 4e 54 48 45 53 49 53 22 20 2e 2f 63 6f 6e 66 69  NTHESIS" ./confi
67b0: 67 75 72 65 20 26 6c 74 3b 63 6f 6e 66 69 67 75  gure &lt;configu
67c0: 72 65 20 6f 70 74 69 6f 6e 73 26 67 74 3b 0a 3c  re options&gt;.<
67d0: 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e  /codeblock>..<p>
67e0: 0a 20 20 77 68 65 72 65 20 3c 69 3e 26 6c 74 3b  .  where <i>&lt;
67f0: 63 6f 6e 66 69 67 75 72 65 20 6f 70 74 69 6f 6e  configure option
6800: 73 26 67 74 3b 3c 2f 69 3e 20 61 72 65 20 74 68  s&gt;</i> are th
6810: 6f 73 65 20 6f 70 74 69 6f 6e 73 20 6e 6f 72 6d  ose options norm
6820: 61 6c 6c 79 20 70 61 73 73 65 64 20 74 6f 0a 20  ally passed to. 
6830: 20 74 68 65 20 63 6f 6e 66 69 67 75 72 65 20 73   the configure s
6840: 63 72 69 70 74 2c 20 69 66 20 61 6e 79 2e 0a 0a  cript, if any...
6850: 3c 70 3e 0a 20 20 42 65 63 61 75 73 65 20 46 54  <p>.  Because FT
6860: 53 33 20 61 6e 64 20 46 54 53 34 20 61 72 65 20  S3 and FTS4 are 
6870: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2c 20  virtual tables, 
6880: 54 68 65 20 5b 53 51 4c 49 54 45 5f 45 4e 41 42  The [SQLITE_ENAB
6890: 4c 45 5f 46 54 53 33 5d 20 63 6f 6d 70 69 6c 65  LE_FTS3] compile
68a0: 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 0a 20 20 69  -time option.  i
68b0: 73 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 77  s incompatible w
68c0: 69 74 68 20 74 68 65 20 5b 53 51 4c 49 54 45 5f  ith the [SQLITE_
68d0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
68e0: 45 5d 20 6f 70 74 69 6f 6e 2e 0a 0a 3c 70 3e 0a  E] option...<p>.
68f0: 20 20 49 66 20 61 20 62 75 69 6c 64 20 6f 66 20    If a build of 
6900: 53 51 4c 69 74 65 20 64 6f 65 73 20 6e 6f 74 20  SQLite does not 
6910: 69 6e 63 6c 75 64 65 20 74 68 65 20 46 54 53 20  include the FTS 
6920: 6d 6f 64 75 6c 65 73 2c 20 74 68 65 6e 20 61 6e  modules, then an
6930: 79 20 61 74 74 65 6d 70 74 20 74 6f 20 70 72 65  y attempt to pre
6940: 70 61 72 65 20 61 6e 0a 20 20 53 51 4c 20 73 74  pare an.  SQL st
6950: 61 74 65 6d 65 6e 74 20 74 6f 20 63 72 65 61 74  atement to creat
6960: 65 20 61 6e 20 46 54 53 33 20 6f 72 20 46 54 53  e an FTS3 or FTS
6970: 34 20 74 61 62 6c 65 20 6f 72 20 74 6f 20 64 72  4 table or to dr
6980: 6f 70 20 6f 72 20 61 63 63 65 73 73 20 61 6e 20  op or access an 
6990: 65 78 69 73 74 69 6e 67 20 0a 20 20 46 54 53 20  existing .  FTS 
69a0: 74 61 62 6c 65 20 69 6e 20 61 6e 79 20 77 61 79  table in any way
69b0: 20 77 69 6c 6c 20 66 61 69 6c 2e 20 54 68 65 20   will fail. The 
69c0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 72 65  error message re
69d0: 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20 73  turned will be s
69e0: 69 6d 69 6c 61 72 20 0a 20 20 74 6f 20 22 6e 6f  imilar .  to "no
69f0: 20 73 75 63 68 20 6d 6f 64 75 6c 65 3a 20 66 74   such module: ft
6a00: 73 4e 22 20 28 77 68 65 72 65 20 4e 20 69 73 20  sN" (where N is 
6a10: 65 69 74 68 65 72 20 33 20 6f 72 20 34 29 2e 0a  either 3 or 4)..
6a20: 0a 3c 70 3e 0a 20 20 49 66 20 74 68 65 20 43 20  .<p>.  If the C 
6a30: 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 3c  version of the <
6a40: 61 20 68 72 65 66 3d 68 74 74 70 3a 2f 2f 73 69  a href=http://si
6a50: 74 65 2e 69 63 75 2d 70 72 6f 6a 65 63 74 2e 6f  te.icu-project.o
6a60: 72 67 2f 3e 49 43 55 20 6c 69 62 72 61 72 79 3c  rg/>ICU library<
6a70: 2f 61 3e 0a 20 20 69 73 20 61 76 61 69 6c 61 62  /a>.  is availab
6a80: 6c 65 2c 20 74 68 65 6e 20 46 54 53 20 6d 61 79  le, then FTS may
6a90: 20 61 6c 73 6f 20 62 65 20 63 6f 6d 70 69 6c 65   also be compile
6aa0: 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54  d with the SQLIT
6ab0: 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a 20 20 70  E_ENABLE_ICU.  p
6ac0: 72 65 2d 70 72 6f 63 65 73 73 6f 72 20 6d 61 63  re-processor mac
6ad0: 72 6f 20 64 65 66 69 6e 65 64 2e 20 43 6f 6d 70  ro defined. Comp
6ae0: 69 6c 69 6e 67 20 77 69 74 68 20 74 68 69 73 20  iling with this 
6af0: 6d 61 63 72 6f 20 65 6e 61 62 6c 65 73 20 61 6e  macro enables an
6b00: 20 46 54 53 0a 20 20 5b 74 6f 6b 65 6e 69 7a 65   FTS.  [tokenize
6b10: 72 5d 20 74 68 61 74 20 75 73 65 73 20 74 68 65  r] that uses the
6b20: 20 49 43 55 20 6c 69 62 72 61 72 79 20 74 6f 20   ICU library to 
6b30: 73 70 6c 69 74 20 61 20 64 6f 63 75 6d 65 6e 74  split a document
6b40: 20 69 6e 74 6f 20 74 65 72 6d 73 0a 20 20 28 77   into terms.  (w
6b50: 6f 72 64 73 29 20 75 73 69 6e 67 20 74 68 65 20  ords) using the 
6b60: 63 6f 6e 76 65 6e 74 69 6f 6e 73 20 66 6f 72 20  conventions for 
6b70: 61 20 73 70 65 63 69 66 69 65 64 20 6c 61 6e 67  a specified lang
6b80: 75 61 67 65 20 61 6e 64 20 6c 6f 63 61 6c 65 2e  uage and locale.
6b90: 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20  ..<codeblock>.  
6ba0: 2d 44 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  -DSQLITE_ENABLE_
6bb0: 49 43 55 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e  ICU.</codeblock>
6bc0: 0a 20 20 0a 0a 3c 68 31 20 74 61 67 73 3d 22 46  .  ..<h1 tags="F
6bd0: 54 53 20 4d 41 54 43 48 22 3e 46 75 6c 6c 2d 74  TS MATCH">Full-t
6be0: 65 78 74 20 49 6e 64 65 78 20 51 75 65 72 69 65  ext Index Querie
6bf0: 73 3c 2f 68 31 3e 0a 0a 3c 70 3e 0a 20 20 54 68  s</h1>..<p>.  Th
6c00: 65 20 6d 6f 73 74 20 75 73 65 66 75 6c 20 74 68  e most useful th
6c10: 69 6e 67 20 61 62 6f 75 74 20 46 54 53 20 74 61  ing about FTS ta
6c20: 62 6c 65 73 20 69 73 20 74 68 65 20 71 75 65 72  bles is the quer
6c30: 69 65 73 20 74 68 61 74 20 6d 61 79 20 62 65 20  ies that may be 
6c40: 0a 20 20 70 65 72 66 6f 72 6d 65 64 20 75 73 69  .  performed usi
6c50: 6e 67 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20  ng the built-in 
6c60: 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 2e  full-text index.
6c70: 20 46 75 6c 6c 2d 74 65 78 74 20 71 75 65 72 69   Full-text queri
6c80: 65 73 20 61 72 65 20 0a 20 20 70 65 72 66 6f 72  es are .  perfor
6c90: 6d 65 64 20 62 79 20 73 70 65 63 69 66 79 69 6e  med by specifyin
6ca0: 67 20 61 20 63 6c 61 75 73 65 20 6f 66 20 74 68  g a clause of th
6cb0: 65 20 66 6f 72 6d 20 0a 20 20 22 26 6c 74 3b 63  e form .  "&lt;c
6cc0: 6f 6c 75 6d 6e 26 67 74 3b 20 4d 41 54 43 48 20  olumn&gt; MATCH 
6cd0: 26 6c 74 3b 66 75 6c 6c 2d 74 65 78 74 20 71 75  &lt;full-text qu
6ce0: 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 26 67  ery expression&g
6cf0: 74 3b 22 20 61 73 20 70 61 72 74 20 6f 66 20 74  t;" as part of t
6d00: 68 65 20 57 48 45 52 45 20 0a 20 20 63 6c 61 75  he WHERE .  clau
6d10: 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73  se of a SELECT s
6d20: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 72 65  tatement that re
6d30: 61 64 73 20 64 61 74 61 20 66 72 6f 6d 20 61 6e  ads data from an
6d40: 20 46 54 53 20 74 61 62 6c 65 2e 20 0a 20 20 5b   FTS table. .  [
6d50: 73 69 6d 70 6c 65 20 66 74 73 20 71 75 65 72 69  simple fts queri
6d60: 65 73 7c 53 69 6d 70 6c 65 20 46 54 53 20 71 75  es|Simple FTS qu
6d70: 65 72 69 65 73 5d 20 74 68 61 74 20 72 65 74 75  eries] that retu
6d80: 72 6e 20 61 6c 6c 20 64 6f 63 75 6d 65 6e 74 73  rn all documents
6d90: 20 74 68 61 74 20 0a 20 20 63 6f 6e 74 61 69 6e   that .  contain
6da0: 20 61 20 67 69 76 65 6e 20 74 65 72 6d 20 61 72   a given term ar
6db0: 65 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  e described abov
6dc0: 65 2e 20 49 6e 20 74 68 61 74 20 64 69 73 63 75  e. In that discu
6dd0: 73 73 69 6f 6e 20 74 68 65 20 72 69 67 68 74 2d  ssion the right-
6de0: 68 61 6e 64 0a 20 20 6f 70 65 72 61 6e 64 20 6f  hand.  operand o
6df0: 66 20 74 68 65 20 4d 41 54 43 48 20 6f 70 65 72  f the MATCH oper
6e00: 61 74 6f 72 20 77 61 73 20 61 73 73 75 6d 65 64  ator was assumed
6e10: 20 74 6f 20 62 65 20 61 20 73 74 72 69 6e 67 20   to be a string 
6e20: 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 0a  consisting of a.
6e30: 20 20 73 69 6e 67 6c 65 20 74 65 72 6d 2e 20 54    single term. T
6e40: 68 69 73 20 73 65 63 74 69 6f 6e 20 64 65 73 63  his section desc
6e50: 72 69 62 65 73 20 74 68 65 20 6d 6f 72 65 20 63  ribes the more c
6e60: 6f 6d 70 6c 65 78 20 71 75 65 72 79 20 74 79 70  omplex query typ
6e70: 65 73 20 73 75 70 70 6f 72 74 65 64 20 0a 20 20  es supported .  
6e80: 62 79 20 46 54 53 20 74 61 62 6c 65 73 2c 20 61  by FTS tables, a
6e90: 6e 64 20 68 6f 77 20 74 68 65 79 20 6d 61 79 20  nd how they may 
6ea0: 62 65 20 75 74 69 6c 69 7a 65 64 20 62 79 20 73  be utilized by s
6eb0: 70 65 63 69 66 79 69 6e 67 20 61 20 6d 6f 72 65  pecifying a more
6ec0: 0a 20 20 63 6f 6d 70 6c 65 78 20 71 75 65 72 79  .  complex query
6ed0: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20 74   expression as t
6ee0: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 6f 70  he right-hand op
6ef0: 65 72 61 6e 64 20 6f 66 20 61 20 4d 41 54 43 48  erand of a MATCH
6f00: 20 6f 70 65 72 61 74 6f 72 2e 0a 0a 3c 70 3e 0a   operator...<p>.
6f10: 20 20 46 54 53 20 74 61 62 6c 65 73 20 73 75 70    FTS tables sup
6f20: 70 6f 72 74 20 74 68 72 65 65 20 62 61 73 69 63  port three basic
6f30: 20 71 75 65 72 79 20 74 79 70 65 73 3a 0a 0a 3c   query types:..<
6f40: 75 6c 3e 0a 20 20 3c 6c 69 3e 3c 70 3e 3c 62 3e  ul>.  <li><p><b>
6f50: 54 6f 6b 65 6e 20 6f 72 20 74 6f 6b 65 6e 20 70  Token or token p
6f60: 72 65 66 69 78 20 71 75 65 72 69 65 73 3c 2f 62  refix queries</b
6f70: 3e 2e 20 0a 20 20 20 20 41 6e 20 46 54 53 20 74  >. .    An FTS t
6f80: 61 62 6c 65 20 6d 61 79 20 62 65 20 71 75 65 72  able may be quer
6f90: 69 65 64 20 66 6f 72 20 61 6c 6c 20 64 6f 63 75  ied for all docu
6fa0: 6d 65 6e 74 73 20 74 68 61 74 20 63 6f 6e 74 61  ments that conta
6fb0: 69 6e 20 61 20 73 70 65 63 69 66 69 65 64 0a 20  in a specified. 
6fc0: 20 20 20 74 65 72 6d 20 28 74 68 65 20 5b 73 69     term (the [si
6fd0: 6d 70 6c 65 20 66 74 73 20 71 75 65 72 69 65 73  mple fts queries
6fe0: 7c 73 69 6d 70 6c 65 20 63 61 73 65 5d 20 64 65  |simple case] de
6ff0: 73 63 72 69 62 65 64 20 61 62 6f 76 65 29 2c 20  scribed above), 
7000: 6f 72 20 66 6f 72 0a 20 20 20 20 61 6c 6c 20 64  or for.    all d
7010: 6f 63 75 6d 65 6e 74 73 20 74 68 61 74 20 63 6f  ocuments that co
7020: 6e 74 61 69 6e 20 61 20 74 65 72 6d 20 77 69 74  ntain a term wit
7030: 68 20 61 20 73 70 65 63 69 66 69 65 64 20 70 72  h a specified pr
7040: 65 66 69 78 2e 20 41 73 20 77 65 20 68 61 76 65  efix. As we have
7050: 0a 20 20 20 20 73 65 65 6e 2c 20 74 68 65 20 71  .    seen, the q
7060: 75 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20  uery expression 
7070: 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 74  for a specific t
7080: 65 72 6d 20 69 73 20 73 69 6d 70 6c 79 20 74 68  erm is simply th
7090: 65 20 74 65 72 6d 20 69 74 73 65 6c 66 2e 0a 20  e term itself.. 
70a0: 20 20 20 54 68 65 20 71 75 65 72 79 20 65 78 70     The query exp
70b0: 72 65 73 73 69 6f 6e 20 75 73 65 64 20 74 6f 20  ression used to 
70c0: 73 65 61 72 63 68 20 66 6f 72 20 61 20 74 65 72  search for a ter
70d0: 6d 20 70 72 65 66 69 78 20 69 73 20 74 68 65 20  m prefix is the 
70e0: 70 72 65 66 69 78 0a 20 20 20 20 69 74 73 65 6c  prefix.    itsel
70f0: 66 20 77 69 74 68 20 61 20 27 2a 27 20 63 68 61  f with a '*' cha
7100: 72 61 63 74 65 72 20 61 70 70 65 6e 64 65 64 20  racter appended 
7110: 74 6f 20 69 74 2e 20 46 6f 72 20 65 78 61 6d 70  to it. For examp
7120: 6c 65 3a 0a 3c 2f 75 6c 3e 0a 0a 3c 63 6f 64 65  le:.</ul>..<code
7130: 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d 20 56  block>.  <i>-- V
7140: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 64 65 63  irtual table dec
7150: 6c 61 72 61 74 69 6f 6e 3c 2f 69 3e 0a 20 20 43  laration</i>.  C
7160: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
7170: 42 4c 45 20 64 6f 63 73 20 55 53 49 4e 47 20 66  BLE docs USING f
7180: 74 73 33 28 74 69 74 6c 65 2c 20 62 6f 64 79 29  ts3(title, body)
7190: 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 51 75 65 72 79  ;..  <i>-- Query
71a0: 20 66 6f 72 20 61 6c 6c 20 64 6f 63 75 6d 65 6e   for all documen
71b0: 74 73 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ts containing th
71c0: 65 20 74 65 72 6d 20 22 6c 69 6e 75 78 22 3a 3c  e term "linux":<
71d0: 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  /i>.  SELECT * F
71e0: 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20 64  ROM docs WHERE d
71f0: 6f 63 73 20 4d 41 54 43 48 20 27 6c 69 6e 75 78  ocs MATCH 'linux
7200: 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 51 75 65 72  ';..  <i>-- Quer
7210: 79 20 66 6f 72 20 61 6c 6c 20 64 6f 63 75 6d 65  y for all docume
7220: 6e 74 73 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  nts containing a
7230: 20 74 65 72 6d 20 77 69 74 68 20 74 68 65 20 70   term with the p
7240: 72 65 66 69 78 20 22 6c 69 6e 22 2e 20 54 68 69  refix "lin". Thi
7250: 73 20 77 69 6c 6c 20 6d 61 74 63 68 3c 2f 69 3e  s will match</i>
7260: 0a 20 20 3c 69 3e 2d 2d 20 61 6c 6c 20 64 6f 63  .  <i>-- all doc
7270: 75 6d 65 6e 74 73 20 74 68 61 74 20 63 6f 6e 74  uments that cont
7280: 61 69 6e 20 22 6c 69 6e 75 78 22 2c 20 62 75 74  ain "linux", but
7290: 20 61 6c 73 6f 20 74 68 6f 73 65 20 74 68 61 74   also those that
72a0: 20 63 6f 6e 74 61 69 6e 20 74 65 72 6d 73 20 22   contain terms "
72b0: 6c 69 6e 65 61 72 22 2c 3c 2f 69 3e 0a 20 20 3c  linear",</i>.  <
72c0: 69 3e 2d 2d 22 6c 69 6e 6b 65 72 22 2c 20 22 6c  i>--"linker", "l
72d0: 69 6e 67 75 69 73 74 69 63 22 20 61 6e 64 20 73  inguistic" and s
72e0: 6f 20 6f 6e 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45  o on.</i>.  SELE
72f0: 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57  CT * FROM docs W
7300: 48 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20  HERE docs MATCH 
7310: 27 6c 69 6e 2a 27 3b 0a 3c 2f 63 6f 64 65 62 6c  'lin*';.</codebl
7320: 6f 63 6b 3e 0a 0a 3c 75 6c 3e 0a 20 20 3c 6c 69  ock>..<ul>.  <li
7330: 20 73 74 79 6c 65 3d 22 6c 69 73 74 2d 73 74 79   style="list-sty
7340: 6c 65 3a 6e 6f 6e 65 22 3e 3c 70 3e 0a 20 20 20  le:none"><p>.   
7350: 20 4e 6f 72 6d 61 6c 6c 79 2c 20 61 20 74 6f 6b   Normally, a tok
7360: 65 6e 20 6f 72 20 74 6f 6b 65 6e 20 70 72 65 66  en or token pref
7370: 69 78 20 71 75 65 72 79 20 69 73 20 6d 61 74 63  ix query is matc
7380: 68 65 64 20 61 67 61 69 6e 73 74 20 74 68 65 20  hed against the 
7390: 46 54 53 20 74 61 62 6c 65 20 0a 20 20 20 20 63  FTS table .    c
73a0: 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69 65 64 20  olumn specified 
73b0: 61 73 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  as the right-han
73c0: 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 4d 41  d side of the MA
73d0: 54 43 48 20 6f 70 65 72 61 74 6f 72 2e 20 4f 72  TCH operator. Or
73e0: 2c 20 69 66 20 74 68 65 0a 20 20 20 20 73 70 65  , if the.    spe
73f0: 63 69 61 6c 20 63 6f 6c 75 6d 6e 20 77 69 74 68  cial column with
7400: 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61   the same name a
7410: 73 20 74 68 65 20 46 54 53 20 74 61 62 6c 65 20  s the FTS table 
7420: 69 74 73 65 6c 66 20 69 73 20 73 70 65 63 69 66  itself is specif
7430: 69 65 64 2c 0a 20 20 20 20 61 67 61 69 6e 73 74  ied,.    against
7440: 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 2e 20 54 68   all columns. Th
7450: 69 73 20 6d 61 79 20 62 65 20 6f 76 65 72 72 69  is may be overri
7460: 64 64 65 6e 20 62 79 20 73 70 65 63 69 66 79 69  dden by specifyi
7470: 6e 67 20 61 20 63 6f 6c 75 6d 6e 2d 6e 61 6d 65  ng a column-name
7480: 0a 20 20 20 20 66 6f 6c 6c 6f 77 65 64 20 62 79  .    followed by
7490: 20 61 20 22 3a 22 20 63 68 61 72 61 63 74 65 72   a ":" character
74a0: 20 62 65 66 6f 72 65 20 61 20 62 61 73 69 63 20   before a basic 
74b0: 74 65 72 6d 20 71 75 65 72 79 2e 20 54 68 65 72  term query. Ther
74c0: 65 20 6d 61 79 20 62 65 20 73 70 61 63 65 0a 20  e may be space. 
74d0: 20 20 20 62 65 74 77 65 65 6e 20 74 68 65 20 22     between the "
74e0: 3a 22 20 61 6e 64 20 74 68 65 20 74 65 72 6d 20  :" and the term 
74f0: 74 6f 20 71 75 65 72 79 20 66 6f 72 2c 20 62 75  to query for, bu
7500: 74 20 6e 6f 74 20 62 65 74 77 65 65 6e 20 74 68  t not between th
7510: 65 20 63 6f 6c 75 6d 6e 2d 6e 61 6d 65 0a 20 20  e column-name.  
7520: 20 20 61 6e 64 20 74 68 65 20 22 3a 22 20 63 68    and the ":" ch
7530: 61 72 61 63 74 65 72 2e 20 46 6f 72 20 65 78 61  aracter. For exa
7540: 6d 70 6c 65 3a 0a 3c 2f 75 6c 3e 0a 20 20 20 0a  mple:.</ul>.   .
7550: 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69  <codeblock>.  <i
7560: 3e 2d 2d 20 51 75 65 72 79 20 74 68 65 20 64 61  >-- Query the da
7570: 74 61 62 61 73 65 20 66 6f 72 20 64 6f 63 75 6d  tabase for docum
7580: 65 6e 74 73 20 66 6f 72 20 77 68 69 63 68 20 74  ents for which t
7590: 68 65 20 74 65 72 6d 20 22 6c 69 6e 75 78 22 20  he term "linux" 
75a0: 61 70 70 65 61 72 73 20 69 6e 3c 2f 69 3e 0a 20  appears in</i>. 
75b0: 20 3c 69 3e 2d 2d 20 74 68 65 20 64 6f 63 75 6d   <i>-- the docum
75c0: 65 6e 74 20 74 69 74 6c 65 2c 20 61 6e 64 20 74  ent title, and t
75d0: 68 65 20 74 65 72 6d 20 22 70 72 6f 62 6c 65 6d  he term "problem
75e0: 73 22 20 61 70 70 65 61 72 73 20 69 6e 20 65 69  s" appears in ei
75f0: 74 68 65 72 20 74 68 65 20 74 69 74 6c 65 3c 2f  ther the title</
7600: 69 3e 0a 20 20 3c 69 3e 2d 2d 20 6f 72 20 62 6f  i>.  <i>-- or bo
7610: 64 79 20 6f 66 20 74 68 65 20 64 6f 63 75 6d 65  dy of the docume
7620: 6e 74 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54  nt.</i>.  SELECT
7630: 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45   * FROM docs WHE
7640: 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27 74  RE docs MATCH 't
7650: 69 74 6c 65 3a 6c 69 6e 75 78 20 70 72 6f 62 6c  itle:linux probl
7660: 65 6d 73 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 51  ems';..  <i>-- Q
7670: 75 65 72 79 20 74 68 65 20 64 61 74 61 62 61 73  uery the databas
7680: 65 20 66 6f 72 20 64 6f 63 75 6d 65 6e 74 73 20  e for documents 
7690: 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 74 65  for which the te
76a0: 72 6d 20 22 6c 69 6e 75 78 22 20 61 70 70 65 61  rm "linux" appea
76b0: 72 73 20 69 6e 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  rs in</i>.  <i>-
76c0: 2d 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 74  - the document t
76d0: 69 74 6c 65 2c 20 61 6e 64 20 74 68 65 20 74 65  itle, and the te
76e0: 72 6d 20 22 64 72 69 76 65 72 22 20 61 70 70 65  rm "driver" appe
76f0: 61 72 73 20 69 6e 20 74 68 65 20 62 6f 64 79 20  ars in the body 
7700: 6f 66 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 3c  of the document<
7710: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 28 22 64 72  /i>.  <i>-- ("dr
7720: 69 76 65 72 22 20 6d 61 79 20 61 6c 73 6f 20 61  iver" may also a
7730: 70 70 65 61 72 20 69 6e 20 74 68 65 20 74 69 74  ppear in the tit
7740: 6c 65 2c 20 62 75 74 20 74 68 69 73 20 61 6c 6f  le, but this alo
7750: 6e 65 20 77 69 6c 6c 20 6e 6f 74 20 73 61 74 69  ne will not sati
7760: 73 66 79 20 74 68 65 3c 2f 69 3e 2e 0a 20 20 3c  sfy the</i>..  <
7770: 69 3e 2d 2d 20 71 75 65 72 79 20 63 72 69 74 65  i>-- query crite
7780: 72 69 61 29 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45  ria).</i>.  SELE
7790: 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57  CT * FROM docs W
77a0: 48 45 52 45 20 62 6f 64 79 20 4d 41 54 43 48 20  HERE body MATCH 
77b0: 27 74 69 74 6c 65 3a 6c 69 6e 75 78 20 64 72 69  'title:linux dri
77c0: 76 65 72 27 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63  ver';.</codebloc
77d0: 6b 3e 0a 0a 3c 75 6c 3e 0a 20 20 3c 6c 69 3e 3c  k>..<ul>.  <li><
77e0: 70 3e 3c 62 3e 50 68 72 61 73 65 20 71 75 65 72  p><b>Phrase quer
77f0: 69 65 73 3c 2f 62 3e 2e 0a 20 20 20 20 41 20 70  ies</b>..    A p
7800: 68 72 61 73 65 20 71 75 65 72 79 20 69 73 20 61  hrase query is a
7810: 20 71 75 65 72 79 20 74 68 61 74 20 72 65 74 72   query that retr
7820: 69 65 76 65 73 20 61 6c 6c 20 64 6f 63 75 6d 65  ieves all docume
7830: 6e 74 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  nts that contain
7840: 20 61 0a 20 20 20 20 6e 6f 6d 69 6e 61 74 65 64   a.    nominated
7850: 20 73 65 74 20 6f 66 20 74 65 72 6d 73 20 6f 72   set of terms or
7860: 20 74 65 72 6d 20 70 72 65 66 69 78 65 73 20 69   term prefixes i
7870: 6e 20 61 20 73 70 65 63 69 66 69 65 64 20 6f 72  n a specified or
7880: 64 65 72 20 77 69 74 68 20 6e 6f 0a 20 20 20 20  der with no.    
7890: 69 6e 74 65 72 76 65 6e 69 6e 67 20 74 6f 6b 65  intervening toke
78a0: 6e 73 2e 20 50 68 72 61 73 65 20 71 75 65 72 69  ns. Phrase queri
78b0: 65 73 20 61 72 65 20 73 70 65 63 69 66 69 65 64  es are specified
78c0: 20 62 79 20 65 6e 63 6c 6f 73 69 6e 67 20 61 20   by enclosing a 
78d0: 73 70 61 63 65 0a 20 20 20 20 73 65 70 61 72 61  space.    separa
78e0: 74 65 64 20 73 65 71 75 65 6e 63 65 20 6f 66 20  ted sequence of 
78f0: 74 65 72 6d 73 20 6f 72 20 74 65 72 6d 20 70 72  terms or term pr
7900: 65 66 69 78 65 73 20 69 6e 20 64 6f 75 62 6c 65  efixes in double
7910: 20 71 75 6f 74 65 73 20 28 22 29 2e 0a 20 20 20   quotes (")..   
7920: 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 3c 2f   For example:.</
7930: 75 6c 3e 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e  ul>..<codeblock>
7940: 0a 20 20 3c 69 3e 2d 2d 20 51 75 65 72 79 20 66  .  <i>-- Query f
7950: 6f 72 20 61 6c 6c 20 64 6f 63 75 6d 65 6e 74 73  or all documents
7960: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 74 68   that contain th
7970: 65 20 70 68 72 61 73 65 20 22 6c 69 6e 75 78 20  e phrase "linux 
7980: 61 70 70 6c 69 63 61 74 69 6f 6e 73 22 2e 3c 2f  applications".</
7990: 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52  i>.  SELECT * FR
79a0: 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20 64 6f  OM docs WHERE do
79b0: 63 73 20 4d 41 54 43 48 20 27 22 6c 69 6e 75 78  cs MATCH '"linux
79c0: 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 22 27 3b   applications"';
79d0: 0a 0a 20 20 3c 69 3e 2d 2d 20 51 75 65 72 79 20  ..  <i>-- Query 
79e0: 66 6f 72 20 61 6c 6c 20 64 6f 63 75 6d 65 6e 74  for all document
79f0: 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 61  s that contain a
7a00: 20 70 68 72 61 73 65 20 74 68 61 74 20 6d 61 74   phrase that mat
7a10: 63 68 65 73 20 22 6c 69 6e 2a 20 61 70 70 2a 22  ches "lin* app*"
7a20: 2e 20 41 73 20 77 65 6c 6c 20 61 73 3c 2f 69 3e  . As well as</i>
7a30: 0a 20 20 3c 69 3e 2d 2d 20 22 6c 69 6e 75 78 20  .  <i>-- "linux 
7a40: 61 70 70 6c 69 63 61 74 69 6f 6e 73 22 2c 20 74  applications", t
7a50: 68 69 73 20 77 69 6c 6c 20 6d 61 74 63 68 20 63  his will match c
7a60: 6f 6d 6d 6f 6e 20 70 68 72 61 73 65 73 20 73 75  ommon phrases su
7a70: 63 68 20 61 73 20 22 6c 69 6e 6f 6c 65 75 6d 20  ch as "linoleum 
7a80: 61 70 70 6c 69 61 6e 63 65 73 22 3c 2f 69 3e 0a  appliances"</i>.
7a90: 20 20 3c 69 3e 2d 2d 20 6f 72 20 22 6c 69 6e 6b    <i>-- or "link
7aa0: 20 61 70 70 72 65 6e 74 69 63 65 22 2e 3c 2f 69   apprentice".</i
7ab0: 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  >.  SELECT * FRO
7ac0: 4d 20 64 6f 63 73 20 57 48 45 52 45 20 64 6f 63  M docs WHERE doc
7ad0: 73 20 4d 41 54 43 48 20 27 22 6c 69 6e 2a 20 61  s MATCH '"lin* a
7ae0: 70 70 2a 22 27 3b 0a 3c 2f 63 6f 64 65 62 6c 6f  pp*"';.</codeblo
7af0: 63 6b 3e 0a 0a 3c 75 6c 3e 0a 20 20 3c 6c 69 3e  ck>..<ul>.  <li>
7b00: 3c 70 3e 3c 62 3e 4e 45 41 52 20 71 75 65 72 69  <p><b>NEAR queri
7b10: 65 73 3c 2f 62 3e 2e 20 0a 20 20 20 20 41 20 4e  es</b>. .    A N
7b20: 45 41 52 20 71 75 65 72 79 20 69 73 20 61 20 71  EAR query is a q
7b30: 75 65 72 79 20 74 68 61 74 20 72 65 74 75 72 6e  uery that return
7b40: 73 20 64 6f 63 75 6d 65 6e 74 73 20 74 68 61 74  s documents that
7b50: 20 63 6f 6e 74 61 69 6e 20 61 20 74 77 6f 20 6f   contain a two o
7b60: 72 0a 20 20 20 20 6d 6f 72 65 20 6e 6f 6d 69 6e  r.    more nomin
7b70: 61 74 65 64 20 74 65 72 6d 73 20 6f 72 20 70 68  ated terms or ph
7b80: 72 61 73 65 73 20 77 69 74 68 69 6e 20 61 20 73  rases within a s
7b90: 70 65 63 69 66 69 65 64 20 70 72 6f 78 69 6d 69  pecified proximi
7ba0: 74 79 20 6f 66 20 65 61 63 68 20 0a 20 20 20 20  ty of each .    
7bb0: 6f 74 68 65 72 20 28 62 79 20 64 65 66 61 75 6c  other (by defaul
7bc0: 74 20 77 69 74 68 20 31 30 20 6f 72 20 6c 65 73  t with 10 or les
7bd0: 73 20 69 6e 74 65 72 76 65 6e 69 6e 67 20 74 65  s intervening te
7be0: 72 6d 73 29 2e 20 41 20 4e 45 41 52 20 71 75 65  rms). A NEAR que
7bf0: 72 79 20 69 73 20 0a 20 20 20 20 73 70 65 63 69  ry is .    speci
7c00: 66 69 65 64 20 62 79 20 70 75 74 74 69 6e 67 20  fied by putting 
7c10: 74 68 65 20 6b 65 79 77 6f 72 64 20 22 4e 45 41  the keyword "NEA
7c20: 52 22 20 62 65 74 77 65 65 6e 20 74 77 6f 20 70  R" between two p
7c30: 68 72 61 73 65 2c 20 74 65 72 6d 20 6f 72 20 0a  hrase, term or .
7c40: 20 20 20 20 74 65 72 6d 20 70 72 65 66 69 78 20      term prefix 
7c50: 71 75 65 72 69 65 73 2e 20 54 6f 20 73 70 65 63  queries. To spec
7c60: 69 66 79 20 61 20 70 72 6f 78 69 6d 69 74 79 20  ify a proximity 
7c70: 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 64  other than the d
7c80: 65 66 61 75 6c 74 2c 0a 20 20 20 20 61 6e 20 6f  efault,.    an o
7c90: 70 65 72 61 74 6f 72 20 6f 66 20 74 68 65 20 66  perator of the f
7ca0: 6f 72 6d 20 22 4e 45 41 52 2f 3c 69 3e 26 6c 74  orm "NEAR/<i>&lt
7cb0: 3b 4e 26 67 74 3b 3c 2f 69 3e 22 20 6d 61 79 20  ;N&gt;</i>" may 
7cc0: 62 65 20 75 73 65 64 2c 20 77 68 65 72 65 0a 20  be used, where. 
7cd0: 20 20 20 3c 69 3e 26 6c 74 3b 4e 26 67 74 3b 3c     <i>&lt;N&gt;<
7ce0: 2f 69 3e 20 69 73 20 74 68 65 20 6d 61 78 69 6d  /i> is the maxim
7cf0: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 74  um number of int
7d00: 65 72 76 65 6e 69 6e 67 20 74 65 72 6d 73 20 61  ervening terms a
7d10: 6c 6c 6f 77 65 64 2e 0a 20 20 20 20 46 6f 72 20  llowed..    For 
7d20: 65 78 61 6d 70 6c 65 3a 0a 3c 2f 75 6c 3e 0a 0a  example:.</ul>..
7d30: 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69  <codeblock>.  <i
7d40: 3e 2d 2d 20 56 69 72 74 75 61 6c 20 74 61 62 6c  >-- Virtual tabl
7d50: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 2e 3c 2f  e declaration.</
7d60: 69 3e 0a 20 20 43 52 45 41 54 45 20 56 49 52 54  i>.  CREATE VIRT
7d70: 55 41 4c 20 54 41 42 4c 45 20 64 6f 63 73 20 55  UAL TABLE docs U
7d80: 53 49 4e 47 20 66 74 73 34 28 29 3b 0a 0a 20 20  SING fts4();..  
7d90: 3c 69 3e 2d 2d 20 56 69 72 74 75 61 6c 20 74 61  <i>-- Virtual ta
7da0: 62 6c 65 20 64 61 74 61 2e 3c 2f 69 3e 0a 20 20  ble data.</i>.  
7db0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 64 6f 63 73  INSERT INTO docs
7dc0: 20 56 41 4c 55 45 53 28 27 53 51 4c 69 74 65 20   VALUES('SQLite 
7dd0: 69 73 20 61 6e 20 41 43 49 44 20 63 6f 6d 70 6c  is an ACID compl
7de0: 69 61 6e 74 20 65 6d 62 65 64 64 65 64 20 72 65  iant embedded re
7df0: 6c 61 74 69 6f 6e 61 6c 20 64 61 74 61 62 61 73  lational databas
7e00: 65 20 6d 61 6e 61 67 65 6d 65 6e 74 20 73 79 73  e management sys
7e10: 74 65 6d 27 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20  tem');..  <i>-- 
7e20: 53 65 61 72 63 68 20 66 6f 72 20 61 20 64 6f 63  Search for a doc
7e30: 75 6d 65 6e 74 20 74 68 61 74 20 63 6f 6e 74 61  ument that conta
7e40: 69 6e 73 20 74 68 65 20 74 65 72 6d 73 20 22 73  ins the terms "s
7e50: 71 6c 69 74 65 22 20 61 6e 64 20 22 64 61 74 61  qlite" and "data
7e60: 62 61 73 65 22 20 77 69 74 68 3c 2f 69 3e 0a 20  base" with</i>. 
7e70: 20 3c 69 3e 2d 2d 20 6e 6f 74 20 6d 6f 72 65 20   <i>-- not more 
7e80: 74 68 61 6e 20 31 30 20 69 6e 74 65 72 76 65 6e  than 10 interven
7e90: 69 6e 67 20 74 65 72 6d 73 2e 20 54 68 69 73 20  ing terms. This 
7ea0: 6d 61 74 63 68 65 73 20 74 68 65 20 6f 6e 6c 79  matches the only
7eb0: 20 64 6f 63 75 6d 65 6e 74 20 69 6e 3c 2f 69 3e   document in</i>
7ec0: 0a 20 20 3c 69 3e 2d 2d 20 74 61 62 6c 65 20 64  .  <i>-- table d
7ed0: 6f 63 73 20 28 73 69 6e 63 65 20 74 68 65 72 65  ocs (since there
7ee0: 20 61 72 65 20 6f 6e 6c 79 20 73 69 78 20 74 65   are only six te
7ef0: 72 6d 73 20 62 65 74 77 65 65 6e 20 22 53 51 4c  rms between "SQL
7f00: 69 74 65 22 20 61 6e 64 20 22 64 61 74 61 62 61  ite" and "databa
7f10: 73 65 22 3c 2f 69 3e 20 0a 20 20 3c 69 3e 2d 2d  se"</i> .  <i>--
7f20: 20 69 6e 20 74 68 65 20 64 6f 63 75 6d 65 6e 74   in the document
7f30: 29 3c 2f 69 3e 2e 0a 20 20 53 45 4c 45 43 54 20  )</i>..  SELECT 
7f40: 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52  * FROM docs WHER
7f50: 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27 73 71  E docs MATCH 'sq
7f60: 6c 69 74 65 20 4e 45 41 52 20 64 61 74 61 62 61  lite NEAR databa
7f70: 73 65 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 53 65  se';..  <i>-- Se
7f80: 61 72 63 68 20 66 6f 72 20 61 20 64 6f 63 75 6d  arch for a docum
7f90: 65 6e 74 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ent that contain
7fa0: 73 20 74 68 65 20 74 65 72 6d 73 20 22 73 71 6c  s the terms "sql
7fb0: 69 74 65 22 20 61 6e 64 20 22 64 61 74 61 62 61  ite" and "databa
7fc0: 73 65 22 20 77 69 74 68 3c 2f 69 3e 0a 20 20 3c  se" with</i>.  <
7fd0: 69 3e 2d 2d 20 6e 6f 74 20 6d 6f 72 65 20 74 68  i>-- not more th
7fe0: 61 6e 20 36 20 69 6e 74 65 72 76 65 6e 69 6e 67  an 6 intervening
7ff0: 20 74 65 72 6d 73 2e 20 54 68 69 73 20 61 6c 73   terms. This als
8000: 6f 20 6d 61 74 63 68 65 73 20 74 68 65 20 6f 6e  o matches the on
8010: 6c 79 20 64 6f 63 75 6d 65 6e 74 20 69 6e 3c 2f  ly document in</
8020: 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 61 62 6c 65  i>.  <i>-- table
8030: 20 64 6f 63 73 2e 20 4e 6f 74 65 20 74 68 61 74   docs. Note that
8040: 20 74 68 65 20 6f 72 64 65 72 20 69 6e 20 77 68   the order in wh
8050: 69 63 68 20 74 68 65 20 74 65 72 6d 73 20 61 70  ich the terms ap
8060: 70 65 61 72 20 69 6e 20 74 68 65 20 64 6f 63 75  pear in the docu
8070: 6d 65 6e 74 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  ment</i>.  <i>--
8080: 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74   does not have t
8090: 6f 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  o be the same as
80a0: 20 74 68 65 20 6f 72 64 65 72 20 69 6e 20 77 68   the order in wh
80b0: 69 63 68 20 74 68 65 79 20 61 70 70 65 61 72 20  ich they appear 
80c0: 69 6e 20 74 68 65 20 71 75 65 72 79 2e 3c 2f 69  in the query.</i
80d0: 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  >.  SELECT * FRO
80e0: 4d 20 64 6f 63 73 20 57 48 45 52 45 20 64 6f 63  M docs WHERE doc
80f0: 73 20 4d 41 54 43 48 20 27 64 61 74 61 62 61 73  s MATCH 'databas
8100: 65 20 4e 45 41 52 2f 36 20 73 71 6c 69 74 65 27  e NEAR/6 sqlite'
8110: 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 53 65 61 72 63  ;..  <i>-- Searc
8120: 68 20 66 6f 72 20 61 20 64 6f 63 75 6d 65 6e 74  h for a document
8130: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
8140: 68 65 20 74 65 72 6d 73 20 22 73 71 6c 69 74 65  he terms "sqlite
8150: 22 20 61 6e 64 20 22 64 61 74 61 62 61 73 65 22  " and "database"
8160: 20 77 69 74 68 3c 2f 69 3e 0a 20 20 3c 69 3e 2d   with</i>.  <i>-
8170: 2d 20 6e 6f 74 20 6d 6f 72 65 20 74 68 61 6e 20  - not more than 
8180: 35 20 69 6e 74 65 72 76 65 6e 69 6e 67 20 74 65  5 intervening te
8190: 72 6d 73 2e 20 54 68 69 73 20 71 75 65 72 79 20  rms. This query 
81a0: 6d 61 74 63 68 65 73 20 6e 6f 20 64 6f 63 75 6d  matches no docum
81b0: 65 6e 74 73 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45  ents.</i>.  SELE
81c0: 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57  CT * FROM docs W
81d0: 48 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20  HERE docs MATCH 
81e0: 27 64 61 74 61 62 61 73 65 20 4e 45 41 52 2f 35  'database NEAR/5
81f0: 20 73 71 6c 69 74 65 27 3b 0a 0a 20 20 3c 69 3e   sqlite';..  <i>
8200: 2d 2d 20 53 65 61 72 63 68 20 66 6f 72 20 61 20  -- Search for a 
8210: 64 6f 63 75 6d 65 6e 74 20 74 68 61 74 20 63 6f  document that co
8220: 6e 74 61 69 6e 73 20 74 68 65 20 70 68 72 61 73  ntains the phras
8230: 65 20 22 41 43 49 44 20 63 6f 6d 70 6c 69 61 6e  e "ACID complian
8240: 74 22 20 61 6e 64 20 74 68 65 20 74 65 72 6d 3c  t" and the term<
8250: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 22 64 61 74  /i>.  <i>-- "dat
8260: 61 62 61 73 65 22 20 77 69 74 68 20 6e 6f 74 20  abase" with not 
8270: 6d 6f 72 65 20 74 68 61 6e 20 32 20 74 65 72 6d  more than 2 term
8280: 73 20 73 65 70 61 72 61 74 69 6e 67 20 74 68 65  s separating the
8290: 20 74 77 6f 2e 20 54 68 69 73 20 6d 61 74 63 68   two. This match
82a0: 65 73 20 74 68 65 3c 2f 69 3e 0a 20 20 3c 69 3e  es the</i>.  <i>
82b0: 2d 2d 20 64 6f 63 75 6d 65 6e 74 20 73 74 6f 72  -- document stor
82c0: 65 64 20 69 6e 20 74 61 62 6c 65 20 64 6f 63 73  ed in table docs
82d0: 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a  .</i>.  SELECT *
82e0: 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45   FROM docs WHERE
82f0: 20 64 6f 63 73 20 4d 41 54 43 48 20 27 64 61 74   docs MATCH 'dat
8300: 61 62 61 73 65 20 4e 45 41 52 2f 32 20 22 41 43  abase NEAR/2 "AC
8310: 49 44 20 63 6f 6d 70 6c 69 61 6e 74 22 27 3b 0a  ID compliant"';.
8320: 0a 20 20 3c 69 3e 2d 2d 20 53 65 61 72 63 68 20  .  <i>-- Search 
8330: 66 6f 72 20 61 20 64 6f 63 75 6d 65 6e 74 20 74  for a document t
8340: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
8350: 20 70 68 72 61 73 65 20 22 41 43 49 44 20 63 6f   phrase "ACID co
8360: 6d 70 6c 69 61 6e 74 22 20 61 6e 64 20 74 68 65  mpliant" and the
8370: 20 74 65 72 6d 3c 2f 69 3e 0a 20 20 3c 69 3e 2d   term</i>.  <i>-
8380: 2d 20 22 73 71 6c 69 74 65 22 20 77 69 74 68 20  - "sqlite" with 
8390: 6e 6f 74 20 6d 6f 72 65 20 74 68 61 6e 20 32 20  not more than 2 
83a0: 74 65 72 6d 73 20 73 65 70 61 72 61 74 69 6e 67  terms separating
83b0: 20 74 68 65 20 74 77 6f 2e 20 54 68 69 73 20 61   the two. This a
83c0: 6c 73 6f 20 6d 61 74 63 68 65 73 3c 2f 69 3e 0a  lso matches</i>.
83d0: 20 20 3c 69 3e 2d 2d 20 74 68 65 20 6f 6e 6c 79    <i>-- the only
83e0: 20 64 6f 63 75 6d 65 6e 74 20 73 74 6f 72 65 64   document stored
83f0: 20 69 6e 20 74 61 62 6c 65 20 64 6f 63 73 2e 3c   in table docs.<
8400: 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  /i>.  SELECT * F
8410: 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20 64  ROM docs WHERE d
8420: 6f 63 73 20 4d 41 54 43 48 20 27 22 41 43 49 44  ocs MATCH '"ACID
8430: 20 63 6f 6d 70 6c 69 61 6e 74 22 20 4e 45 41 52   compliant" NEAR
8440: 2f 32 20 73 71 6c 69 74 65 27 3b 0a 3c 2f 63 6f  /2 sqlite';.</co
8450: 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 75 6c 3e 0a 20  deblock>..<ul>. 
8460: 20 3c 6c 69 20 73 74 79 6c 65 3d 22 6c 69 73 74   <li style="list
8470: 2d 73 74 79 6c 65 3a 20 6e 6f 6e 65 22 3e 3c 70  -style: none"><p
8480: 3e 0a 20 20 20 20 4d 6f 72 65 20 74 68 61 6e 20  >.    More than 
8490: 6f 6e 65 20 4e 45 41 52 20 6f 70 65 72 61 74 6f  one NEAR operato
84a0: 72 20 6d 61 79 20 61 70 70 65 61 72 20 69 6e 20  r may appear in 
84b0: 61 20 73 69 6e 67 6c 65 20 71 75 65 72 79 2e 20  a single query. 
84c0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 65 61 63  In this case eac
84d0: 68 0a 20 20 20 20 70 61 69 72 20 6f 66 20 74 65  h.    pair of te
84e0: 72 6d 73 20 6f 72 20 70 68 72 61 73 65 73 20 73  rms or phrases s
84f0: 65 70 61 72 61 74 65 64 20 62 79 20 61 20 4e 45  eparated by a NE
8500: 41 52 20 6f 70 65 72 61 74 6f 72 20 6d 75 73 74  AR operator must
8510: 20 61 70 70 65 61 72 20 77 69 74 68 69 6e 20 74   appear within t
8520: 68 65 0a 20 20 20 20 73 70 65 63 69 66 69 65 64  he.    specified
8530: 20 70 72 6f 78 69 6d 69 74 79 20 6f 66 20 65 61   proximity of ea
8540: 63 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20  ch other in the 
8550: 64 6f 63 75 6d 65 6e 74 2e 20 55 73 69 6e 67 20  document. Using 
8560: 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 20 61  the same table a
8570: 6e 64 0a 20 20 20 20 64 61 74 61 20 61 73 20 69  nd.    data as i
8580: 6e 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 65  n the block of e
8590: 78 61 6d 70 6c 65 73 20 61 62 6f 76 65 3a 0a 3c  xamples above:.<
85a0: 2f 75 6c 3e 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b  /ul>..<codeblock
85b0: 3e 20 0a 20 3c 69 3e 2d 2d 20 54 68 65 20 66 6f  > . <i>-- The fo
85c0: 6c 6c 6f 77 69 6e 67 20 71 75 65 72 79 20 73 65  llowing query se
85d0: 6c 65 63 74 73 20 64 6f 63 75 6d 65 6e 74 73 20  lects documents 
85e0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e  that contains an
85f0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
8600: 20 74 65 72 6d 20 3c 2f 69 3e 0a 20 20 3c 69 3e   term </i>.  <i>
8610: 2d 2d 20 22 73 71 6c 69 74 65 22 20 73 65 70 61  -- "sqlite" sepa
8620: 72 61 74 65 64 20 62 79 20 74 77 6f 20 6f 72 20  rated by two or 
8630: 66 65 77 65 72 20 74 65 72 6d 73 20 66 72 6f 6d  fewer terms from
8640: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
8650: 74 68 65 20 74 65 72 6d 20 22 61 63 69 64 22 2c  the term "acid",
8660: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 77 68 69  </i>.  <i>-- whi
8670: 63 68 20 69 73 20 69 6e 20 74 75 72 6e 20 73 65  ch is in turn se
8680: 70 61 72 61 74 65 64 20 62 79 20 74 77 6f 20 6f  parated by two o
8690: 72 20 66 65 77 65 72 20 74 65 72 6d 73 20 66 72  r fewer terms fr
86a0: 6f 6d 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  om an instance o
86b0: 66 20 74 68 65 20 74 65 72 6d 3c 2f 69 3e 0a 20  f the term</i>. 
86c0: 20 3c 69 3e 2d 2d 20 22 72 65 6c 61 74 69 6f 6e   <i>-- "relation
86d0: 61 6c 22 2e 20 41 73 20 69 74 20 68 61 70 70 65  al". As it happe
86e0: 6e 73 2c 20 74 68 65 20 6f 6e 6c 79 20 64 6f 63  ns, the only doc
86f0: 75 6d 65 6e 74 20 69 6e 20 74 61 62 6c 65 20 64  ument in table d
8700: 6f 63 73 20 73 61 74 69 73 66 69 65 73 20 74 68  ocs satisfies th
8710: 69 73 20 63 72 69 74 65 72 69 61 2e 3c 2f 69 3e  is criteria.</i>
8720: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
8730: 20 64 6f 63 73 20 57 48 45 52 45 20 64 6f 63 73   docs WHERE docs
8740: 20 4d 41 54 43 48 20 27 73 71 6c 69 74 65 20 4e   MATCH 'sqlite N
8750: 45 41 52 2f 32 20 61 63 69 64 20 4e 45 41 52 2f  EAR/2 acid NEAR/
8760: 32 20 72 65 6c 61 74 69 6f 6e 61 6c 27 3b 0a 0a  2 relational';..
8770: 20 20 3c 69 3e 2d 2d 20 54 68 69 73 20 71 75 65    <i>-- This que
8780: 72 79 20 6d 61 74 63 68 65 73 20 6e 6f 20 64 6f  ry matches no do
8790: 63 75 6d 65 6e 74 73 2e 20 54 68 65 72 65 20 69  cuments. There i
87a0: 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  s an instance of
87b0: 20 74 68 65 20 74 65 72 6d 20 22 73 71 6c 69 74   the term "sqlit
87c0: 65 22 20 77 69 74 68 3c 2f 69 3e 0a 20 20 3c 69  e" with</i>.  <i
87d0: 3e 2d 2d 20 73 75 66 66 69 63 69 65 6e 74 20 70  >-- sufficient p
87e0: 72 6f 78 69 6d 69 74 79 20 74 6f 20 61 6e 20 69  roximity to an i
87f0: 6e 73 74 61 6e 63 65 20 6f 66 20 22 61 63 69 64  nstance of "acid
8800: 22 20 62 75 74 20 69 74 20 69 73 20 6e 6f 74 20  " but it is not 
8810: 73 75 66 66 69 63 69 65 6e 74 6c 79 20 63 6c 6f  sufficiently clo
8820: 73 65 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74  se</i>.  <i>-- t
8830: 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  o an instance of
8840: 20 74 68 65 20 74 65 72 6d 20 22 72 65 6c 61 74   the term "relat
8850: 69 6f 6e 61 6c 22 2e 3c 2f 69 3e 0a 20 20 53 45  ional".</i>.  SE
8860: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73  LECT * FROM docs
8870: 20 57 48 45 52 45 20 64 6f 63 73 20 4d 41 54 43   WHERE docs MATC
8880: 48 20 27 61 63 69 64 20 4e 45 41 52 2f 32 20 73  H 'acid NEAR/2 s
8890: 71 6c 69 74 65 20 4e 45 41 52 2f 32 20 72 65 6c  qlite NEAR/2 rel
88a0: 61 74 69 6f 6e 61 6c 27 3b 0a 3c 2f 63 6f 64 65  ational';.</code
88b0: 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 50 68  block>..<p>.  Ph
88c0: 72 61 73 65 20 61 6e 64 20 4e 45 41 52 20 71 75  rase and NEAR qu
88d0: 65 72 69 65 73 20 6d 61 79 20 6e 6f 74 20 73 70  eries may not sp
88e0: 61 6e 20 6d 75 6c 74 69 70 6c 65 20 63 6f 6c 75  an multiple colu
88f0: 6d 6e 73 20 77 69 74 68 69 6e 20 61 20 72 6f 77  mns within a row
8900: 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 74 68 72  ...<p>.  The thr
8910: 65 65 20 62 61 73 69 63 20 71 75 65 72 79 20 74  ee basic query t
8920: 79 70 65 73 20 64 65 73 63 72 69 62 65 64 20 61  ypes described a
8930: 62 6f 76 65 20 6d 61 79 20 62 65 20 75 73 65 64  bove may be used
8940: 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 66 75   to query the fu
8950: 6c 6c 2d 74 65 78 74 0a 20 20 69 6e 64 65 78 20  ll-text.  index 
8960: 66 6f 72 20 74 68 65 20 73 65 74 20 6f 66 20 64  for the set of d
8970: 6f 63 75 6d 65 6e 74 73 20 74 68 61 74 20 6d 61  ocuments that ma
8980: 74 63 68 20 74 68 65 20 73 70 65 63 69 66 69 65  tch the specifie
8990: 64 20 63 72 69 74 65 72 69 61 2e 20 55 73 69 6e  d criteria. Usin
89a0: 67 20 74 68 65 0a 20 20 46 54 53 20 71 75 65 72  g the.  FTS quer
89b0: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 61 6e  y expression lan
89c0: 67 75 61 67 65 20 69 74 20 69 73 20 70 6f 73 73  guage it is poss
89d0: 69 62 6c 65 20 74 6f 20 70 65 72 66 6f 72 6d 20  ible to perform 
89e0: 76 61 72 69 6f 75 73 20 73 65 74 20 0a 20 20 6f  various set .  o
89f0: 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20 74 68 65  perations on the
8a00: 20 72 65 73 75 6c 74 73 20 6f 66 20 62 61 73 69   results of basi
8a10: 63 20 71 75 65 72 69 65 73 2e 20 54 68 65 72 65  c queries. There
8a20: 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 74   are currently t
8a30: 68 72 65 65 20 0a 20 20 73 75 70 70 6f 72 74 65  hree .  supporte
8a40: 64 20 6f 70 65 72 61 74 69 6f 6e 73 3a 0a 0a 3c  d operations:..<
8a50: 75 6c 3e 0a 20 20 3c 6c 69 3e 20 54 68 65 20 41  ul>.  <li> The A
8a60: 4e 44 20 6f 70 65 72 61 74 6f 72 20 64 65 74 65  ND operator dete
8a70: 72 6d 69 6e 65 73 20 74 68 65 20 3c 62 3e 69 6e  rmines the <b>in
8a80: 74 65 72 73 65 63 74 69 6f 6e 3c 2f 62 3e 20 6f  tersection</b> o
8a90: 66 20 74 77 6f 20 73 65 74 73 20 6f 66 20 64 6f  f two sets of do
8aa0: 63 75 6d 65 6e 74 73 2e 0a 0a 20 20 3c 6c 69 3e  cuments...  <li>
8ab0: 20 54 68 65 20 4f 52 20 6f 70 65 72 61 74 6f 72   The OR operator
8ac0: 20 63 61 6c 63 75 6c 61 74 65 73 20 74 68 65 20   calculates the 
8ad0: 3c 62 3e 75 6e 69 6f 6e 3c 2f 62 3e 20 6f 66 20  <b>union</b> of 
8ae0: 74 77 6f 20 73 65 74 73 20 6f 66 20 64 6f 63 75  two sets of docu
8af0: 6d 65 6e 74 73 2e 0a 0a 20 20 3c 6c 69 3e 20 54  ments...  <li> T
8b00: 68 65 20 4e 4f 54 20 6f 70 65 72 61 74 6f 72 20  he NOT operator 
8b10: 28 6f 72 2c 20 69 66 20 75 73 69 6e 67 20 74 68  (or, if using th
8b20: 65 20 73 74 61 6e 64 61 72 64 20 73 79 6e 74 61  e standard synta
8b30: 78 2c 20 61 20 75 6e 61 72 79 20 22 2d 22 20 6f  x, a unary "-" o
8b40: 70 65 72 61 74 6f 72 29 0a 20 20 20 20 20 20 20  perator).       
8b50: 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f 20 63  may be used to c
8b60: 6f 6d 70 75 74 65 20 74 68 65 20 3c 62 3e 72 65  ompute the <b>re
8b70: 6c 61 74 69 76 65 20 63 6f 6d 70 6c 65 6d 65 6e  lative complemen
8b80: 74 3c 2f 62 3e 20 6f 66 20 6f 6e 65 20 73 65 74  t</b> of one set
8b90: 20 6f 66 0a 20 20 20 20 20 20 20 64 6f 63 75 6d   of.       docum
8ba0: 65 6e 74 73 20 77 69 74 68 20 72 65 73 70 65 63  ents with respec
8bb0: 74 20 74 6f 20 61 6e 6f 74 68 65 72 2e 0a 3c 2f  t to another..</
8bc0: 75 6c 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 46  ul>..<p>.  The F
8bd0: 54 53 20 6d 6f 64 75 6c 65 73 20 6d 61 79 20 62  TS modules may b
8be0: 65 20 63 6f 6d 70 69 6c 65 64 20 74 6f 20 75 73  e compiled to us
8bf0: 65 20 6f 6e 65 20 6f 66 20 74 77 6f 20 73 6c 69  e one of two sli
8c00: 67 68 74 6c 79 20 64 69 66 66 65 72 65 6e 74 20  ghtly different 
8c10: 76 65 72 73 69 6f 6e 73 0a 20 20 6f 66 20 74 68  versions.  of th
8c20: 65 20 66 75 6c 6c 2d 74 65 78 74 20 71 75 65 72  e full-text quer
8c30: 79 20 73 79 6e 74 61 78 2c 20 74 68 65 20 22 73  y syntax, the "s
8c40: 74 61 6e 64 61 72 64 22 20 71 75 65 72 79 20 73  tandard" query s
8c50: 79 6e 74 61 78 20 61 6e 64 20 74 68 65 20 22 65  yntax and the "e
8c60: 6e 68 61 6e 63 65 64 22 20 0a 20 20 71 75 65 72  nhanced" .  quer
8c70: 79 20 73 79 6e 74 61 78 2e 20 54 68 65 20 62 61  y syntax. The ba
8c80: 73 69 63 20 74 65 72 6d 2c 20 74 65 72 6d 2d 70  sic term, term-p
8c90: 72 65 66 69 78 2c 20 70 68 72 61 73 65 20 61 6e  refix, phrase an
8ca0: 64 20 4e 45 41 52 20 71 75 65 72 69 65 73 20 64  d NEAR queries d
8cb0: 65 73 63 72 69 62 65 64 20 0a 20 20 61 62 6f 76  escribed .  abov
8cc0: 65 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 69  e are the same i
8cd0: 6e 20 62 6f 74 68 20 76 65 72 73 69 6f 6e 73 20  n both versions 
8ce0: 6f 66 20 74 68 65 20 73 79 6e 74 61 78 2e 20 54  of the syntax. T
8cf0: 68 65 20 77 61 79 20 69 6e 20 77 68 69 63 68 20  he way in which 
8d00: 73 65 74 20 0a 20 20 6f 70 65 72 61 74 69 6f 6e  set .  operation
8d10: 73 20 61 72 65 20 73 70 65 63 69 66 69 65 64 20  s are specified 
8d20: 69 73 20 73 6c 69 67 68 74 6c 79 20 64 69 66 66  is slightly diff
8d30: 65 72 65 6e 74 2e 20 54 68 65 20 66 6f 6c 6c 6f  erent. The follo
8d40: 77 69 6e 67 20 74 77 6f 20 73 75 62 2d 73 65 63  wing two sub-sec
8d50: 74 69 6f 6e 73 20 0a 20 20 64 65 73 63 72 69 62  tions .  describ
8d60: 65 20 74 68 65 20 70 61 72 74 20 6f 66 20 74 68  e the part of th
8d70: 65 20 74 77 6f 20 71 75 65 72 79 20 73 79 6e 74  e two query synt
8d80: 61 78 65 73 20 74 68 61 74 20 70 65 72 74 61 69  axes that pertai
8d90: 6e 73 20 74 6f 20 73 65 74 20 6f 70 65 72 61 74  ns to set operat
8da0: 69 6f 6e 73 2e 20 0a 20 20 52 65 66 65 72 20 74  ions. .  Refer t
8db0: 6f 20 74 68 65 20 64 65 73 63 72 69 70 74 69 6f  o the descriptio
8dc0: 6e 20 6f 66 20 68 6f 77 20 74 6f 20 5b 63 6f 6d  n of how to [com
8dd0: 70 69 6c 65 20 66 74 73 5d 20 66 6f 72 20 63 6f  pile fts] for co
8de0: 6d 70 69 6c 61 74 69 6f 6e 20 6e 6f 74 65 73 2e  mpilation notes.
8df0: 0a 0a 3c 68 32 20 74 61 67 73 3d 22 65 6e 68 61  ..<h2 tags="enha
8e00: 6e 63 65 64 20 71 75 65 72 79 20 73 79 6e 74 61  nced query synta
8e10: 78 22 3e 0a 20 20 53 65 74 20 4f 70 65 72 61 74  x">.  Set Operat
8e20: 69 6f 6e 73 20 55 73 69 6e 67 20 54 68 65 20 45  ions Using The E
8e30: 6e 68 61 6e 63 65 64 20 51 75 65 72 79 20 53 79  nhanced Query Sy
8e40: 6e 74 61 78 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a 20  ntax</h2>..<p>. 
8e50: 20 54 68 65 20 65 6e 68 61 6e 63 65 64 20 71 75   The enhanced qu
8e60: 65 72 79 20 73 79 6e 74 61 78 20 73 75 70 70 6f  ery syntax suppo
8e70: 72 74 73 20 74 68 65 20 41 4e 44 2c 20 4f 52 20  rts the AND, OR 
8e80: 61 6e 64 20 4e 4f 54 20 62 69 6e 61 72 79 20 73  and NOT binary s
8e90: 65 74 20 6f 70 65 72 61 74 6f 72 73 2e 0a 20 20  et operators..  
8ea0: 45 61 63 68 20 6f 66 20 74 68 65 20 74 77 6f 20  Each of the two 
8eb0: 6f 70 65 72 61 6e 64 73 20 74 6f 20 61 6e 20 6f  operands to an o
8ec0: 70 65 72 61 74 6f 72 20 6d 61 79 20 62 65 20 61  perator may be a
8ed0: 20 62 61 73 69 63 20 46 54 53 20 71 75 65 72 79   basic FTS query
8ee0: 2c 20 6f 72 20 74 68 65 0a 20 20 72 65 73 75 6c  , or the.  resul
8ef0: 74 20 6f 66 20 61 6e 6f 74 68 65 72 20 41 4e 44  t of another AND
8f00: 2c 20 4f 52 20 6f 72 20 4e 4f 54 20 73 65 74 20  , OR or NOT set 
8f10: 6f 70 65 72 61 74 69 6f 6e 2e 20 4f 70 65 72 61  operation. Opera
8f20: 74 6f 72 73 20 6d 75 73 74 20 62 65 20 65 6e 74  tors must be ent
8f30: 65 72 65 64 0a 20 20 75 73 69 6e 67 20 63 61 70  ered.  using cap
8f40: 69 74 61 6c 20 6c 65 74 74 65 72 73 2e 20 4f 74  ital letters. Ot
8f50: 68 65 72 77 69 73 65 2c 20 74 68 65 79 20 61 72  herwise, they ar
8f60: 65 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  e interpreted as
8f70: 20 62 61 73 69 63 20 74 65 72 6d 20 71 75 65 72   basic term quer
8f80: 69 65 73 0a 20 20 69 6e 73 74 65 61 64 20 6f 66  ies.  instead of
8f90: 20 73 65 74 20 6f 70 65 72 61 74 6f 72 73 2e 0a   set operators..
8fa0: 0a 3c 70 3e 0a 20 20 54 68 65 20 41 4e 44 20 6f  .<p>.  The AND o
8fb0: 70 65 72 61 74 6f 72 20 6d 61 79 20 62 65 20 69  perator may be i
8fc0: 6d 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66  mplicitly specif
8fd0: 69 65 64 2e 20 49 66 20 74 77 6f 20 62 61 73 69  ied. If two basi
8fe0: 63 20 71 75 65 72 69 65 73 20 61 70 70 65 61 72  c queries appear
8ff0: 20 0a 20 20 77 69 74 68 20 6e 6f 20 6f 70 65 72   .  with no oper
9000: 61 74 6f 72 20 73 65 70 61 72 61 74 69 6e 67 20  ator separating 
9010: 74 68 65 6d 20 69 6e 20 61 6e 20 46 54 53 20 71  them in an FTS q
9020: 75 65 72 79 20 73 74 72 69 6e 67 2c 20 74 68 65  uery string, the
9030: 20 72 65 73 75 6c 74 73 20 61 72 65 0a 20 20 74   results are.  t
9040: 68 65 20 73 61 6d 65 20 61 73 20 69 66 20 74 68  he same as if th
9050: 65 20 74 77 6f 20 62 61 73 69 63 20 71 75 65 72  e two basic quer
9060: 69 65 73 20 77 65 72 65 20 73 65 70 61 72 61 74  ies were separat
9070: 65 64 20 62 79 20 61 6e 20 41 4e 44 20 6f 70 65  ed by an AND ope
9080: 72 61 74 6f 72 2e 0a 20 20 46 6f 72 20 65 78 61  rator..  For exa
9090: 6d 70 6c 65 2c 20 74 68 65 20 71 75 65 72 79 20  mple, the query 
90a0: 65 78 70 72 65 73 73 69 6f 6e 20 22 69 6d 70 6c  expression "impl
90b0: 69 63 69 74 20 6f 70 65 72 61 74 6f 72 22 20 69  icit operator" i
90c0: 73 20 61 20 6d 6f 72 65 20 73 75 63 63 69 6e 63  s a more succinc
90d0: 74 0a 20 20 76 65 72 73 69 6f 6e 20 6f 66 20 22  t.  version of "
90e0: 69 6d 70 6c 69 63 69 74 20 41 4e 44 20 6f 70 65  implicit AND ope
90f0: 72 61 74 6f 72 22 2e 0a 0a 3c 63 6f 64 65 62 6c  rator"...<codebl
9100: 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d 20 56 69 72  ock>.  <i>-- Vir
9110: 74 75 61 6c 20 74 61 62 6c 65 20 64 65 63 6c 61  tual table decla
9120: 72 61 74 69 6f 6e 3c 2f 69 3e 0a 20 20 43 52 45  ration</i>.  CRE
9130: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
9140: 45 20 64 6f 63 73 20 55 53 49 4e 47 20 66 74 73  E docs USING fts
9150: 33 28 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 56 69  3();..  <i>-- Vi
9160: 72 74 75 61 6c 20 74 61 62 6c 65 20 64 61 74 61  rtual table data
9170: 3c 2f 69 3e 0a 20 20 49 4e 53 45 52 54 20 49 4e  </i>.  INSERT IN
9180: 54 4f 20 64 6f 63 73 28 64 6f 63 69 64 2c 20 63  TO docs(docid, c
9190: 6f 6e 74 65 6e 74 29 20 56 41 4c 55 45 53 28 31  ontent) VALUES(1
91a0: 2c 20 27 61 20 64 61 74 61 62 61 73 65 20 69 73  , 'a database is
91b0: 20 61 20 73 6f 66 74 77 61 72 65 20 73 79 73 74   a software syst
91c0: 65 6d 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  em');.  INSERT I
91d0: 4e 54 4f 20 64 6f 63 73 28 64 6f 63 69 64 2c 20  NTO docs(docid, 
91e0: 63 6f 6e 74 65 6e 74 29 20 56 41 4c 55 45 53 28  content) VALUES(
91f0: 32 2c 20 27 73 71 6c 69 74 65 20 69 73 20 61 20  2, 'sqlite is a 
9200: 73 6f 66 74 77 61 72 65 20 73 79 73 74 65 6d 27  software system'
9210: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
9220: 20 64 6f 63 73 28 64 6f 63 69 64 2c 20 63 6f 6e   docs(docid, con
9230: 74 65 6e 74 29 20 56 41 4c 55 45 53 28 33 2c 20  tent) VALUES(3, 
9240: 27 73 71 6c 69 74 65 20 69 73 20 61 20 64 61 74  'sqlite is a dat
9250: 61 62 61 73 65 27 29 3b 0a 0a 20 20 3c 69 3e 2d  abase');..  <i>-
9260: 2d 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 74  - Return the set
9270: 20 6f 66 20 64 6f 63 75 6d 65 6e 74 73 20 74 68   of documents th
9280: 61 74 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 74  at contain the t
9290: 65 72 6d 20 22 73 71 6c 69 74 65 22 2c 20 61 6e  erm "sqlite", an
92a0: 64 20 74 68 65 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  d the</i>.  <i>-
92b0: 2d 20 74 65 72 6d 20 22 64 61 74 61 62 61 73 65  - term "database
92c0: 22 2e 20 54 68 69 73 20 71 75 65 72 79 20 77 69  ". This query wi
92d0: 6c 6c 20 72 65 74 75 72 6e 20 74 68 65 20 64 6f  ll return the do
92e0: 63 75 6d 65 6e 74 20 77 69 74 68 20 64 6f 63 69  cument with doci
92f0: 64 20 33 20 6f 6e 6c 79 2e 3c 2f 69 3e 0a 20 20  d 3 only.</i>.  
9300: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f  SELECT * FROM do
9310: 63 73 20 57 48 45 52 45 20 64 6f 63 73 20 4d 41  cs WHERE docs MA
9320: 54 43 48 20 27 73 71 6c 69 74 65 20 41 4e 44 20  TCH 'sqlite AND 
9330: 64 61 74 61 62 61 73 65 27 3b 0a 0a 20 20 3c 69  database';..  <i
9340: 3e 2d 2d 20 41 67 61 69 6e 2c 20 72 65 74 75 72  >-- Again, retur
9350: 6e 20 74 68 65 20 73 65 74 20 6f 66 20 64 6f 63  n the set of doc
9360: 75 6d 65 6e 74 73 20 74 68 61 74 20 63 6f 6e 74  uments that cont
9370: 61 69 6e 20 62 6f 74 68 20 22 73 71 6c 69 74 65  ain both "sqlite
9380: 22 20 61 6e 64 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  " and</i>.  <i>-
9390: 2d 20 22 64 61 74 61 62 61 73 65 22 2e 20 54 68  - "database". Th
93a0: 69 73 20 74 69 6d 65 2c 20 75 73 65 20 61 6e 20  is time, use an 
93b0: 69 6d 70 6c 69 63 69 74 20 41 4e 44 20 6f 70 65  implicit AND ope
93c0: 72 61 74 6f 72 2e 20 41 67 61 69 6e 2c 20 64 6f  rator. Again, do
93d0: 63 75 6d 65 6e 74 3c 2f 69 3e 0a 20 20 3c 69 3e  cument</i>.  <i>
93e0: 2d 2d 20 33 20 69 73 20 74 68 65 20 6f 6e 6c 79  -- 3 is the only
93f0: 20 64 6f 63 75 6d 65 6e 74 20 6d 61 74 63 68 65   document matche
9400: 64 20 62 79 20 74 68 69 73 20 71 75 65 72 79 2e  d by this query.
9410: 20 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a   </i>.  SELECT *
9420: 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45   FROM docs WHERE
9430: 20 64 6f 63 73 20 4d 41 54 43 48 20 27 64 61 74   docs MATCH 'dat
9440: 61 62 61 73 65 20 73 71 6c 69 74 65 27 3b 0a 0a  abase sqlite';..
9450: 20 20 3c 69 3e 2d 2d 20 51 75 65 72 79 20 66 6f    <i>-- Query fo
9460: 72 20 74 68 65 20 73 65 74 20 6f 66 20 64 6f 63  r the set of doc
9470: 75 6d 65 6e 74 73 20 74 68 61 74 20 63 6f 6e 74  uments that cont
9480: 61 69 6e 73 20 65 69 74 68 65 72 20 22 73 71 6c  ains either "sql
9490: 69 74 65 22 20 6f 72 20 22 64 61 74 61 62 61 73  ite" or "databas
94a0: 65 22 2e 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20  e".</i>.  <i>-- 
94b0: 41 6c 6c 20 74 68 72 65 65 20 64 6f 63 75 6d 65  All three docume
94c0: 6e 74 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  nts in the datab
94d0: 61 73 65 20 61 72 65 20 6d 61 74 63 68 65 64 20  ase are matched 
94e0: 62 79 20 74 68 69 73 20 71 75 65 72 79 2e 3c 2f  by this query.</
94f0: 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52  i>.  SELECT * FR
9500: 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20 64 6f  OM docs WHERE do
9510: 63 73 20 4d 41 54 43 48 20 27 73 71 6c 69 74 65  cs MATCH 'sqlite
9520: 20 4f 52 20 64 61 74 61 62 61 73 65 27 3b 0a 0a   OR database';..
9530: 20 20 3c 69 3e 2d 2d 20 51 75 65 72 79 20 66 6f    <i>-- Query fo
9540: 72 20 61 6c 6c 20 64 6f 63 75 6d 65 6e 74 73 20  r all documents 
9550: 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 74 68 65  that contain the
9560: 20 74 65 72 6d 20 22 64 61 74 61 62 61 73 65 22   term "database"
9570: 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 63 6f 6e  , but do not con
9580: 74 61 69 6e 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  tain</i>.  <i>--
9590: 20 74 68 65 20 74 65 72 6d 20 22 73 71 6c 69 74   the term "sqlit
95a0: 65 22 2e 20 44 6f 63 75 6d 65 6e 74 20 31 20 69  e". Document 1 i
95b0: 73 20 74 68 65 20 6f 6e 6c 79 20 64 6f 63 75 6d  s the only docum
95c0: 65 6e 74 20 74 68 61 74 20 6d 61 74 63 68 65 73  ent that matches
95d0: 20 74 68 69 73 20 63 72 69 74 65 72 69 61 2e 3c   this criteria.<
95e0: 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  /i>.  SELECT * F
95f0: 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20 64  ROM docs WHERE d
9600: 6f 63 73 20 4d 41 54 43 48 20 27 64 61 74 61 62  ocs MATCH 'datab
9610: 61 73 65 20 4e 4f 54 20 73 71 6c 69 74 65 27 3b  ase NOT sqlite';
9620: 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68 65 20 66 6f  ..  <i>-- The fo
9630: 6c 6c 6f 77 69 6e 67 20 71 75 65 72 79 20 6d 61  llowing query ma
9640: 74 63 68 65 73 20 6e 6f 20 64 6f 63 75 6d 65 6e  tches no documen
9650: 74 73 2e 20 42 65 63 61 75 73 65 20 22 61 6e 64  ts. Because "and
9660: 22 20 69 73 20 69 6e 20 6c 6f 77 65 72 63 61 73  " is in lowercas
9670: 65 20 6c 65 74 74 65 72 73 2c 3c 2f 69 3e 0a 20  e letters,</i>. 
9680: 20 3c 69 3e 2d 2d 20 69 74 20 69 73 20 69 6e 74   <i>-- it is int
9690: 65 72 70 72 65 74 65 64 20 61 73 20 61 20 62 61  erpreted as a ba
96a0: 73 69 63 20 74 65 72 6d 20 71 75 65 72 79 20 69  sic term query i
96b0: 6e 73 74 65 61 64 20 6f 66 20 61 6e 20 6f 70 65  nstead of an ope
96c0: 72 61 74 6f 72 2e 20 4f 70 65 72 61 74 6f 72 73  rator. Operators
96d0: 20 6d 75 73 74 3c 2f 69 3e 0a 20 20 3c 69 3e 2d   must</i>.  <i>-
96e0: 2d 20 62 65 20 73 70 65 63 69 66 69 65 64 20 75  - be specified u
96f0: 73 69 6e 67 20 63 61 70 69 74 61 6c 20 6c 65 74  sing capital let
9700: 74 65 72 73 2e 20 49 6e 20 70 72 61 63 74 69 63  ters. In practic
9710: 65 2c 20 74 68 69 73 20 71 75 65 72 79 20 77 69  e, this query wi
9720: 6c 6c 20 6d 61 74 63 68 20 61 6e 79 20 64 6f 63  ll match any doc
9730: 75 6d 65 6e 74 73 3c 2f 69 3e 0a 20 20 3c 69 3e  uments</i>.  <i>
9740: 2d 2d 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20  -- that contain 
9750: 65 61 63 68 20 6f 66 20 74 68 65 20 74 68 72 65  each of the thre
9760: 65 20 74 65 72 6d 73 20 22 64 61 74 61 62 61 73  e terms "databas
9770: 65 22 2c 20 22 61 6e 64 22 20 61 6e 64 20 22 73  e", "and" and "s
9780: 71 6c 69 74 65 22 20 61 74 20 6c 65 61 73 74 20  qlite" at least 
9790: 6f 6e 63 65 2e 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  once.</i>.  <i>-
97a0: 2d 20 4e 6f 20 64 6f 63 75 6d 65 6e 74 73 20 69  - No documents i
97b0: 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 20 64 61  n the example da
97c0: 74 61 20 61 62 6f 76 65 20 6d 61 74 63 68 20 74  ta above match t
97d0: 68 69 73 20 63 72 69 74 65 72 69 61 2e 3c 2f 69  his criteria.</i
97e0: 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  >.  SELECT * FRO
97f0: 4d 20 64 6f 63 73 20 57 48 45 52 45 20 64 6f 63  M docs WHERE doc
9800: 73 20 4d 41 54 43 48 20 27 64 61 74 61 62 61 73  s MATCH 'databas
9810: 65 20 61 6e 64 20 73 71 6c 69 74 65 27 3b 0a 3c  e and sqlite';.<
9820: 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e  /codeblock>..<p>
9830: 0a 20 20 54 68 65 20 65 78 61 6d 70 6c 65 73 20  .  The examples 
9840: 61 62 6f 76 65 20 61 6c 6c 20 75 73 65 20 62 61  above all use ba
9850: 73 69 63 20 66 75 6c 6c 2d 74 65 78 74 20 74 65  sic full-text te
9860: 72 6d 20 71 75 65 72 69 65 73 20 61 73 20 62 6f  rm queries as bo
9870: 74 68 20 6f 70 65 72 61 6e 64 73 20 6f 66 20 0a  th operands of .
9880: 20 20 74 68 65 20 73 65 74 20 6f 70 65 72 61 74    the set operat
9890: 69 6f 6e 73 20 64 65 6d 6f 6e 73 74 72 61 74 65  ions demonstrate
98a0: 64 2e 20 50 68 72 61 73 65 20 61 6e 64 20 4e 45  d. Phrase and NE
98b0: 41 52 20 71 75 65 72 69 65 73 20 6d 61 79 20 61  AR queries may a
98c0: 6c 73 6f 20 62 65 20 75 73 65 64 2c 0a 20 20 61  lso be used,.  a
98d0: 73 20 6d 61 79 20 74 68 65 20 72 65 73 75 6c 74  s may the result
98e0: 73 20 6f 66 20 6f 74 68 65 72 20 73 65 74 20 6f  s of other set o
98f0: 70 65 72 61 74 69 6f 6e 73 2e 20 57 68 65 6e 20  perations. When 
9900: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 73 65  more than one se
9910: 74 20 6f 70 65 72 61 74 69 6f 6e 0a 20 20 69 73  t operation.  is
9920: 20 70 72 65 73 65 6e 74 20 69 6e 20 61 6e 20 46   present in an F
9930: 54 53 20 71 75 65 72 79 2c 20 74 68 65 20 70 72  TS query, the pr
9940: 65 63 65 64 65 6e 63 65 20 6f 66 20 6f 70 65 72  ecedence of oper
9950: 61 74 6f 72 73 20 69 73 20 61 73 20 66 6f 6c 6c  ators is as foll
9960: 6f 77 73 3a 0a 0a 3c 74 61 62 6c 65 20 73 74 72  ows:..<table str
9970: 69 70 65 64 3d 31 3e 0a 20 20 3c 74 72 3e 3c 74  iped=1>.  <tr><t
9980: 68 3e 4f 70 65 72 61 74 6f 72 3c 74 68 3e 45 6e  h>Operator<th>En
9990: 68 61 6e 63 65 64 20 51 75 65 72 79 20 53 79 6e  hanced Query Syn
99a0: 74 61 78 20 50 72 65 63 65 64 65 6e 63 65 0a 20  tax Precedence. 
99b0: 20 3c 74 72 3e 3c 74 64 3e 4e 4f 54 20 3c 74 64   <tr><td>NOT <td
99c0: 3e 20 48 69 67 68 65 73 74 20 70 72 65 63 65 64  > Highest preced
99d0: 65 6e 63 65 20 28 74 69 67 68 74 65 73 74 20 67  ence (tightest g
99e0: 72 6f 75 70 69 6e 67 29 2e 0a 20 20 3c 74 72 3e  rouping)..  <tr>
99f0: 3c 74 64 3e 41 4e 44 20 3c 74 64 3e 0a 20 20 3c  <td>AND <td>.  <
9a00: 74 72 3e 3c 74 64 3e 4f 52 20 20 3c 74 64 3e 20  tr><td>OR  <td> 
9a10: 4c 6f 77 65 73 74 20 70 72 65 63 65 64 65 6e 63  Lowest precedenc
9a20: 65 20 28 6c 6f 6f 73 65 73 74 20 67 72 6f 75 70  e (loosest group
9a30: 69 6e 67 29 2e 0a 3c 2f 74 61 62 6c 65 3e 0a 0a  ing)..</table>..
9a40: 3c 70 3e 0a 20 20 57 68 65 6e 20 75 73 69 6e 67  <p>.  When using
9a50: 20 74 68 65 20 65 6e 68 61 6e 63 65 64 20 71 75   the enhanced qu
9a60: 65 72 79 20 73 79 6e 74 61 78 2c 20 70 61 72 65  ery syntax, pare
9a70: 6e 74 68 65 73 69 73 20 6d 61 79 20 62 65 20 75  nthesis may be u
9a80: 73 65 64 20 74 6f 20 6f 76 65 72 72 69 64 65 0a  sed to override.
9a90: 20 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 72    the default pr
9aa0: 65 63 65 64 65 6e 63 65 20 6f 66 20 74 68 65 20  ecedence of the 
9ab0: 76 61 72 69 6f 75 73 20 6f 70 65 72 61 74 6f 72  various operator
9ac0: 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  s. For example:.
9ad0: 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 20 20  .<codeblock>..  
9ae0: 3c 69 3e 2d 2d 20 52 65 74 75 72 6e 20 74 68 65  <i>-- Return the
9af0: 20 64 6f 63 69 64 20 76 61 6c 75 65 73 20 61 73   docid values as
9b00: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 6c  sociated with al
9b10: 6c 20 64 6f 63 75 6d 65 6e 74 73 20 74 68 61 74  l documents that
9b20: 20 63 6f 6e 74 61 69 6e 20 74 68 65 3c 2f 69 3e   contain the</i>
9b30: 0a 20 20 3c 69 3e 2d 2d 20 74 77 6f 20 74 65 72  .  <i>-- two ter
9b40: 6d 73 20 22 73 71 6c 69 74 65 22 20 61 6e 64 20  ms "sqlite" and 
9b50: 22 64 61 74 61 62 61 73 65 22 2c 20 61 6e 64 2f  "database", and/
9b60: 6f 72 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 74  or contain the t
9b70: 65 72 6d 20 22 6c 69 62 72 61 72 79 22 2e 3c 2f  erm "library".</
9b80: 69 3e 0a 20 20 53 45 4c 45 43 54 20 64 6f 63 69  i>.  SELECT doci
9b90: 64 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52  d FROM docs WHER
9ba0: 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27 73 71  E docs MATCH 'sq
9bb0: 6c 69 74 65 20 41 4e 44 20 64 61 74 61 62 61 73  lite AND databas
9bc0: 65 20 4f 52 20 6c 69 62 72 61 72 79 27 3b 0a 0a  e OR library';..
9bd0: 20 20 3c 69 3e 2d 2d 20 54 68 69 73 20 71 75 65    <i>-- This que
9be0: 72 79 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  ry is equivalent
9bf0: 20 74 6f 20 74 68 65 20 61 62 6f 76 65 2e 3c 2f   to the above.</
9c00: 69 3e 0a 20 20 53 45 4c 45 43 54 20 64 6f 63 69  i>.  SELECT doci
9c10: 64 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52  d FROM docs WHER
9c20: 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27 73 71  E docs MATCH 'sq
9c30: 6c 69 74 65 20 41 4e 44 20 64 61 74 61 62 61 73  lite AND databas
9c40: 65 27 0a 20 20 20 20 55 4e 49 4f 4e 0a 20 20 53  e'.    UNION.  S
9c50: 45 4c 45 43 54 20 64 6f 63 69 64 20 46 52 4f 4d  ELECT docid FROM
9c60: 20 64 6f 63 73 20 57 48 45 52 45 20 64 6f 63 73   docs WHERE docs
9c70: 20 4d 41 54 43 48 20 27 6c 69 62 72 61 72 79 27   MATCH 'library'
9c80: 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 51 75 65 72 79  ;..  <i>-- Query
9c90: 20 66 6f 72 20 74 68 65 20 73 65 74 20 6f 66 20   for the set of 
9ca0: 64 6f 63 75 6d 65 6e 74 73 20 74 68 61 74 20 63  documents that c
9cb0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 65 72 6d  ontains the term
9cc0: 20 22 6c 69 6e 75 78 22 2c 20 61 6e 64 20 61 74   "linux", and at
9cd0: 20 6c 65 61 73 74 3c 2f 69 3e 0a 20 20 3c 69 3e   least</i>.  <i>
9ce0: 2d 2d 20 6f 6e 65 20 6f 66 20 74 68 65 20 70 68  -- one of the ph
9cf0: 72 61 73 65 73 20 22 73 71 6c 69 74 65 20 64 61  rases "sqlite da
9d00: 74 61 62 61 73 65 22 20 61 6e 64 20 22 73 71 6c  tabase" and "sql
9d10: 69 74 65 20 6c 69 62 72 61 72 79 22 2e 3c 2f 69  ite library".</i
9d20: 3e 0a 20 20 53 45 4c 45 43 54 20 64 6f 63 69 64  >.  SELECT docid
9d30: 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45   FROM docs WHERE
9d40: 20 64 6f 63 73 20 4d 41 54 43 48 20 27 28 22 73   docs MATCH '("s
9d50: 71 6c 69 74 65 20 64 61 74 61 62 61 73 65 22 20  qlite database" 
9d60: 4f 52 20 22 73 71 6c 69 74 65 20 6c 69 62 72 61  OR "sqlite libra
9d70: 72 79 22 29 20 41 4e 44 20 6c 69 6e 75 78 27 3b  ry") AND linux';
9d80: 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68 69 73 20 71  ..  <i>-- This q
9d90: 75 65 72 79 20 69 73 20 65 71 75 69 76 61 6c 65  uery is equivale
9da0: 6e 74 20 74 6f 20 74 68 65 20 61 62 6f 76 65 2e  nt to the above.
9db0: 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 64 6f  </i>.  SELECT do
9dc0: 63 69 64 20 46 52 4f 4d 20 64 6f 63 73 20 57 48  cid FROM docs WH
9dd0: 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27  ERE docs MATCH '
9de0: 6c 69 6e 75 78 27 0a 20 20 20 20 49 4e 54 45 52  linux'.    INTER
9df0: 53 45 43 54 0a 20 20 53 45 4c 45 43 54 20 64 6f  SECT.  SELECT do
9e00: 63 69 64 20 46 52 4f 4d 20 28 0a 20 20 20 20 53  cid FROM (.    S
9e10: 45 4c 45 43 54 20 64 6f 63 69 64 20 46 52 4f 4d  ELECT docid FROM
9e20: 20 64 6f 63 73 20 57 48 45 52 45 20 64 6f 63 73   docs WHERE docs
9e30: 20 4d 41 54 43 48 20 27 22 73 71 6c 69 74 65 20   MATCH '"sqlite 
9e40: 6c 69 62 72 61 72 79 22 27 0a 20 20 20 20 20 20  library"'.      
9e50: 55 4e 49 4f 4e 0a 20 20 20 20 53 45 4c 45 43 54  UNION.    SELECT
9e60: 20 64 6f 63 69 64 20 46 52 4f 4d 20 64 6f 63 73   docid FROM docs
9e70: 20 57 48 45 52 45 20 64 6f 63 73 20 4d 41 54 43   WHERE docs MATC
9e80: 48 20 27 22 73 71 6c 69 74 65 20 64 61 74 61 62  H '"sqlite datab
9e90: 61 73 65 22 27 0a 20 20 29 3b 0a 3c 2f 63 6f 64  ase"'.  );.</cod
9ea0: 65 62 6c 6f 63 6b 3e 0a 0a 0a 3c 68 32 3e 53 65  eblock>...<h2>Se
9eb0: 74 20 4f 70 65 72 61 74 69 6f 6e 73 20 55 73 69  t Operations Usi
9ec0: 6e 67 20 54 68 65 20 53 74 61 6e 64 61 72 64 20  ng The Standard 
9ed0: 51 75 65 72 79 20 53 79 6e 74 61 78 3c 2f 68 32  Query Syntax</h2
9ee0: 3e 0a 0a 3c 70 3e 0a 20 20 46 54 53 20 71 75 65  >..<p>.  FTS que
9ef0: 72 79 20 73 65 74 20 6f 70 65 72 61 74 69 6f 6e  ry set operation
9f00: 73 20 75 73 69 6e 67 20 74 68 65 20 73 74 61 6e  s using the stan
9f10: 64 61 72 64 20 71 75 65 72 79 20 73 79 6e 74 61  dard query synta
9f20: 78 20 61 72 65 20 73 69 6d 69 6c 61 72 2c 20 62  x are similar, b
9f30: 75 74 0a 20 20 6e 6f 74 20 69 64 65 6e 74 69 63  ut.  not identic
9f40: 61 6c 2c 20 74 6f 20 73 65 74 20 6f 70 65 72 61  al, to set opera
9f50: 74 69 6f 6e 73 20 77 69 74 68 20 74 68 65 20 65  tions with the e
9f60: 6e 68 61 6e 63 65 64 20 71 75 65 72 79 20 73 79  nhanced query sy
9f70: 6e 74 61 78 2e 20 54 68 65 72 65 0a 20 20 61 72  ntax. There.  ar
9f80: 65 20 66 6f 75 72 20 64 69 66 66 65 72 65 6e 63  e four differenc
9f90: 65 73 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  es, as follows:.
9fa0: 0a 3c 6f 6c 3e 0a 20 20 3c 6c 69 20 76 61 6c 75  .<ol>.  <li valu
9fb0: 65 3d 31 3e 3c 70 3e 20 4f 6e 6c 79 20 74 68 65  e=1><p> Only the
9fc0: 20 69 6d 70 6c 69 63 69 74 20 76 65 72 73 69 6f   implicit versio
9fd0: 6e 20 6f 66 20 74 68 65 20 41 4e 44 20 6f 70 65  n of the AND ope
9fe0: 72 61 74 6f 72 20 69 73 20 73 75 70 70 6f 72 74  rator is support
9ff0: 65 64 2e 0a 20 20 20 20 53 70 65 63 69 66 79 69  ed..    Specifyi
a000: 6e 67 20 74 68 65 20 73 74 72 69 6e 67 20 22 41  ng the string "A
a010: 4e 44 22 20 61 73 20 70 61 72 74 20 6f 66 20 61  ND" as part of a
a020: 6e 20 73 74 61 6e 64 61 72 64 20 71 75 65 72 79  n standard query
a030: 20 73 79 6e 74 61 78 20 71 75 65 72 79 20 69 73   syntax query is
a040: 0a 20 20 20 20 69 6e 74 65 72 70 72 65 74 65 64  .    interpreted
a050: 20 61 73 20 61 20 74 65 72 6d 20 71 75 65 72 79   as a term query
a060: 20 66 6f 72 20 74 68 65 20 73 65 74 20 6f 66 20   for the set of 
a070: 64 6f 63 75 6d 65 6e 74 73 20 63 6f 6e 74 61 69  documents contai
a080: 6e 69 6e 67 20 74 68 65 20 74 65 72 6d 20 0a 20  ning the term . 
a090: 20 20 20 22 61 6e 64 22 2e 0a 3c 2f 6f 6c 3e 0a     "and"..</ol>.
a0a0: 0a 3c 6f 6c 3e 0a 20 20 3c 6c 69 20 76 61 6c 75  .<ol>.  <li valu
a0b0: 65 3d 32 3e 3c 70 3e 20 50 61 72 65 6e 74 68 65  e=2><p> Parenthe
a0c0: 73 69 73 20 61 72 65 20 6e 6f 74 20 73 75 70 70  sis are not supp
a0d0: 6f 72 74 65 64 2e 0a 3c 2f 6f 6c 3e 0a 0a 3c 6f  orted..</ol>..<o
a0e0: 6c 3e 0a 20 20 3c 6c 69 20 76 61 6c 75 65 3d 33  l>.  <li value=3
a0f0: 3e 3c 70 3e 20 54 68 65 20 4e 4f 54 20 6f 70 65  ><p> The NOT ope
a100: 72 61 74 6f 72 20 69 73 20 6e 6f 74 20 73 75 70  rator is not sup
a110: 70 6f 72 74 65 64 2e 20 49 6e 73 74 65 61 64 20  ported. Instead 
a120: 6f 66 20 74 68 65 20 4e 4f 54 20 0a 20 20 20 20  of the NOT .    
a130: 6f 70 65 72 61 74 6f 72 2c 20 74 68 65 20 73 74  operator, the st
a140: 61 6e 64 61 72 64 20 71 75 65 72 79 20 73 79 6e  andard query syn
a150: 74 61 78 20 73 75 70 70 6f 72 74 73 20 61 20 75  tax supports a u
a160: 6e 61 72 79 20 22 2d 22 20 6f 70 65 72 61 74 6f  nary "-" operato
a170: 72 20 74 68 61 74 0a 20 20 20 20 6d 61 79 20 62  r that.    may b
a180: 65 20 61 70 70 6c 69 65 64 20 74 6f 20 62 61 73  e applied to bas
a190: 69 63 20 74 65 72 6d 20 61 6e 64 20 74 65 72 6d  ic term and term
a1a0: 2d 70 72 65 66 69 78 20 71 75 65 72 69 65 73 20  -prefix queries 
a1b0: 28 62 75 74 20 6e 6f 74 20 74 6f 20 70 68 72 61  (but not to phra
a1c0: 73 65 0a 20 20 20 20 6f 72 20 4e 45 41 52 20 71  se.    or NEAR q
a1d0: 75 65 72 69 65 73 29 2e 20 41 20 74 65 72 6d 20  ueries). A term 
a1e0: 6f 72 20 74 65 72 6d 2d 70 72 65 66 69 78 20 74  or term-prefix t
a1f0: 68 61 74 20 68 61 73 20 61 20 75 6e 61 72 79 20  hat has a unary 
a200: 22 2d 22 20 6f 70 65 72 61 74 6f 72 0a 20 20 20  "-" operator.   
a210: 20 61 74 74 61 63 68 65 64 20 74 6f 20 69 74 20   attached to it 
a220: 6d 61 79 20 6e 6f 74 20 61 70 70 65 61 72 20 61  may not appear a
a230: 73 20 61 6e 20 6f 70 65 72 61 6e 64 20 74 6f 20  s an operand to 
a240: 61 6e 20 4f 52 20 6f 70 65 72 61 74 6f 72 2e 20  an OR operator. 
a250: 41 6e 20 46 54 53 0a 20 20 20 20 71 75 65 72 79  An FTS.    query
a260: 20 6d 61 79 20 6e 6f 74 20 63 6f 6e 73 69 73 74   may not consist
a270: 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 74 65 72   entirely of ter
a280: 6d 73 20 6f 72 20 74 65 72 6d 2d 70 72 65 66 69  ms or term-prefi
a290: 78 20 71 75 65 72 69 65 73 20 77 69 74 68 20 75  x queries with u
a2a0: 6e 61 72 79 0a 20 20 20 20 22 2d 22 20 6f 70 65  nary.    "-" ope
a2b0: 72 61 74 6f 72 73 20 61 74 74 61 63 68 65 64 20  rators attached 
a2c0: 74 6f 20 74 68 65 6d 2e 0a 3c 2f 6f 6c 3e 0a 0a  to them..</ol>..
a2d0: 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69  <codeblock>.  <i
a2e0: 3e 2d 2d 20 53 65 61 72 63 68 20 66 6f 72 20 74  >-- Search for t
a2f0: 68 65 20 73 65 74 20 6f 66 20 64 6f 63 75 6d 65  he set of docume
a300: 6e 74 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  nts that contain
a310: 20 74 68 65 20 74 65 72 6d 20 22 73 71 6c 69 74   the term "sqlit
a320: 65 22 20 62 75 74 20 64 6f 3c 2f 69 3e 0a 20 20  e" but do</i>.  
a330: 3c 69 3e 2d 2d 20 6e 6f 74 20 63 6f 6e 74 61 69  <i>-- not contai
a340: 6e 20 74 68 65 20 74 65 72 6d 20 22 64 61 74 61  n the term "data
a350: 62 61 73 65 22 2e 3c 2f 69 3e 0a 20 20 53 45 4c  base".</i>.  SEL
a360: 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20  ECT * FROM docs 
a370: 57 48 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48  WHERE docs MATCH
a380: 20 27 73 71 6c 69 74 65 20 2d 64 61 74 61 62 61   'sqlite -databa
a390: 73 65 27 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b  se';.</codeblock
a3a0: 3e 0a 0a 3c 6f 6c 3e 0a 20 20 3c 6c 69 20 76 61  >..<ol>.  <li va
a3b0: 6c 75 65 3d 34 3e 3c 70 3e 20 54 68 65 20 72 65  lue=4><p> The re
a3c0: 6c 61 74 69 76 65 20 70 72 65 63 65 64 65 6e 63  lative precedenc
a3d0: 65 20 6f 66 20 74 68 65 20 73 65 74 20 6f 70 65  e of the set ope
a3e0: 72 61 74 69 6f 6e 73 20 69 73 20 64 69 66 66 65  rations is diffe
a3f0: 72 65 6e 74 2e 20 0a 20 20 20 49 6e 20 70 61 72  rent. .   In par
a400: 74 69 63 75 6c 61 72 2c 20 75 73 69 6e 67 20 74  ticular, using t
a410: 68 65 20 73 74 61 6e 64 61 72 64 20 71 75 65 72  he standard quer
a420: 79 20 73 79 6e 74 61 78 20 74 68 65 20 22 4f 52  y syntax the "OR
a430: 22 20 6f 70 65 72 61 74 6f 72 20 68 61 73 20 61  " operator has a
a440: 0a 20 20 20 68 69 67 68 65 72 20 70 72 65 63 65  .   higher prece
a450: 64 65 6e 63 65 20 74 68 61 6e 20 22 41 4e 44 22  dence than "AND"
a460: 2e 20 54 68 65 20 70 72 65 63 65 64 65 6e 63 65  . The precedence
a470: 20 6f 66 20 6f 70 65 72 61 74 6f 72 73 20 77 68   of operators wh
a480: 65 6e 20 75 73 69 6e 67 20 74 68 65 0a 20 20 20  en using the.   
a490: 73 74 61 6e 64 61 72 64 20 71 75 65 72 79 20 73  standard query s
a4a0: 79 6e 74 61 78 20 69 73 3a 20 0a 3c 2f 6f 6c 3e  yntax is: .</ol>
a4b0: 0a 0a 3c 74 61 62 6c 65 20 73 74 72 69 70 65 64  ..<table striped
a4c0: 3d 31 3e 0a 20 20 3c 74 72 3e 3c 74 68 3e 4f 70  =1>.  <tr><th>Op
a4d0: 65 72 61 74 6f 72 3c 74 68 3e 53 74 61 6e 64 61  erator<th>Standa
a4e0: 72 64 20 51 75 65 72 79 20 53 79 6e 74 61 78 20  rd Query Syntax 
a4f0: 50 72 65 63 65 64 65 6e 63 65 0a 20 20 3c 74 72  Precedence.  <tr
a500: 3e 3c 74 64 3e 55 6e 61 72 79 20 22 2d 22 20 3c  ><td>Unary "-" <
a510: 74 64 3e 20 48 69 67 68 65 73 74 20 70 72 65 63  td> Highest prec
a520: 65 64 65 6e 63 65 20 28 74 69 67 68 74 65 73 74  edence (tightest
a530: 20 67 72 6f 75 70 69 6e 67 29 2e 0a 20 20 3c 74   grouping)..  <t
a540: 72 3e 3c 74 64 3e 4f 52 20 20 3c 74 64 3e 0a 20  r><td>OR  <td>. 
a550: 20 3c 74 72 3e 3c 74 64 3e 41 4e 44 20 3c 74 64   <tr><td>AND <td
a560: 3e 20 4c 6f 77 65 73 74 20 70 72 65 63 65 64 65  > Lowest precede
a570: 6e 63 65 20 28 6c 6f 6f 73 65 73 74 20 67 72 6f  nce (loosest gro
a580: 75 70 69 6e 67 29 2e 0a 3c 2f 74 61 62 6c 65 3e  uping)..</table>
a590: 0a 0a 3c 6f 6c 3e 3c 6c 69 20 73 74 79 6c 65 3d  ..<ol><li style=
a5a0: 22 6c 69 73 74 2d 73 74 79 6c 65 3a 6e 6f 6e 65  "list-style:none
a5b0: 22 3e 0a 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ">.  The followi
a5c0: 6e 67 20 65 78 61 6d 70 6c 65 20 69 6c 6c 75 73  ng example illus
a5d0: 74 72 61 74 65 73 20 70 72 65 63 65 64 65 6e 63  trates precedenc
a5e0: 65 20 6f 66 20 6f 70 65 72 61 74 6f 72 73 20 75  e of operators u
a5f0: 73 69 6e 67 20 74 68 65 20 73 74 61 6e 64 61 72  sing the standar
a600: 64 20 0a 20 20 71 75 65 72 79 20 73 79 6e 74 61  d .  query synta
a610: 78 3a 0a 3c 2f 6f 6c 3e 0a 0a 3c 63 6f 64 65 62  x:.</ol>..<codeb
a620: 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d 20 53 65  lock>.  <i>-- Se
a630: 61 72 63 68 20 66 6f 72 20 64 6f 63 75 6d 65 6e  arch for documen
a640: 74 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20  ts that contain 
a650: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20  at least one of 
a660: 74 68 65 20 74 65 72 6d 73 20 22 64 61 74 61 62  the terms "datab
a670: 61 73 65 22 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  ase"</i>.  <i>--
a680: 20 61 6e 64 20 22 73 71 6c 69 74 65 22 2c 20 61   and "sqlite", a
a690: 6e 64 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 20  nd also contain 
a6a0: 74 68 65 20 74 65 72 6d 20 22 6c 69 62 72 61 72  the term "librar
a6b0: 79 22 2e 20 42 65 63 61 75 73 65 20 6f 66 20 74  y". Because of t
a6c0: 68 65 20 64 69 66 66 65 72 65 6e 63 65 73 3c 2f  he differences</
a6d0: 69 3e 0a 20 20 3c 69 3e 2d 2d 20 69 6e 20 6f 70  i>.  <i>-- in op
a6e0: 65 72 61 74 6f 72 20 70 72 65 63 65 64 65 6e 63  erator precedenc
a6f0: 65 73 2c 20 74 68 69 73 20 71 75 65 72 79 20 77  es, this query w
a700: 6f 75 6c 64 20 68 61 76 65 20 61 20 64 69 66 66  ould have a diff
a710: 65 72 65 6e 74 20 69 6e 74 65 72 70 72 65 74 61  erent interpreta
a720: 74 69 6f 6e 20 75 73 69 6e 67 3c 2f 69 3e 0a 20  tion using</i>. 
a730: 20 3c 69 3e 2d 2d 20 74 68 65 20 65 6e 68 61 6e   <i>-- the enhan
a740: 63 65 64 20 71 75 65 72 79 20 73 79 6e 74 61 78  ced query syntax
a750: 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a  .</i>.  SELECT *
a760: 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45   FROM docs WHERE
a770: 20 64 6f 63 73 20 4d 41 54 43 48 20 27 73 71 6c   docs MATCH 'sql
a780: 69 74 65 20 4f 52 20 64 61 74 61 62 61 73 65 20  ite OR database 
a790: 6c 69 62 72 61 72 79 27 3b 0a 3c 2f 63 6f 64 65  library';.</code
a7a0: 62 6c 6f 63 6b 3e 0a 0a 3c 74 63 6c 3e 68 64 5f  block>..<tcl>hd_
a7b0: 66 72 61 67 6d 65 6e 74 20 73 6e 69 70 70 65 74  fragment snippet
a7c0: 20 7b 46 54 53 20 61 75 78 69 6c 69 61 72 79 20   {FTS auxiliary 
a7d0: 66 75 6e 63 74 69 6f 6e 73 7d 3c 2f 74 63 6c 3e  functions}</tcl>
a7e0: 0a 3c 68 31 3e 41 75 78 69 6c 69 61 72 79 20 46  .<h1>Auxiliary F
a7f0: 75 6e 63 74 69 6f 6e 73 20 2d 20 53 6e 69 70 70  unctions - Snipp
a800: 65 74 2c 20 4f 66 66 73 65 74 73 20 61 6e 64 20  et, Offsets and 
a810: 4d 61 74 63 68 69 6e 66 6f 3c 2f 68 31 3e 0a 0a  Matchinfo</h1>..
a820: 3c 70 3e 0a 20 20 54 68 65 20 46 54 53 33 20 61  <p>.  The FTS3 a
a830: 6e 64 20 46 54 53 34 20 6d 6f 64 75 6c 65 73 20  nd FTS4 modules 
a840: 70 72 6f 76 69 64 65 20 74 68 72 65 65 20 73 70  provide three sp
a850: 65 63 69 61 6c 20 53 51 4c 20 73 63 61 6c 61 72  ecial SQL scalar
a860: 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   functions that 
a870: 6d 61 79 20 62 65 20 75 73 65 66 75 6c 0a 20 20  may be useful.  
a880: 74 6f 20 74 68 65 20 64 65 76 65 6c 6f 70 65 72  to the developer
a890: 73 20 6f 66 20 66 75 6c 6c 2d 74 65 78 74 20 71  s of full-text q
a8a0: 75 65 72 79 20 73 79 73 74 65 6d 73 3a 20 22 73  uery systems: "s
a8b0: 6e 69 70 70 65 74 22 2c 20 22 6f 66 66 73 65 74  nippet", "offset
a8c0: 73 22 20 61 6e 64 0a 20 20 22 6d 61 74 63 68 69  s" and.  "matchi
a8d0: 6e 66 6f 22 2e 20 54 68 65 20 70 75 72 70 6f 73  nfo". The purpos
a8e0: 65 20 6f 66 20 74 68 65 20 22 73 6e 69 70 70 65  e of the "snippe
a8f0: 74 22 20 61 6e 64 20 22 6f 66 66 73 65 74 73 22  t" and "offsets"
a900: 20 66 75 6e 63 74 69 6f 6e 73 20 69 73 20 74 6f   functions is to
a910: 20 61 6c 6c 6f 77 0a 20 20 74 68 65 20 75 73 65   allow.  the use
a920: 72 20 74 6f 20 69 64 65 6e 74 69 66 79 20 74 68  r to identify th
a930: 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 71 75  e location of qu
a940: 65 72 69 65 64 20 74 65 72 6d 73 20 69 6e 20 74  eried terms in t
a950: 68 65 20 72 65 74 75 72 6e 65 64 20 64 6f 63 75  he returned docu
a960: 6d 65 6e 74 73 2e 0a 20 20 54 68 65 20 22 6d 61  ments..  The "ma
a970: 74 63 68 69 6e 66 6f 22 20 66 75 6e 63 74 69 6f  tchinfo" functio
a980: 6e 20 70 72 6f 76 69 64 65 73 20 74 68 65 20 75  n provides the u
a990: 73 65 72 20 77 69 74 68 20 6d 65 74 72 69 63 73  ser with metrics
a9a0: 20 74 68 61 74 20 6d 61 79 20 62 65 20 75 73 65   that may be use
a9b0: 66 75 6c 0a 20 20 66 6f 72 20 66 69 6c 74 65 72  ful.  for filter
a9c0: 69 6e 67 20 6f 72 20 73 6f 72 74 69 6e 67 20 71  ing or sorting q
a9d0: 75 65 72 79 20 72 65 73 75 6c 74 73 20 61 63 63  uery results acc
a9e0: 6f 72 64 69 6e 67 20 74 6f 20 72 65 6c 65 76 61  ording to releva
a9f0: 6e 63 65 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20  nce...<p>.  The 
aa00: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  first argument t
aa10: 6f 20 61 6c 6c 20 74 68 72 65 65 20 73 70 65 63  o all three spec
aa20: 69 61 6c 20 53 51 4c 20 73 63 61 6c 61 72 20 66  ial SQL scalar f
aa30: 75 6e 63 74 69 6f 6e 73 0a 20 20 6d 75 73 74 20  unctions.  must 
aa40: 62 65 20 74 68 65 20 5b 46 54 53 20 68 69 64 64  be the [FTS hidd
aa50: 65 6e 20 63 6f 6c 75 6d 6e 5d 20 6f 66 20 74 68  en column] of th
aa60: 65 20 46 54 53 20 74 61 62 6c 65 20 74 68 61 74  e FTS table that
aa70: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73   the function is
aa80: 0a 20 20 61 70 70 6c 69 65 64 20 74 6f 2e 20 20  .  applied to.  
aa90: 54 68 65 20 5b 46 54 53 20 68 69 64 64 65 6e 20  The [FTS hidden 
aaa0: 63 6f 6c 75 6d 6e 5d 20 69 73 20 61 6e 20 61 75  column] is an au
aab0: 74 6f 6d 61 74 69 63 61 6c 6c 79 2d 67 65 6e 65  tomatically-gene
aac0: 72 61 74 65 64 20 63 6f 6c 75 6d 6e 20 66 6f 75  rated column fou
aad0: 6e 64 20 6f 6e 0a 20 20 61 6c 6c 20 46 54 53 20  nd on.  all FTS 
aae0: 74 61 62 6c 65 73 20 74 68 61 74 20 68 61 73 20  tables that has 
aaf0: 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73  the same name as
ab00: 20 74 68 65 20 46 54 53 20 74 61 62 6c 65 20 69   the FTS table i
ab10: 74 73 65 6c 66 2e 0a 20 20 46 6f 72 20 65 78 61  tself..  For exa
ab20: 6d 70 6c 65 2c 20 67 69 76 65 6e 20 61 6e 20 46  mple, given an F
ab30: 54 53 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 22  TS table named "
ab40: 6d 61 69 6c 22 3a 0a 0a 3c 63 6f 64 65 62 6c 6f  mail":..<codeblo
ab50: 63 6b 3e 0a 20 20 53 45 4c 45 43 54 20 6f 66 66  ck>.  SELECT off
ab60: 73 65 74 73 28 6d 61 69 6c 29 20 46 52 4f 4d 20  sets(mail) FROM 
ab70: 6d 61 69 6c 20 57 48 45 52 45 20 6d 61 69 6c 20  mail WHERE mail 
ab80: 4d 41 54 43 48 20 26 6c 74 3b 66 75 6c 6c 2d 74  MATCH &lt;full-t
ab90: 65 78 74 20 71 75 65 72 79 20 65 78 70 72 65 73  ext query expres
aba0: 73 69 6f 6e 26 67 74 3b 3b 0a 20 20 53 45 4c 45  sion&gt;;.  SELE
abb0: 43 54 20 73 6e 69 70 70 65 74 28 6d 61 69 6c 29  CT snippet(mail)
abc0: 20 46 52 4f 4d 20 6d 61 69 6c 20 57 48 45 52 45   FROM mail WHERE
abd0: 20 6d 61 69 6c 20 4d 41 54 43 48 20 26 6c 74 3b   mail MATCH &lt;
abe0: 66 75 6c 6c 2d 74 65 78 74 20 71 75 65 72 79 20  full-text query 
abf0: 65 78 70 72 65 73 73 69 6f 6e 26 67 74 3b 3b 0a  expression&gt;;.
ac00: 20 20 53 45 4c 45 43 54 20 6d 61 74 63 68 69 6e    SELECT matchin
ac10: 66 6f 28 6d 61 69 6c 29 20 46 52 4f 4d 20 6d 61  fo(mail) FROM ma
ac20: 69 6c 20 57 48 45 52 45 20 6d 61 69 6c 20 4d 41  il WHERE mail MA
ac30: 54 43 48 20 26 6c 74 3b 66 75 6c 6c 2d 74 65 78  TCH &lt;full-tex
ac40: 74 20 71 75 65 72 79 20 65 78 70 72 65 73 73 69  t query expressi
ac50: 6f 6e 26 67 74 3b 3b 0a 3c 2f 63 6f 64 65 62 6c  on&gt;;.</codebl
ac60: 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20  ock>..<p>.  The 
ac70: 74 68 72 65 65 20 61 75 78 69 6c 69 61 72 79 20  three auxiliary 
ac80: 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 6f 6e  functions are on
ac90: 6c 79 20 75 73 65 66 75 6c 20 77 69 74 68 69 6e  ly useful within
aca0: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
acb0: 65 6e 74 20 74 68 61 74 0a 20 20 75 73 65 73 20  ent that.  uses 
acc0: 74 68 65 20 46 54 53 20 74 61 62 6c 65 27 73 20  the FTS table's 
acd0: 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 2e  full-text index.
ace0: 20 5e 49 66 20 75 73 65 64 20 77 69 74 68 69 6e   ^If used within
acf0: 20 61 20 53 45 4c 45 43 54 20 74 68 61 74 20 75   a SELECT that u
ad00: 73 65 73 0a 20 20 74 68 65 20 22 71 75 65 72 79  ses.  the "query
ad10: 20 62 79 20 72 6f 77 69 64 22 20 6f 72 20 22 6c   by rowid" or "l
ad20: 69 6e 65 61 72 20 73 63 61 6e 22 20 73 74 72 61  inear scan" stra
ad30: 74 65 67 69 65 73 2c 20 74 68 65 6e 20 74 68 65  tegies, then the
ad40: 20 73 6e 69 70 70 65 74 20 61 6e 64 0a 20 20 6f   snippet and.  o
ad50: 66 66 73 65 74 73 20 62 6f 74 68 20 72 65 74 75  ffsets both retu
ad60: 72 6e 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69  rn an empty stri
ad70: 6e 67 2c 20 61 6e 64 20 74 68 65 20 6d 61 74 63  ng, and the matc
ad80: 68 69 6e 66 6f 20 66 75 6e 63 74 69 6f 6e 20 72  hinfo function r
ad90: 65 74 75 72 6e 73 0a 20 20 61 20 62 6c 6f 62 20  eturns.  a blob 
ada0: 76 61 6c 75 65 20 7a 65 72 6f 20 62 79 74 65 73  value zero bytes
adb0: 20 69 6e 20 73 69 7a 65 2e 0a 0a 3c 70 20 69 64   in size...<p id
adc0: 3d 6d 61 74 63 68 61 62 6c 65 3e 0a 20 20 41 6c  =matchable>.  Al
add0: 6c 20 74 68 72 65 65 20 61 75 78 69 6c 69 61 72  l three auxiliar
ade0: 79 20 66 75 6e 63 74 69 6f 6e 73 20 65 78 74 72  y functions extr
adf0: 61 63 74 20 61 20 73 65 74 20 6f 66 20 22 6d 61  act a set of "ma
ae00: 74 63 68 61 62 6c 65 20 70 68 72 61 73 65 73 22  tchable phrases"
ae10: 20 66 72 6f 6d 0a 20 20 74 68 65 20 46 54 53 20   from.  the FTS 
ae20: 71 75 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e  query expression
ae30: 20 74 6f 20 77 6f 72 6b 20 77 69 74 68 2e 20 54   to work with. T
ae40: 68 65 20 73 65 74 20 6f 66 20 6d 61 74 63 68 61  he set of matcha
ae50: 62 6c 65 20 70 68 72 61 73 65 73 20 66 6f 72 0a  ble phrases for.
ae60: 20 20 61 20 67 69 76 65 6e 20 71 75 65 72 79 20    a given query 
ae70: 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 6c 6c 20  consists of all 
ae80: 70 68 72 61 73 65 73 20 28 69 6e 63 6c 75 64 69  phrases (includi
ae90: 6e 67 20 75 6e 71 75 6f 74 65 64 20 74 6f 6b 65  ng unquoted toke
aea0: 6e 73 20 61 6e 64 0a 20 20 74 6f 6b 65 6e 20 70  ns and.  token p
aeb0: 72 65 66 69 78 65 73 29 20 69 6e 20 74 68 65 20  refixes) in the 
aec0: 65 78 70 72 65 73 73 69 6f 6e 20 65 78 63 65 70  expression excep
aed0: 74 20 74 68 6f 73 65 20 74 68 61 74 20 61 72 65  t those that are
aee0: 20 70 72 65 66 69 78 65 64 20 77 69 74 68 0a 20   prefixed with. 
aef0: 20 61 20 75 6e 61 72 79 20 22 2d 22 20 6f 70 65   a unary "-" ope
af00: 72 61 74 6f 72 20 28 73 74 61 6e 64 61 72 64 20  rator (standard 
af10: 73 79 6e 74 61 78 29 20 6f 72 20 61 72 65 20 70  syntax) or are p
af20: 61 72 74 20 6f 66 20 61 20 73 75 62 2d 65 78 70  art of a sub-exp
af30: 72 65 73 73 69 6f 6e 20 0a 20 20 74 68 61 74 20  ression .  that 
af40: 69 73 20 75 73 65 64 20 61 73 20 74 68 65 20 72  is used as the r
af50: 69 67 68 74 2d 68 61 6e 64 20 6f 70 65 72 61 6e  ight-hand operan
af60: 64 20 6f 66 20 61 20 4e 4f 54 20 6f 70 65 72 61  d of a NOT opera
af70: 74 6f 72 2e 0a 0a 3c 70 3e 0a 20 20 57 69 74 68  tor...<p>.  With
af80: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70   the following p
af90: 72 6f 76 69 73 6f 73 2c 20 65 61 63 68 20 73 65  rovisos, each se
afa0: 72 69 65 73 20 6f 66 20 74 6f 6b 65 6e 73 20 69  ries of tokens i
afb0: 6e 20 74 68 65 20 46 54 53 20 74 61 62 6c 65 20  n the FTS table 
afc0: 74 68 61 74 0a 20 20 6d 61 74 63 68 65 73 20 6f  that.  matches o
afd0: 6e 65 20 6f 66 20 74 68 65 20 6d 61 74 63 68 61  ne of the matcha
afe0: 62 6c 65 20 70 68 72 61 73 65 73 20 69 6e 20 74  ble phrases in t
aff0: 68 65 20 71 75 65 72 79 20 65 78 70 72 65 73 73  he query express
b000: 69 6f 6e 20 69 73 20 6b 6e 6f 77 6e 20 61 73 20  ion is known as 
b010: 61 0a 20 20 22 70 68 72 61 73 65 20 6d 61 74 63  a.  "phrase matc
b020: 68 22 3a 0a 0a 3c 6f 6c 3e 0a 20 20 3c 6c 69 3e  h":..<ol>.  <li>
b030: 20 49 66 20 61 20 6d 61 74 63 68 61 62 6c 65 20   If a matchable 
b040: 70 68 72 61 73 65 20 69 73 20 70 61 72 74 20 6f  phrase is part o
b050: 66 20 61 20 73 65 72 69 65 73 20 6f 66 20 70 68  f a series of ph
b060: 72 61 73 65 73 20 63 6f 6e 6e 65 63 74 65 64 20  rases connected 
b070: 62 79 0a 20 20 20 20 20 20 20 4e 45 41 52 20 6f  by.       NEAR o
b080: 70 65 72 61 74 6f 72 73 20 69 6e 20 74 68 65 20  perators in the 
b090: 46 54 53 20 71 75 65 72 79 20 65 78 70 72 65 73  FTS query expres
b0a0: 73 69 6f 6e 2c 20 74 68 65 6e 20 65 61 63 68 20  sion, then each 
b0b0: 70 68 72 61 73 65 20 6d 61 74 63 68 0a 20 20 20  phrase match.   
b0c0: 20 20 20 20 6d 75 73 74 20 62 65 20 73 75 66 66      must be suff
b0d0: 69 63 69 65 6e 74 6c 79 20 63 6c 6f 73 65 20 74  iciently close t
b0e0: 6f 20 6f 74 68 65 72 20 70 68 72 61 73 65 20 6d  o other phrase m
b0f0: 61 74 63 68 65 73 20 6f 66 20 74 68 65 20 72 65  atches of the re
b100: 6c 65 76 61 6e 74 0a 20 20 20 20 20 20 20 74 79  levant.       ty
b110: 70 65 73 20 74 6f 20 73 61 74 69 73 66 79 20 74  pes to satisfy t
b120: 68 65 20 4e 45 41 52 20 63 6f 6e 64 69 74 69 6f  he NEAR conditio
b130: 6e 2e 0a 0a 20 20 3c 6c 69 3e 20 49 66 20 74 68  n...  <li> If th
b140: 65 20 6d 61 74 63 68 61 62 6c 65 20 70 68 72 61  e matchable phra
b150: 73 65 20 69 6e 20 74 68 65 20 46 54 53 20 71 75  se in the FTS qu
b160: 65 72 79 20 69 73 20 72 65 73 74 72 69 63 74 65  ery is restricte
b170: 64 20 74 6f 20 6d 61 74 63 68 69 6e 67 0a 20 20  d to matching.  
b180: 20 20 20 20 20 64 61 74 61 20 69 6e 20 61 20 73       data in a s
b190: 70 65 63 69 66 69 65 64 20 46 54 53 20 74 61 62  pecified FTS tab
b1a0: 6c 65 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20  le column, then 
b1b0: 6f 6e 6c 79 20 70 68 72 61 73 65 20 6d 61 74 63  only phrase matc
b1c0: 68 65 73 20 74 68 61 74 20 0a 20 20 20 20 20 20  hes that .      
b1d0: 20 6f 63 63 75 72 20 77 69 74 68 69 6e 20 74 68   occur within th
b1e0: 61 74 20 63 6f 6c 75 6d 6e 20 61 72 65 20 63 6f  at column are co
b1f0: 6e 73 69 64 65 72 65 64 2e 0a 3c 2f 6f 6c 3e 0a  nsidered..</ol>.
b200: 20 0a 3c 74 63 6c 3e 68 64 5f 66 72 61 67 6d 65   .<tcl>hd_fragme
b210: 6e 74 20 6f 66 66 73 65 74 73 20 6f 66 66 73 65  nt offsets offse
b220: 74 73 3c 2f 74 63 6c 3e 0a 3c 68 32 3e 54 68 65  ts</tcl>.<h2>The
b230: 20 4f 66 66 73 65 74 73 20 46 75 6e 63 74 69 6f   Offsets Functio
b240: 6e 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a 20 20 46 6f  n</h2>..<p>.  Fo
b250: 72 20 61 20 53 45 4c 45 43 54 20 71 75 65 72 79  r a SELECT query
b260: 20 74 68 61 74 20 75 73 65 73 20 74 68 65 20 66   that uses the f
b270: 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 2c 20  ull-text index, 
b280: 74 68 65 20 6f 66 66 73 65 74 73 28 29 20 66 75  the offsets() fu
b290: 6e 63 74 69 6f 6e 20 0a 20 20 72 65 74 75 72 6e  nction .  return
b2a0: 73 20 61 20 74 65 78 74 20 76 61 6c 75 65 20 63  s a text value c
b2b0: 6f 6e 74 61 69 6e 69 6e 67 20 61 20 73 65 72 69  ontaining a seri
b2c0: 65 73 20 6f 66 20 73 70 61 63 65 2d 73 65 70 61  es of space-sepa
b2d0: 72 61 74 65 64 20 69 6e 74 65 67 65 72 73 2e 20  rated integers. 
b2e0: 46 6f 72 0a 20 20 65 61 63 68 20 74 65 72 6d 20  For.  each term 
b2f0: 69 6e 20 65 61 63 68 20 3c 61 20 68 72 65 66 3d  in each <a href=
b300: 23 6d 61 74 63 68 61 62 6c 65 3e 70 68 72 61 73  #matchable>phras
b310: 65 20 6d 61 74 63 68 3c 2f 61 3e 20 6f 66 20 74  e match</a> of t
b320: 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 2c 20  he current row, 
b330: 0a 20 20 74 68 65 72 65 20 61 72 65 20 66 6f 75  .  there are fou
b340: 72 20 69 6e 74 65 67 65 72 73 20 69 6e 20 74 68  r integers in th
b350: 65 20 72 65 74 75 72 6e 65 64 20 6c 69 73 74 2e  e returned list.
b360: 20 45 61 63 68 20 73 65 74 20 6f 66 20 66 6f 75   Each set of fou
b370: 72 20 69 6e 74 65 67 65 72 73 20 69 73 20 0a 20  r integers is . 
b380: 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
b390: 66 6f 6c 6c 6f 77 73 3a 0a 0a 3c 74 61 62 6c 65  follows:..<table
b3a0: 20 73 74 72 69 70 65 64 3d 31 3e 0a 20 20 3c 74   striped=1>.  <t
b3b0: 72 3e 3c 74 68 3e 49 6e 74 65 67 65 72 20 3c 74  r><th>Integer <t
b3c0: 68 3e 49 6e 74 65 72 70 72 65 74 61 74 69 6f 6e  h>Interpretation
b3d0: 0a 20 20 3c 74 72 3e 3c 74 64 3e 30 20 0a 20 20  .  <tr><td>0 .  
b3e0: 20 20 20 20 3c 74 64 3e 54 68 65 20 63 6f 6c 75      <td>The colu
b3f0: 6d 6e 20 6e 75 6d 62 65 72 20 74 68 61 74 20 74  mn number that t
b400: 68 65 20 74 65 72 6d 20 69 6e 73 74 61 6e 63 65  he term instance
b410: 20 6f 63 63 75 72 73 20 69 6e 20 28 30 20 66 6f   occurs in (0 fo
b420: 72 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  r the.          
b430: 6c 65 66 74 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20  leftmost column 
b440: 6f 66 20 74 68 65 20 46 54 53 20 74 61 62 6c 65  of the FTS table
b450: 2c 20 31 20 66 6f 72 20 74 68 65 20 6e 65 78 74  , 1 for the next
b460: 20 6c 65 66 74 6d 6f 73 74 2c 20 65 74 63 2e 29   leftmost, etc.)
b470: 2e 0a 20 20 3c 74 72 3e 3c 74 64 3e 31 0a 20 20  ..  <tr><td>1.  
b480: 20 20 20 20 3c 74 64 3e 54 68 65 20 74 65 72 6d      <td>The term
b490: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6d   number of the m
b4a0: 61 74 63 68 69 6e 67 20 74 65 72 6d 20 77 69 74  atching term wit
b4b0: 68 69 6e 20 74 68 65 20 66 75 6c 6c 2d 74 65 78  hin the full-tex
b4c0: 74 20 71 75 65 72 79 0a 20 20 20 20 20 20 20 20  t query.        
b4d0: 20 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 54 65    expression. Te
b4e0: 72 6d 73 20 77 69 74 68 69 6e 20 61 20 71 75 65  rms within a que
b4f0: 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 61 72  ry expression ar
b500: 65 20 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74  e numbered start
b510: 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 66 72  ing.          fr
b520: 6f 6d 20 30 20 69 6e 20 74 68 65 20 6f 72 64 65  om 0 in the orde
b530: 72 20 74 68 61 74 20 74 68 65 79 20 6f 63 63 75  r that they occu
b540: 72 2e 0a 20 20 3c 74 72 3e 3c 74 64 3e 32 0a 20  r..  <tr><td>2. 
b550: 20 20 20 20 20 3c 74 64 3e 54 68 65 20 62 79 74       <td>The byt
b560: 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20  e offset of the 
b570: 6d 61 74 63 68 69 6e 67 20 74 65 72 6d 20 77 69  matching term wi
b580: 74 68 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 2e  thin the column.
b590: 0a 20 20 3c 74 72 3e 3c 74 64 3e 33 0a 20 20 20  .  <tr><td>3.   
b5a0: 20 20 20 3c 74 64 3e 54 68 65 20 73 69 7a 65 20     <td>The size 
b5b0: 6f 66 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20  of the matching 
b5c0: 74 65 72 6d 20 69 6e 20 62 79 74 65 73 2e 0a 3c  term in bytes..<
b5d0: 2f 74 61 62 6c 65 3e 0a 0a 3c 70 3e 0a 20 20 54  /table>..<p>.  T
b5e0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
b5f0: 63 6b 20 63 6f 6e 74 61 69 6e 73 20 65 78 61 6d  ck contains exam
b600: 70 6c 65 73 20 74 68 61 74 20 75 73 65 20 74 68  ples that use th
b610: 65 20 6f 66 66 73 65 74 73 20 66 75 6e 63 74 69  e offsets functi
b620: 6f 6e 2e 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e  on...<codeblock>
b630: 0a 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41  .  CREATE VIRTUA
b640: 4c 20 54 41 42 4c 45 20 6d 61 69 6c 20 55 53 49  L TABLE mail USI
b650: 4e 47 20 66 74 73 33 28 73 75 62 6a 65 63 74 2c  NG fts3(subject,
b660: 20 62 6f 64 79 29 3b 0a 20 20 49 4e 53 45 52 54   body);.  INSERT
b670: 20 49 4e 54 4f 20 6d 61 69 6c 20 56 41 4c 55 45   INTO mail VALUE
b680: 53 28 27 68 65 6c 6c 6f 20 77 6f 72 6c 64 27 2c  S('hello world',
b690: 20 27 54 68 69 73 20 6d 65 73 73 61 67 65 20 69   'This message i
b6a0: 73 20 61 20 68 65 6c 6c 6f 20 77 6f 72 6c 64 20  s a hello world 
b6b0: 6d 65 73 73 61 67 65 2e 27 29 3b 0a 20 20 49 4e  message.');.  IN
b6c0: 53 45 52 54 20 49 4e 54 4f 20 6d 61 69 6c 20 56  SERT INTO mail V
b6d0: 41 4c 55 45 53 28 27 75 72 67 65 6e 74 3a 20 73  ALUES('urgent: s
b6e0: 65 72 69 6f 75 73 27 2c 20 27 54 68 69 73 20 6d  erious', 'This m
b6f0: 61 69 6c 20 69 73 20 73 65 65 6e 20 61 73 20 61  ail is seen as a
b700: 20 6d 6f 72 65 20 73 65 72 69 6f 75 73 20 6d 61   more serious ma
b710: 69 6c 27 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 54  il');..  <i>-- T
b720: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65  he following que
b730: 72 79 20 72 65 74 75 72 6e 73 20 61 20 73 69 6e  ry returns a sin
b740: 67 6c 65 20 72 6f 77 20 28 61 73 20 69 74 20 6d  gle row (as it m
b750: 61 74 63 68 65 73 20 6f 6e 6c 79 20 74 68 65 20  atches only the 
b760: 66 69 72 73 74 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  first</i>.  <i>-
b770: 2d 20 65 6e 74 72 79 20 69 6e 20 74 61 62 6c 65  - entry in table
b780: 20 22 6d 61 69 6c 22 2e 20 54 68 65 20 74 65 78   "mail". The tex
b790: 74 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  t returned by th
b7a0: 65 20 6f 66 66 73 65 74 73 20 66 75 6e 63 74 69  e offsets functi
b7b0: 6f 6e 20 69 73 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  on is</i>.  <i>-
b7c0: 2d 20 22 30 20 30 20 36 20 35 20 31 20 30 20 32  - "0 0 6 5 1 0 2
b7d0: 34 20 35 22 2e 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  4 5".</i>.  <i>-
b7e0: 2d 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 54 68  -</i>.  <i>-- Th
b7f0: 65 20 66 69 72 73 74 20 73 65 74 20 6f 66 20 66  e first set of f
b800: 6f 75 72 20 69 6e 74 65 67 65 72 73 20 69 6e 20  our integers in 
b810: 74 68 65 20 72 65 73 75 6c 74 20 69 6e 64 69 63  the result indic
b820: 61 74 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20  ate that column 
b830: 30 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 63 6f  0</i>.  <i>-- co
b840: 6e 74 61 69 6e 73 20 61 6e 20 69 6e 73 74 61 6e  ntains an instan
b850: 63 65 20 6f 66 20 74 65 72 6d 20 30 20 28 22 77  ce of term 0 ("w
b860: 6f 72 6c 64 22 29 20 61 74 20 62 79 74 65 20 6f  orld") at byte o
b870: 66 66 73 65 74 20 36 2e 20 54 68 65 20 74 65 72  ffset 6. The ter
b880: 6d 20 69 6e 73 74 61 6e 63 65 3c 2f 69 3e 0a 20  m instance</i>. 
b890: 20 3c 69 3e 2d 2d 20 69 73 20 35 20 62 79 74 65   <i>-- is 5 byte
b8a0: 73 20 69 6e 20 73 69 7a 65 2e 20 54 68 65 20 73  s in size. The s
b8b0: 65 63 6f 6e 64 20 73 65 74 20 6f 66 20 66 6f 75  econd set of fou
b8c0: 72 20 69 6e 74 65 67 65 72 73 20 73 68 6f 77 73  r integers shows
b8d0: 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 31 3c 2f   that column 1</
b8e0: 69 3e 0a 20 20 3c 69 3e 2d 2d 20 6f 66 20 74 68  i>.  <i>-- of th
b8f0: 65 20 6d 61 74 63 68 65 64 20 72 6f 77 20 63 6f  e matched row co
b900: 6e 74 61 69 6e 73 20 61 6e 20 69 6e 73 74 61 6e  ntains an instan
b910: 63 65 20 6f 66 20 74 65 72 6d 20 30 20 28 22 77  ce of term 0 ("w
b920: 6f 72 6c 64 22 29 20 61 74 20 62 79 74 65 20 6f  orld") at byte o
b930: 66 66 73 65 74 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  ffset</i>.  <i>-
b940: 2d 20 32 34 2e 20 41 67 61 69 6e 2c 20 74 68 65  - 24. Again, the
b950: 20 74 65 72 6d 20 69 6e 73 74 61 6e 63 65 20 69   term instance i
b960: 73 20 35 20 62 79 74 65 73 20 69 6e 20 73 69 7a  s 5 bytes in siz
b970: 65 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20  e.</i>.  SELECT 
b980: 6f 66 66 73 65 74 73 28 6d 61 69 6c 29 20 46 52  offsets(mail) FR
b990: 4f 4d 20 6d 61 69 6c 20 57 48 45 52 45 20 6d 61  OM mail WHERE ma
b9a0: 69 6c 20 4d 41 54 43 48 20 27 77 6f 72 6c 64 27  il MATCH 'world'
b9b0: 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68 65 20 66  ;..  <i>-- The f
b9c0: 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72 79 20 72  ollowing query r
b9d0: 65 74 75 72 6e 73 20 61 6c 73 6f 20 6d 61 74 63  eturns also matc
b9e0: 68 65 73 20 6f 6e 6c 79 20 74 68 65 20 66 69 72  hes only the fir
b9f0: 73 74 20 72 6f 77 20 69 6e 20 74 61 62 6c 65 20  st row in table 
ba00: 22 6d 61 69 6c 22 2e 3c 2f 69 3e 0a 20 20 3c 69  "mail".</i>.  <i
ba10: 3e 2d 2d 20 49 6e 20 74 68 69 73 20 63 61 73 65  >-- In this case
ba20: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 74 65   the returned te
ba30: 78 74 20 69 73 20 22 31 20 30 20 35 20 37 20 31  xt is "1 0 5 7 1
ba40: 20 30 20 33 30 20 37 22 2e 3c 2f 69 3e 0a 20 20   0 30 7".</i>.  
ba50: 53 45 4c 45 43 54 20 6f 66 66 73 65 74 73 28 6d  SELECT offsets(m
ba60: 61 69 6c 29 20 46 52 4f 4d 20 6d 61 69 6c 20 57  ail) FROM mail W
ba70: 48 45 52 45 20 6d 61 69 6c 20 4d 41 54 43 48 20  HERE mail MATCH 
ba80: 27 6d 65 73 73 61 67 65 27 3b 0a 0a 20 20 3c 69  'message';..  <i
ba90: 3e 2d 2d 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  >-- The followin
baa0: 67 20 71 75 65 72 79 20 6d 61 74 63 68 65 73 20  g query matches 
bab0: 74 68 65 20 73 65 63 6f 6e 64 20 72 6f 77 20 69  the second row i
bac0: 6e 20 74 61 62 6c 65 20 22 6d 61 69 6c 22 2e 20  n table "mail". 
bad0: 49 74 20 72 65 74 75 72 6e 73 20 74 68 65 3c 2f  It returns the</
bae0: 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 65 78 74 20  i>.  <i>-- text 
baf0: 22 31 20 30 20 32 38 20 37 20 31 20 31 20 33 36  "1 0 28 7 1 1 36
bb00: 20 34 22 2e 20 4f 6e 6c 79 20 74 68 6f 73 65 20   4". Only those 
bb10: 6f 63 63 75 72 72 65 6e 63 65 73 20 6f 66 20 74  occurrences of t
bb20: 65 72 6d 73 20 22 73 65 72 69 6f 75 73 22 20 61  erms "serious" a
bb30: 6e 64 20 22 6d 61 69 6c 22 3c 2f 69 3e 0a 20 20  nd "mail"</i>.  
bb40: 3c 69 3e 2d 2d 20 74 68 61 74 20 61 72 65 20 70  <i>-- that are p
bb50: 61 72 74 20 6f 66 20 61 6e 20 69 6e 73 74 61 6e  art of an instan
bb60: 63 65 20 6f 66 20 74 68 65 20 70 68 72 61 73 65  ce of the phrase
bb70: 20 22 73 65 72 69 6f 75 73 20 6d 61 69 6c 22 20   "serious mail" 
bb80: 61 72 65 20 69 64 65 6e 74 69 66 69 65 64 3b 20  are identified; 
bb90: 74 68 65 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20  the</i>.  <i>-- 
bba0: 6f 74 68 65 72 20 6f 63 63 75 72 72 65 6e 63 65  other occurrence
bbb0: 73 20 6f 66 20 22 73 65 72 69 6f 75 73 22 20 61  s of "serious" a
bbc0: 6e 64 20 22 6d 61 69 6c 22 20 61 72 65 20 69 67  nd "mail" are ig
bbd0: 6e 6f 72 65 64 2e 3c 2f 69 3e 0a 20 20 53 45 4c  nored.</i>.  SEL
bbe0: 45 43 54 20 6f 66 66 73 65 74 73 28 6d 61 69 6c  ECT offsets(mail
bbf0: 29 20 46 52 4f 4d 20 6d 61 69 6c 20 57 48 45 52  ) FROM mail WHER
bc00: 45 20 6d 61 69 6c 20 4d 41 54 43 48 20 27 22 73  E mail MATCH '"s
bc10: 65 72 69 6f 75 73 20 6d 61 69 6c 22 27 3b 0a 3c  erious mail"';.<
bc20: 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 74 63  /codeblock>..<tc
bc30: 6c 3e 68 64 5f 66 72 61 67 6d 65 6e 74 20 73 6e  l>hd_fragment sn
bc40: 69 70 70 65 74 20 73 6e 69 70 70 65 74 3c 2f 74  ippet snippet</t
bc50: 63 6c 3e 0a 3c 68 32 3e 54 68 65 20 53 6e 69 70  cl>.<h2>The Snip
bc60: 70 65 74 20 46 75 6e 63 74 69 6f 6e 3c 2f 68 32  pet Function</h2
bc70: 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 73 6e 69  >..<p>.  The sni
bc80: 70 70 65 74 20 66 75 6e 63 74 69 6f 6e 20 69 73  ppet function is
bc90: 20 75 73 65 64 20 74 6f 20 63 72 65 61 74 65 20   used to create 
bca0: 66 6f 72 6d 61 74 74 65 64 20 66 72 61 67 6d 65  formatted fragme
bcb0: 6e 74 73 20 6f 66 20 64 6f 63 75 6d 65 6e 74 20  nts of document 
bcc0: 74 65 78 74 0a 20 20 66 6f 72 20 64 69 73 70 6c  text.  for displ
bcd0: 61 79 20 61 73 20 70 61 72 74 20 6f 66 20 61 20  ay as part of a 
bce0: 66 75 6c 6c 2d 74 65 78 74 20 71 75 65 72 79 20  full-text query 
bcf0: 72 65 73 75 6c 74 73 20 72 65 70 6f 72 74 2e 20  results report. 
bd00: 54 68 65 20 73 6e 69 70 70 65 74 20 66 75 6e 63  The snippet func
bd10: 74 69 6f 6e 20 0a 20 20 6d 61 79 20 62 65 20 70  tion .  may be p
bd20: 61 73 73 65 64 20 62 65 74 77 65 65 6e 20 6f 6e  assed between on
bd30: 65 20 61 6e 64 20 73 69 78 20 61 72 67 75 6d 65  e and six argume
bd40: 6e 74 73 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  nts, as follows:
bd50: 0a 0a 3c 74 61 62 6c 65 20 73 74 72 69 70 65 64  ..<table striped
bd60: 3d 31 3e 0a 20 20 3c 74 72 3e 3c 74 68 3e 41 72  =1>.  <tr><th>Ar
bd70: 67 75 6d 65 6e 74 20 3c 74 68 3e 44 65 66 61 75  gument <th>Defau
bd80: 6c 74 20 56 61 6c 75 65 20 3c 74 68 3e 44 65 73  lt Value <th>Des
bd90: 63 72 69 70 74 69 6f 6e 0a 20 20 3c 74 72 3e 3c  cription.  <tr><
bda0: 74 64 3e 30 20 3c 74 64 3e 4e 2f 41 0a 20 20 20  td>0 <td>N/A.   
bdb0: 20 20 20 3c 74 64 3e 20 54 68 65 20 66 69 72 73     <td> The firs
bdc0: 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  t argument to th
bdd0: 65 20 73 6e 69 70 70 65 74 20 66 75 6e 63 74 69  e snippet functi
bde0: 6f 6e 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62  on must always b
bdf0: 65 20 74 68 65 20 5b 46 54 53 20 68 69 64 64 65  e the [FTS hidde
be00: 6e 20 63 6f 6c 75 6d 6e 5d 0a 20 20 20 20 20 20  n column].      
be10: 20 20 20 20 20 6f 66 20 74 68 65 20 46 54 53 20       of the FTS 
be20: 74 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65 72  table being quer
be30: 69 65 64 20 61 6e 64 20 66 72 6f 6d 20 77 68 69  ied and from whi
be40: 63 68 20 74 68 65 20 73 6e 69 70 70 65 74 20 69  ch the snippet i
be50: 73 20 74 6f 20 62 65 20 74 61 6b 65 6e 2e 20 20  s to be taken.  
be60: 54 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 5b  The.           [
be70: 46 54 53 20 68 69 64 64 65 6e 20 63 6f 6c 75 6d  FTS hidden colum
be80: 6e 5d 20 69 73 20 61 6e 20 61 75 74 6f 6d 61 74  n] is an automat
be90: 69 63 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 64  ically generated
bea0: 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 74 68 65   column with the
beb0: 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68   same name as th
bec0: 65 0a 20 20 20 20 20 20 20 20 20 20 20 46 54 53  e.           FTS
bed0: 20 74 61 62 6c 65 20 69 74 73 65 6c 66 2e 0a 20   table itself.. 
bee0: 20 3c 74 72 3e 3c 74 64 3e 31 20 3c 74 64 3e 22   <tr><td>1 <td>"
bef0: 26 6c 74 3b 62 26 67 74 3b 22 0a 20 20 20 20 20  &lt;b&gt;".     
bf00: 20 3c 74 64 3e 20 54 68 65 20 22 73 74 61 72 74   <td> The "start
bf10: 20 6d 61 74 63 68 22 20 74 65 78 74 2e 0a 20 20   match" text..  
bf20: 3c 74 72 3e 3c 74 64 3e 32 20 3c 74 64 3e 22 26  <tr><td>2 <td>"&
bf30: 6c 74 3b 2f 62 26 67 74 3b 22 0a 20 20 20 20 20  lt;/b&gt;".     
bf40: 20 3c 74 64 3e 20 54 68 65 20 22 65 6e 64 20 6d   <td> The "end m
bf50: 61 74 63 68 22 20 74 65 78 74 2e 0a 20 20 3c 74  atch" text..  <t
bf60: 72 3e 3c 74 64 3e 33 20 3c 74 64 3e 22 26 6c 74  r><td>3 <td>"&lt
bf70: 3b 62 26 67 74 3b 2e 2e 2e 26 6c 74 3b 2f 62 26  ;b&gt;...&lt;/b&
bf80: 67 74 3b 22 0a 20 20 20 20 20 20 3c 74 64 3e 20  gt;".      <td> 
bf90: 54 68 65 20 22 65 6c 6c 69 70 73 65 73 22 20 74  The "ellipses" t
bfa0: 65 78 74 2e 0a 20 20 3c 74 72 3e 3c 74 64 3e 34  ext..  <tr><td>4
bfb0: 20 3c 74 64 3e 2d 31 0a 20 20 20 20 20 20 3c 74   <td>-1.      <t
bfc0: 64 3e 20 54 68 65 20 46 54 53 20 74 61 62 6c 65  d> The FTS table
bfd0: 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 74   column number t
bfe0: 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 72 65  o extract the re
bff0: 74 75 72 6e 65 64 20 66 72 61 67 6d 65 6e 74 73  turned fragments
c000: 20 6f 66 0a 20 20 20 20 20 20 20 20 20 20 20 74   of.           t
c010: 65 78 74 20 66 72 6f 6d 2e 20 43 6f 6c 75 6d 6e  ext from. Column
c020: 73 20 61 72 65 20 6e 75 6d 62 65 72 65 64 20 66  s are numbered f
c030: 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
c040: 74 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 0a  t starting with.
c050: 20 20 20 20 20 20 20 20 20 20 20 7a 65 72 6f 2e             zero.
c060: 20 41 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75   A negative valu
c070: 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  e indicates that
c080: 20 74 68 65 20 74 65 78 74 20 6d 61 79 20 62 65   the text may be
c090: 20 65 78 74 72 61 63 74 65 64 0a 20 20 20 20 20   extracted.     
c0a0: 20 20 20 20 20 20 66 72 6f 6d 20 61 6e 79 20 63        from any c
c0b0: 6f 6c 75 6d 6e 2e 0a 20 20 3c 74 72 3e 3c 74 64  olumn..  <tr><td
c0c0: 3e 35 20 3c 74 64 3e 2d 31 35 0a 20 20 20 20 20  >5 <td>-15.     
c0d0: 20 3c 74 64 3e 20 54 68 65 20 61 62 73 6f 6c 75   <td> The absolu
c0e0: 74 65 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  te value of this
c0f0: 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e   integer argumen
c100: 74 20 69 73 20 75 73 65 64 20 61 73 20 74 68 65  t is used as the
c110: 20 0a 20 20 20 20 20 20 20 20 20 20 20 28 61 70   .           (ap
c120: 70 72 6f 78 69 6d 61 74 65 29 20 6e 75 6d 62 65  proximate) numbe
c130: 72 20 6f 66 20 74 6f 6b 65 6e 73 20 74 6f 20 69  r of tokens to i
c140: 6e 63 6c 75 64 65 20 69 6e 20 74 68 65 20 72 65  nclude in the re
c150: 74 75 72 6e 65 64 20 74 65 78 74 20 0a 20 20 20  turned text .   
c160: 20 20 20 20 20 20 20 20 76 61 6c 75 65 2e 20 54          value. T
c170: 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77  he maximum allow
c180: 61 62 6c 65 20 61 62 73 6f 6c 75 74 65 20 76 61  able absolute va
c190: 6c 75 65 20 69 73 20 36 34 2e 20 54 68 65 20 76  lue is 64. The v
c1a0: 61 6c 75 65 20 6f 66 0a 20 20 20 20 20 20 20 20  alue of.        
c1b0: 20 20 20 74 68 69 73 20 61 72 67 75 6d 65 6e 74     this argument
c1c0: 20 69 73 20 72 65 66 65 72 72 65 64 20 74 6f 20   is referred to 
c1d0: 61 73 20 3c 69 3e 4e 3c 2f 69 3e 20 69 6e 20 74  as <i>N</i> in t
c1e0: 68 65 20 64 69 73 63 75 73 73 69 6f 6e 20 62 65  he discussion be
c1f0: 6c 6f 77 2e 0a 3c 2f 74 61 62 6c 65 3e 0a 0a 3c  low..</table>..<
c200: 70 3e 0a 20 20 54 68 65 20 73 6e 69 70 70 65 74  p>.  The snippet
c210: 20 66 75 6e 63 74 69 6f 6e 20 66 69 72 73 74 20   function first 
c220: 61 74 74 65 6d 70 74 73 20 74 6f 20 66 69 6e 64  attempts to find
c230: 20 61 20 66 72 61 67 6d 65 6e 74 20 6f 66 20 74   a fragment of t
c240: 65 78 74 20 63 6f 6e 73 69 73 74 69 6e 67 0a 20  ext consisting. 
c250: 20 6f 66 20 3c 69 3e 7c 4e 7c 3c 2f 69 3e 20 74   of <i>|N|</i> t
c260: 6f 6b 65 6e 73 20 77 69 74 68 69 6e 20 74 68 65  okens within the
c270: 20 63 75 72 72 65 6e 74 20 72 6f 77 20 74 68 61   current row tha
c280: 74 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65  t contains at le
c290: 61 73 74 20 6f 6e 65 20 70 68 72 61 73 65 20 0a  ast one phrase .
c2a0: 20 20 6d 61 74 63 68 20 66 6f 72 20 65 61 63 68    match for each
c2b0: 20 6d 61 74 63 68 61 62 6c 65 20 70 68 72 61 73   matchable phras
c2c0: 65 20 6d 61 74 63 68 65 64 20 73 6f 6d 65 77 68  e matched somewh
c2d0: 65 72 65 20 69 6e 20 74 68 65 20 63 75 72 72 65  ere in the curre
c2e0: 6e 74 20 72 6f 77 2c 20 0a 20 20 77 68 65 72 65  nt row, .  where
c2f0: 20 3c 69 3e 7c 4e 7c 3c 2f 69 3e 20 69 73 20 74   <i>|N|</i> is t
c300: 68 65 20 61 62 73 6f 6c 75 74 65 20 76 61 6c 75  he absolute valu
c310: 65 20 6f 66 20 74 68 65 20 73 69 78 74 68 20 61  e of the sixth a
c320: 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
c330: 6f 20 74 68 65 0a 20 20 73 6e 69 70 70 65 74 20  o the.  snippet 
c340: 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68 65  function. If the
c350: 20 74 65 78 74 20 73 74 6f 72 65 64 20 69 6e 20   text stored in 
c360: 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  a single column 
c370: 63 6f 6e 74 61 69 6e 73 20 6c 65 73 73 20 74 68  contains less th
c380: 61 6e 0a 20 20 3c 69 3e 7c 4e 7c 3c 2f 69 3e 20  an.  <i>|N|</i> 
c390: 74 6f 6b 65 6e 73 2c 20 74 68 65 6e 20 74 68 65  tokens, then the
c3a0: 20 65 6e 74 69 72 65 20 63 6f 6c 75 6d 6e 20 76   entire column v
c3b0: 61 6c 75 65 20 69 73 20 63 6f 6e 73 69 64 65 72  alue is consider
c3c0: 65 64 2e 20 54 65 78 74 20 66 72 61 67 6d 65 6e  ed. Text fragmen
c3d0: 74 73 20 0a 20 20 6d 61 79 20 6e 6f 74 20 73 70  ts .  may not sp
c3e0: 61 6e 20 6d 75 6c 74 69 70 6c 65 20 63 6f 6c 75  an multiple colu
c3f0: 6d 6e 73 2e 0a 0a 3c 70 3e 0a 20 20 49 66 20 73  mns...<p>.  If s
c400: 75 63 68 20 61 20 74 65 78 74 20 66 72 61 67 6d  uch a text fragm
c410: 65 6e 74 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  ent can be found
c420: 2c 20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64  , it is returned
c430: 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77   with the follow
c440: 69 6e 67 0a 20 20 6d 6f 64 69 66 69 63 61 74 69  ing.  modificati
c450: 6f 6e 73 3a 0a 0a 3c 75 6c 3e 0a 20 20 3c 6c 69  ons:..<ul>.  <li
c460: 3e 20 49 66 20 74 68 65 20 74 65 78 74 20 66 72  > If the text fr
c470: 61 67 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20  agment does not 
c480: 62 65 67 69 6e 20 61 74 20 74 68 65 20 73 74 61  begin at the sta
c490: 72 74 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 76  rt of a column v
c4a0: 61 6c 75 65 2c 0a 20 20 20 20 20 20 20 74 68 65  alue,.       the
c4b0: 20 22 65 6c 6c 69 70 73 65 73 22 20 74 65 78 74   "ellipses" text
c4c0: 20 69 73 20 70 72 65 70 65 6e 64 65 64 20 74 6f   is prepended to
c4d0: 20 69 74 2e 0a 20 20 3c 6c 69 3e 20 49 66 20 74   it..  <li> If t
c4e0: 68 65 20 74 65 78 74 20 66 72 61 67 6d 65 6e 74  he text fragment
c4f0: 20 64 6f 65 73 20 6e 6f 74 20 66 69 6e 69 73 68   does not finish
c500: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61   at the end of a
c510: 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 0a 20   column value,. 
c520: 20 20 20 20 20 20 74 68 65 20 22 65 6c 6c 69 70        the "ellip
c530: 73 65 73 22 20 74 65 78 74 20 69 73 20 61 70 70  ses" text is app
c540: 65 6e 64 65 64 20 74 6f 20 69 74 2e 0a 20 20 3c  ended to it..  <
c550: 6c 69 3e 20 46 6f 72 20 65 61 63 68 20 74 6f 6b  li> For each tok
c560: 65 6e 20 69 6e 20 74 68 65 20 74 65 78 74 20 66  en in the text f
c570: 72 61 67 6d 65 6e 74 20 74 68 61 74 20 69 73 20  ragment that is 
c580: 70 61 72 74 20 6f 66 20 61 20 70 68 72 61 73 65  part of a phrase
c590: 20 6d 61 74 63 68 2c 0a 20 20 20 20 20 20 20 74   match,.       t
c5a0: 68 65 20 22 73 74 61 72 74 20 6d 61 74 63 68 22  he "start match"
c5b0: 20 74 65 78 74 20 69 73 20 69 6e 73 65 72 74 65   text is inserte
c5c0: 64 20 69 6e 74 6f 20 74 68 65 20 66 72 61 67 6d  d into the fragm
c5d0: 65 6e 74 20 62 65 66 6f 72 65 20 74 68 65 20 74  ent before the t
c5e0: 6f 6b 65 6e 2c 0a 20 20 20 20 20 20 20 61 6e 64  oken,.       and
c5f0: 20 74 68 65 20 22 65 6e 64 20 6d 61 74 63 68 22   the "end match"
c600: 20 74 65 78 74 20 69 73 20 69 6e 73 65 72 74 65   text is inserte
c610: 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66  d immediately af
c620: 74 65 72 20 69 74 2e 0a 3c 2f 75 6c 3e 0a 0a 3c  ter it..</ul>..<
c630: 70 3e 0a 20 20 49 66 20 6d 6f 72 65 20 74 68 61  p>.  If more tha
c640: 6e 20 6f 6e 65 20 73 75 63 68 20 66 72 61 67 6d  n one such fragm
c650: 65 6e 74 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  ent can be found
c660: 2c 20 74 68 65 6e 20 66 72 61 67 6d 65 6e 74 73  , then fragments
c670: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 0a 20 20   that contain.  
c680: 61 20 6c 61 72 67 65 72 20 6e 75 6d 62 65 72 20  a larger number 
c690: 6f 66 20 22 65 78 74 72 61 22 20 70 68 72 61 73  of "extra" phras
c6a0: 65 20 6d 61 74 63 68 65 73 20 61 72 65 20 66 61  e matches are fa
c6b0: 76 6f 75 72 65 64 2e 20 54 68 65 20 73 74 61 72  voured. The star
c6c0: 74 20 6f 66 0a 20 20 74 68 65 20 73 65 6c 65 63  t of.  the selec
c6d0: 74 65 64 20 74 65 78 74 20 66 72 61 67 6d 65 6e  ted text fragmen
c6e0: 74 20 6d 61 79 20 62 65 20 6d 6f 76 65 64 20 61  t may be moved a
c6f0: 20 66 65 77 20 74 6f 6b 65 6e 73 20 66 6f 72 77   few tokens forw
c700: 61 72 64 20 6f 72 20 62 61 63 6b 77 61 72 64 0a  ard or backward.
c710: 20 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20    to attempt to 
c720: 63 6f 6e 63 65 6e 74 72 61 74 65 20 74 68 65 20  concentrate the 
c730: 70 68 72 61 73 65 20 6d 61 74 63 68 65 73 20 74  phrase matches t
c740: 6f 77 61 72 64 20 74 68 65 20 63 65 6e 74 65 72  oward the center
c750: 20 6f 66 20 74 68 65 0a 20 20 66 72 61 67 6d 65   of the.  fragme
c760: 6e 74 2e 0a 0a 3c 70 3e 0a 20 20 41 73 73 75 6d  nt...<p>.  Assum
c770: 69 6e 67 20 3c 69 3e 4e 3c 2f 69 3e 20 69 73 20  ing <i>N</i> is 
c780: 61 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65  a positive value
c790: 2c 20 69 66 20 6e 6f 20 66 72 61 67 6d 65 6e 74  , if no fragment
c7a0: 73 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 74  s can be found t
c7b0: 68 61 74 0a 20 20 63 6f 6e 74 61 69 6e 20 61 6e  hat.  contain an
c7c0: 20 70 68 72 61 73 65 20 6d 61 74 63 68 20 63 6f   phrase match co
c7d0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 65  rresponding to e
c7e0: 61 63 68 20 6d 61 74 63 68 61 62 6c 65 20 70 68  ach matchable ph
c7f0: 72 61 73 65 2c 20 74 68 65 20 73 6e 69 70 70 65  rase, the snippe
c800: 74 0a 20 20 66 75 6e 63 74 69 6f 6e 20 61 74 74  t.  function att
c810: 65 6d 70 74 73 20 74 6f 20 66 69 6e 64 20 74 77  empts to find tw
c820: 6f 20 66 72 61 67 6d 65 6e 74 73 20 6f 66 20 61  o fragments of a
c830: 70 70 72 6f 78 69 6d 61 74 65 6c 79 20 3c 69 3e  pproximately <i>
c840: 4e 3c 2f 69 3e 2f 32 20 74 6f 6b 65 6e 73 0a 20  N</i>/2 tokens. 
c850: 20 74 68 61 74 20 62 65 74 77 65 65 6e 20 74 68   that between th
c860: 65 6d 20 63 6f 6e 74 61 69 6e 20 61 74 20 6c 65  em contain at le
c870: 61 73 74 20 6f 6e 65 20 70 68 72 61 73 65 20 6d  ast one phrase m
c880: 61 74 63 68 20 66 6f 72 20 65 61 63 68 20 6d 61  atch for each ma
c890: 74 63 68 61 62 6c 65 20 70 68 72 61 73 65 0a 20  tchable phrase. 
c8a0: 20 6d 61 74 63 68 65 64 20 62 79 20 74 68 65 20   matched by the 
c8b0: 63 75 72 72 65 6e 74 20 72 6f 77 2e 20 49 66 20  current row. If 
c8c0: 74 68 69 73 20 66 61 69 6c 73 2c 20 61 74 74 65  this fails, atte
c8d0: 6d 70 74 73 20 61 72 65 20 6d 61 64 65 20 74 6f  mpts are made to
c8e0: 20 66 69 6e 64 20 74 68 72 65 65 0a 20 20 66 72   find three.  fr
c8f0: 61 67 6d 65 6e 74 73 20 6f 66 20 3c 69 3e 4e 3c  agments of <i>N<
c900: 2f 69 3e 2f 33 20 74 6f 6b 65 6e 73 20 65 61 63  /i>/3 tokens eac
c910: 68 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 66 6f  h and finally fo
c920: 75 72 20 3c 69 3e 4e 3c 2f 69 3e 2f 34 20 74 6f  ur <i>N</i>/4 to
c930: 6b 65 6e 0a 20 20 66 72 61 67 6d 65 6e 74 73 2e  ken.  fragments.
c940: 20 49 66 20 61 20 73 65 74 20 6f 66 20 66 6f 75   If a set of fou
c950: 72 20 66 72 61 67 6d 65 6e 74 73 20 63 61 6e 6e  r fragments cann
c960: 6f 74 20 62 65 20 66 6f 75 6e 64 20 74 68 61 74  ot be found that
c970: 20 65 6e 63 6f 6d 70 61 73 73 65 73 20 74 68 65   encompasses the
c980: 0a 20 20 72 65 71 75 69 72 65 64 20 70 68 72 61  .  required phra
c990: 73 65 20 6d 61 74 63 68 65 73 2c 20 74 68 65 20  se matches, the 
c9a0: 66 6f 75 72 20 66 72 61 67 6d 65 6e 74 73 20 6f  four fragments o
c9b0: 66 20 3c 69 3e 4e 3c 2f 69 3e 2f 34 20 74 6f 6b  f <i>N</i>/4 tok
c9c0: 65 6e 73 20 74 68 61 74 20 70 72 6f 76 69 64 65  ens that provide
c9d0: 0a 20 20 74 68 65 20 62 65 73 74 20 63 6f 76 65  .  the best cove
c9e0: 72 61 67 65 20 61 72 65 20 73 65 6c 65 63 74 65  rage are selecte
c9f0: 64 2e 0a 0a 3c 70 3e 0a 20 20 49 66 20 3c 69 3e  d...<p>.  If <i>
ca00: 4e 3c 2f 69 3e 20 69 73 20 61 20 6e 65 67 61 74  N</i> is a negat
ca10: 69 76 65 20 76 61 6c 75 65 2c 20 61 6e 64 20 6e  ive value, and n
ca20: 6f 20 73 69 6e 67 6c 65 20 66 72 61 67 6d 65 6e  o single fragmen
ca30: 74 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 0a  t can be found .
ca40: 20 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65    containing the
ca50: 20 72 65 71 75 69 72 65 64 20 70 68 72 61 73 65   required phrase
ca60: 20 6d 61 74 63 68 65 73 2c 20 74 68 65 20 73 6e   matches, the sn
ca70: 69 70 70 65 74 20 66 75 6e 63 74 69 6f 6e 20 73  ippet function s
ca80: 65 61 72 63 68 65 73 0a 20 20 66 6f 72 20 74 77  earches.  for tw
ca90: 6f 20 66 72 61 67 6d 65 6e 74 73 20 6f 66 20 3c  o fragments of <
caa0: 69 3e 7c 4e 7c 3c 2f 69 3e 20 74 6f 6b 65 6e 73  i>|N|</i> tokens
cab0: 20 65 61 63 68 2c 20 74 68 65 6e 20 74 68 72 65   each, then thre
cac0: 65 2c 20 74 68 65 6e 20 66 6f 75 72 2e 20 49 6e  e, then four. In
cad0: 0a 20 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  .  other words, 
cae0: 69 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64  if the specified
caf0: 20 76 61 6c 75 65 20 6f 66 20 3c 69 3e 4e 3c 2f   value of <i>N</
cb00: 69 3e 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20  i> is negative, 
cb10: 74 68 65 20 73 69 7a 65 73 0a 20 20 6f 66 20 74  the sizes.  of t
cb20: 68 65 20 66 72 61 67 6d 65 6e 74 73 20 69 73 20  he fragments is 
cb30: 6e 6f 74 20 64 65 63 72 65 61 73 65 64 20 69 66  not decreased if
cb40: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 66   more than one f
cb50: 72 61 67 6d 65 6e 74 20 69 73 20 72 65 71 75 69  ragment is requi
cb60: 72 65 64 0a 20 20 74 6f 20 70 72 6f 76 69 64 65  red.  to provide
cb70: 20 74 68 65 20 64 65 73 69 72 65 64 20 70 68 72   the desired phr
cb80: 61 73 65 20 6d 61 74 63 68 20 63 6f 76 65 72 61  ase match covera
cb90: 67 65 2e 0a 0a 3c 70 3e 0a 20 20 41 66 74 65 72  ge...<p>.  After
cba0: 20 74 68 65 20 3c 69 3e 4d 3c 2f 69 3e 20 66 72   the <i>M</i> fr
cbb0: 61 67 6d 65 6e 74 73 20 68 61 76 65 20 62 65 65  agments have bee
cbc0: 6e 20 6c 6f 63 61 74 65 64 2c 20 77 68 65 72 65  n located, where
cbd0: 20 3c 69 3e 4d 3c 2f 69 3e 20 69 73 20 62 65 74   <i>M</i> is bet
cbe0: 77 65 65 6e 0a 20 20 74 77 6f 20 61 6e 64 20 66  ween.  two and f
cbf0: 6f 75 72 20 61 73 20 64 65 73 63 72 69 62 65 64  our as described
cc00: 20 69 6e 20 74 68 65 20 70 61 72 61 67 72 61 70   in the paragrap
cc10: 68 73 20 61 62 6f 76 65 2c 20 74 68 65 79 20 61  hs above, they a
cc20: 72 65 20 6a 6f 69 6e 65 64 20 74 6f 67 65 74 68  re joined togeth
cc30: 65 72 0a 20 20 69 6e 20 73 6f 72 74 65 64 20 6f  er.  in sorted o
cc40: 72 64 65 72 20 77 69 74 68 20 74 68 65 20 22 65  rder with the "e
cc50: 6c 6c 69 70 73 65 73 22 20 74 65 78 74 20 73 65  llipses" text se
cc60: 70 61 72 61 74 69 6e 67 20 74 68 65 6d 2e 20 54  parating them. T
cc70: 68 65 20 74 68 72 65 65 20 0a 20 20 6d 6f 64 69  he three .  modi
cc80: 66 69 63 61 74 69 6f 6e 73 20 65 6e 75 6d 65 72  fications enumer
cc90: 61 74 65 64 20 65 61 72 6c 69 65 72 20 61 72 65  ated earlier are
cca0: 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68   performed on th
ccb0: 65 20 74 65 78 74 20 62 65 66 6f 72 65 20 69 74  e text before it
ccc0: 20 69 73 20 0a 20 20 72 65 74 75 72 6e 65 64 2e   is .  returned.
ccd0: 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20  ..<codeblock>.  
cce0: 3c 62 3e 4e 6f 74 65 3a 20 49 6e 20 74 68 69 73  <b>Note: In this
ccf0: 20 62 6c 6f 63 6b 20 6f 66 20 65 78 61 6d 70 6c   block of exampl
cd00: 65 73 2c 20 6e 65 77 6c 69 6e 65 73 20 61 6e 64  es, newlines and
cd10: 20 77 68 69 74 65 73 70 61 63 65 20 63 68 61 72   whitespace char
cd20: 61 63 74 65 72 73 20 68 61 76 65 0a 20 20 62 65  acters have.  be
cd30: 65 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  en inserted into
cd40: 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 69 6e   the document in
cd50: 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20  serted into the 
cd60: 46 54 53 20 74 61 62 6c 65 2c 20 61 6e 64 20 74  FTS table, and t
cd70: 68 65 20 65 78 70 65 63 74 65 64 0a 20 20 72 65  he expected.  re
cd80: 73 75 6c 74 73 20 64 65 73 63 72 69 62 65 64 20  sults described 
cd90: 69 6e 20 53 51 4c 20 63 6f 6d 6d 65 6e 74 73 2e  in SQL comments.
cda0: 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 74 6f   This is done to
cdb0: 20 65 6e 68 61 6e 63 65 20 72 65 61 64 61 62 69   enhance readabi
cdc0: 6c 69 74 79 20 6f 6e 6c 79 2c 0a 20 20 74 68 65  lity only,.  the
cdd0: 79 20 77 6f 75 6c 64 20 6e 6f 74 20 62 65 20 70  y would not be p
cde0: 72 65 73 65 6e 74 20 69 6e 20 61 63 74 75 61 6c  resent in actual
cdf0: 20 53 51 4c 69 74 65 20 63 6f 6d 6d 61 6e 64 73   SQLite commands
ce00: 20 6f 72 20 6f 75 74 70 75 74 2e 3c 2f 62 3e 0a   or output.</b>.
ce10: 0a 20 20 3c 69 3e 2d 2d 20 43 72 65 61 74 65 20  .  <i>-- Create 
ce20: 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6e 20  and populate an 
ce30: 46 54 53 20 74 61 62 6c 65 2e 3c 2f 69 3e 0a 20  FTS table.</i>. 
ce40: 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
ce50: 54 41 42 4c 45 20 74 65 78 74 20 55 53 49 4e 47  TABLE text USING
ce60: 20 66 74 73 34 28 29 3b 0a 20 20 49 4e 53 45 52   fts4();.  INSER
ce70: 54 20 49 4e 54 4f 20 74 65 78 74 20 56 41 4c 55  T INTO text VALU
ce80: 45 53 28 27 0a 20 20 20 20 44 75 72 69 6e 67 20  ES('.    During 
ce90: 33 30 20 4e 6f 76 2d 31 20 44 65 63 2c 20 32 2d  30 Nov-1 Dec, 2-
cea0: 33 6f 43 20 64 72 6f 70 73 2e 20 43 6f 6f 6c 20  3oC drops. Cool 
ceb0: 69 6e 20 74 68 65 20 75 70 70 65 72 20 70 6f 72  in the upper por
cec0: 74 69 6f 6e 2c 20 6d 69 6e 69 6d 75 6d 20 74 65  tion, minimum te
ced0: 6d 70 65 72 61 74 75 72 65 20 31 34 2d 31 36 6f  mperature 14-16o
cee0: 43 20 0a 20 20 20 20 61 6e 64 20 63 6f 6f 6c 20  C .    and cool 
cef0: 65 6c 73 65 77 68 65 72 65 2c 20 6d 69 6e 69 6d  elsewhere, minim
cf00: 75 6d 20 74 65 6d 70 65 72 61 74 75 72 65 20 31  um temperature 1
cf10: 37 2d 32 30 6f 43 2e 20 43 6f 6c 64 20 74 6f 20  7-20oC. Cold to 
cf20: 76 65 72 79 20 63 6f 6c 64 20 6f 6e 20 6d 6f 75  very cold on mou
cf30: 6e 74 61 69 6e 74 6f 70 73 2c 20 0a 20 20 20 20  ntaintops, .    
cf40: 6d 69 6e 69 6d 75 6d 20 74 65 6d 70 65 72 61 74  minimum temperat
cf50: 75 72 65 20 36 2d 31 32 6f 43 2e 20 4e 6f 72 74  ure 6-12oC. Nort
cf60: 68 65 61 73 74 65 72 6c 79 20 77 69 6e 64 73 20  heasterly winds 
cf70: 31 35 2d 33 30 20 6b 6d 2f 68 72 2e 20 41 66 74  15-30 km/hr. Aft
cf80: 65 72 20 74 68 61 74 2c 20 74 65 6d 70 65 72 61  er that, tempera
cf90: 74 75 72 65 20 0a 20 20 20 20 69 6e 63 72 65 61  ture .    increa
cfa0: 73 65 73 2e 20 4e 6f 72 74 68 65 61 73 74 65 72  ses. Northeaster
cfb0: 6c 79 20 77 69 6e 64 73 20 31 35 2d 33 30 20 6b  ly winds 15-30 k
cfc0: 6d 2f 68 72 2e 20 20 20 20 20 0a 20 20 27 29 3b  m/hr.     .  ');
cfd0: 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68 65 20 66 6f  ..  <i>-- The fo
cfe0: 6c 6c 6f 77 69 6e 67 20 71 75 65 72 79 20 72 65  llowing query re
cff0: 74 75 72 6e 73 20 74 68 65 20 74 65 78 74 20 76  turns the text v
d000: 61 6c 75 65 3a 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  alue:</i>.  <i>-
d010: 2d 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20  -</i>.  <i>--   
d020: 22 26 6c 74 3b 62 26 67 74 3b 2e 2e 2e 26 6c 74  "&lt;b&gt;...&lt
d030: 3b 2f 62 26 67 74 3b 63 6f 6f 6c 20 65 6c 73 65  ;/b&gt;cool else
d040: 77 68 65 72 65 2c 20 6d 69 6e 69 6d 75 6d 20 74  where, minimum t
d050: 65 6d 70 65 72 61 74 75 72 65 20 31 37 2d 32 30  emperature 17-20
d060: 6f 43 2e 20 26 6c 74 3b 62 26 67 74 3b 43 6f 6c  oC. &lt;b&gt;Col
d070: 64 26 6c 74 3b 2f 62 26 67 74 3b 20 74 6f 20 76  d&lt;/b&gt; to v
d080: 65 72 79 20 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  ery </i>.  <i>--
d090: 20 20 20 20 26 6c 74 3b 62 26 67 74 3b 63 6f 6c      &lt;b&gt;col
d0a0: 64 26 6c 74 3b 2f 62 26 67 74 3b 20 6f 6e 20 6d  d&lt;/b&gt; on m
d0b0: 6f 75 6e 74 61 69 6e 74 6f 70 73 2c 20 6d 69 6e  ountaintops, min
d0c0: 69 6d 75 6d 20 74 65 6d 70 65 72 61 74 75 72 65  imum temperature
d0d0: 20 36 26 6c 74 3b 62 26 67 74 3b 2e 2e 2e 26 6c   6&lt;b&gt;...&l
d0e0: 74 3b 2f 62 26 67 74 3b 22 2e 3c 2f 69 3e 0a 20  t;/b&gt;".</i>. 
d0f0: 20 3c 69 3e 2d 2d 3c 2f 69 3e 0a 20 20 53 45 4c   <i>--</i>.  SEL
d100: 45 43 54 20 73 6e 69 70 70 65 74 28 74 65 78 74  ECT snippet(text
d110: 29 20 46 52 4f 4d 20 74 65 78 74 20 57 48 45 52  ) FROM text WHER
d120: 45 20 74 65 78 74 20 4d 41 54 43 48 20 27 63 6f  E text MATCH 'co
d130: 6c 64 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68  ld';..  <i>-- Th
d140: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72  e following quer
d150: 79 20 72 65 74 75 72 6e 73 20 74 68 65 20 74 65  y returns the te
d160: 78 74 20 76 61 6c 75 65 3a 3c 2f 69 3e 0a 20 20  xt value:</i>.  
d170: 3c 69 3e 2d 2d 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  <i>--</i>.  <i>-
d180: 2d 20 20 20 22 2e 2e 2e 74 68 65 20 75 70 70 65  -   "...the uppe
d190: 72 20 70 6f 72 74 69 6f 6e 2c 20 26 23 39 31 3b  r portion, &#91;
d1a0: 6d 69 6e 69 6d 75 6d 26 23 39 33 3b 20 26 23 39  minimum&#93; &#9
d1b0: 31 3b 74 65 6d 70 65 72 61 74 75 72 65 26 23 39  1;temperature&#9
d1c0: 33 3b 20 31 34 2d 31 36 6f 43 20 61 6e 64 20 63  3; 14-16oC and c
d1d0: 6f 6f 6c 20 65 6c 73 65 77 68 65 72 65 2c 3c 2f  ool elsewhere,</
d1e0: 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20 20 26 23  i>.  <i>--    &#
d1f0: 39 31 3b 6d 69 6e 69 6d 75 6d 26 23 39 33 3b 20  91;minimum&#93; 
d200: 26 23 39 31 3b 74 65 6d 70 65 72 61 74 75 72 65  &#91;temperature
d210: 26 23 39 33 3b 20 31 37 2d 32 30 6f 43 2e 20 43  &#93; 17-20oC. C
d220: 6f 6c 64 2e 2e 2e 22 3c 2f 69 3e 0a 20 20 3c 69  old..."</i>.  <i
d230: 3e 2d 2d 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54  >--</i>.  SELECT
d240: 20 73 6e 69 70 70 65 74 28 74 65 78 74 2c 20 27   snippet(text, '
d250: 26 23 39 31 3b 20 27 26 23 39 33 3b 27 2c 20 27  &#91; '&#93;', '
d260: 2e 2e 2e 27 29 20 46 52 4f 4d 20 74 65 78 74 20  ...') FROM text 
d270: 57 48 45 52 45 20 74 65 78 74 20 4d 41 54 43 48  WHERE text MATCH
d280: 20 27 22 6d 69 6e 2a 20 74 65 6d 2a 22 27 0a 3c   '"min* tem*"'.<
d290: 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 68 32  /codeblock>..<h2
d2a0: 20 69 64 3d 6d 61 74 63 68 69 6e 66 6f 20 74 61   id=matchinfo ta
d2b0: 67 73 3d 6d 61 74 63 68 69 6e 66 6f 3e 54 68 65  gs=matchinfo>The
d2c0: 20 4d 61 74 63 68 69 6e 66 6f 20 46 75 6e 63 74   Matchinfo Funct
d2d0: 69 6f 6e 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a 20 20  ion</h2>..<p>.  
d2e0: 54 68 65 20 6d 61 74 63 68 69 6e 66 6f 20 66 75  The matchinfo fu
d2f0: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61  nction returns a
d300: 20 62 6c 6f 62 20 76 61 6c 75 65 2e 20 49 66 20   blob value. If 
d310: 69 74 20 69 73 20 75 73 65 64 20 77 69 74 68 69  it is used withi
d320: 6e 20 61 20 71 75 65 72 79 0a 20 20 74 68 61 74  n a query.  that
d330: 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 74 68   does not use th
d340: 65 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65  e full-text inde
d350: 78 20 28 61 20 22 71 75 65 72 79 20 62 79 20 72  x (a "query by r
d360: 6f 77 69 64 22 20 6f 72 20 22 6c 69 6e 65 61 72  owid" or "linear
d370: 20 73 63 61 6e 22 29 2c 0a 20 20 74 68 65 6e 20   scan"),.  then 
d380: 74 68 65 20 62 6c 6f 62 20 69 73 20 7a 65 72 6f  the blob is zero
d390: 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20   bytes in size. 
d3a0: 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 62  Otherwise, the b
d3b0: 6c 6f 62 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  lob consists of 
d3c0: 7a 65 72 6f 0a 20 20 6f 72 20 6d 6f 72 65 20 33  zero.  or more 3
d3d0: 32 2d 62 69 74 20 75 6e 73 69 67 6e 65 64 20 69  2-bit unsigned i
d3e0: 6e 74 65 67 65 72 73 20 69 6e 20 6d 61 63 68 69  ntegers in machi
d3f0: 6e 65 20 62 79 74 65 2d 6f 72 64 65 72 2e 20 54  ne byte-order. T
d400: 68 65 20 65 78 61 63 74 20 6e 75 6d 62 65 72 0a  he exact number.
d410: 20 20 6f 66 20 69 6e 74 65 67 65 72 73 20 69 6e    of integers in
d420: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 61 72   the returned ar
d430: 72 61 79 20 64 65 70 65 6e 64 73 20 6f 6e 20 62  ray depends on b
d440: 6f 74 68 20 74 68 65 20 71 75 65 72 79 20 61 6e  oth the query an
d450: 64 20 74 68 65 20 76 61 6c 75 65 0a 20 20 6f 66  d the value.  of
d460: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
d470: 6d 65 6e 74 20 28 69 66 20 61 6e 79 29 20 70 61  ment (if any) pa
d480: 73 73 65 64 20 74 6f 20 74 68 65 20 6d 61 74 63  ssed to the matc
d490: 68 69 6e 66 6f 20 66 75 6e 63 74 69 6f 6e 2e 0a  hinfo function..
d4a0: 0a 3c 70 3e 0a 20 20 54 68 65 20 6d 61 74 63 68  .<p>.  The match
d4b0: 69 6e 66 6f 20 66 75 6e 63 74 69 6f 6e 20 69 73  info function is
d4c0: 20 63 61 6c 6c 65 64 20 77 69 74 68 20 65 69 74   called with eit
d4d0: 68 65 72 20 6f 6e 65 20 6f 72 20 74 77 6f 20 61  her one or two a
d4e0: 72 67 75 6d 65 6e 74 73 2e 20 41 73 20 66 6f 72  rguments. As for
d4f0: 0a 20 20 61 6c 6c 20 61 75 78 69 6c 69 61 72 79  .  all auxiliary
d500: 20 66 75 6e 63 74 69 6f 6e 73 2c 20 74 68 65 20   functions, the 
d510: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 6d  first argument m
d520: 75 73 74 20 62 65 20 74 68 65 20 73 70 65 63 69  ust be the speci
d530: 61 6c 20 0a 20 20 5b 46 54 53 20 68 69 64 64 65  al .  [FTS hidde
d540: 6e 20 63 6f 6c 75 6d 6e 5d 2e 20 54 68 65 20 73  n column]. The s
d550: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20  econd argument, 
d560: 69 66 20 69 74 20 69 73 20 73 70 65 63 69 66 69  if it is specifi
d570: 65 64 2c 20 6d 75 73 74 20 62 65 20 61 20 74 65  ed, must be a te
d580: 78 74 20 76 61 6c 75 65 0a 20 20 63 6f 6d 70 72  xt value.  compr
d590: 69 73 65 64 20 6f 6e 6c 79 20 6f 66 20 74 68 65  ised only of the
d5a0: 20 63 68 61 72 61 63 74 65 72 73 20 27 70 27 2c   characters 'p',
d5b0: 20 27 63 27 2c 20 27 6e 27 2c 20 27 61 27 2c 20   'c', 'n', 'a', 
d5c0: 27 6c 27 2c 20 27 73 27 20 61 6e 64 20 27 78 27  'l', 's' and 'x'
d5d0: 2e 0a 20 20 49 66 20 6e 6f 20 73 65 63 6f 6e 64  ..  If no second
d5e0: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 65 78 70   argument is exp
d5f0: 6c 69 63 69 74 6c 79 20 73 75 70 70 6c 69 65 64  licitly supplied
d600: 2c 20 69 74 20 64 65 66 61 75 6c 74 73 20 74 6f  , it defaults to
d610: 20 22 70 63 78 22 2e 20 54 68 65 0a 20 20 73 65   "pcx". The.  se
d620: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
d630: 20 72 65 66 65 72 65 64 20 74 6f 20 61 73 20 74   refered to as t
d640: 68 65 20 22 66 6f 72 6d 61 74 20 73 74 72 69 6e  he "format strin
d650: 67 22 20 62 65 6c 6f 77 2e 0a 0a 3c 70 3e 0a 20  g" below...<p>. 
d660: 20 43 68 61 72 61 63 74 65 72 73 20 69 6e 20 74   Characters in t
d670: 68 65 20 6d 61 74 63 68 69 6e 66 6f 20 66 6f 72  he matchinfo for
d680: 6d 61 74 20 73 74 72 69 6e 67 20 61 72 65 20 70  mat string are p
d690: 72 6f 63 65 73 73 65 64 20 66 72 6f 6d 20 6c 65  rocessed from le
d6a0: 66 74 20 74 6f 20 72 69 67 68 74 2e 20 0a 20 20  ft to right. .  
d6b0: 45 61 63 68 20 63 68 61 72 61 63 74 65 72 20 69  Each character i
d6c0: 6e 20 74 68 65 20 66 6f 72 6d 61 74 20 73 74 72  n the format str
d6d0: 69 6e 67 20 63 61 75 73 65 73 20 6f 6e 65 20 6f  ing causes one o
d6e0: 72 20 6d 6f 72 65 20 33 32 2d 62 69 74 20 75 6e  r more 32-bit un
d6f0: 73 69 67 6e 65 64 0a 20 20 69 6e 74 65 67 65 72  signed.  integer
d700: 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 61 64   values to be ad
d710: 64 65 64 20 74 6f 20 74 68 65 20 72 65 74 75 72  ded to the retur
d720: 6e 65 64 20 61 72 72 61 79 2e 20 54 68 65 20 22  ned array. The "
d730: 76 61 6c 75 65 73 22 20 63 6f 6c 75 6d 6e 20 69  values" column i
d740: 6e 0a 20 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  n.  the followin
d750: 67 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73  g table contains
d760: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69   the number of i
d770: 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20 61 70  nteger values ap
d780: 70 65 6e 64 65 64 20 74 6f 20 74 68 65 0a 20 20  pended to the.  
d790: 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 66 6f  output buffer fo
d7a0: 72 20 65 61 63 68 20 73 75 70 70 6f 72 74 65 64  r each supported
d7b0: 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 63   format string c
d7c0: 68 61 72 61 63 74 65 72 2e 20 49 6e 20 74 68 65  haracter. In the
d7d0: 20 66 6f 72 6d 75 6c 61 0a 20 20 67 69 76 65 6e   formula.  given
d7e0: 2c 20 3c 69 3e 63 6f 6c 73 3c 2f 69 3e 20 69 73  , <i>cols</i> is
d7f0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
d800: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 46 54  olumns in the FT
d810: 53 20 74 61 62 6c 65 2c 20 61 6e 64 20 0a 20 20  S table, and .  
d820: 3c 69 3e 70 68 72 61 73 65 73 3c 2f 69 3e 20 69  <i>phrases</i> i
d830: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
d840: 3c 61 20 68 72 65 66 3d 23 6d 61 74 63 68 61 62  <a href=#matchab
d850: 6c 65 3e 6d 61 74 63 68 61 62 6c 65 20 70 68 72  le>matchable phr
d860: 61 73 65 73 3c 2f 61 3e 20 69 6e 20 0a 20 20 74  ases</a> in .  t
d870: 68 65 20 71 75 65 72 79 2e 20 0a 0a 3c 74 61 62  he query. ..<tab
d880: 6c 65 20 73 74 72 69 70 65 64 3d 31 3e 0a 20 20  le striped=1>.  
d890: 3c 74 72 3e 3c 74 68 3e 43 68 61 72 61 63 74 65  <tr><th>Characte
d8a0: 72 3c 74 68 3e 56 61 6c 75 65 73 3c 74 68 3e 44  r<th>Values<th>D
d8b0: 65 73 63 72 69 70 74 69 6f 6e 0a 20 20 3c 74 72  escription.  <tr
d8c0: 3e 3c 74 64 3e 70 20 3c 74 64 3e 31 20 3c 74 64  ><td>p <td>1 <td
d8d0: 3e 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d  >The number of m
d8e0: 61 74 63 68 61 62 6c 65 20 70 68 72 61 73 65 73  atchable phrases
d8f0: 20 69 6e 20 74 68 65 20 71 75 65 72 79 2e 0a 20   in the query.. 
d900: 20 3c 74 72 3e 3c 74 64 3e 63 20 3c 74 64 3e 31   <tr><td>c <td>1
d910: 20 3c 74 64 3e 54 68 65 20 6e 75 6d 62 65 72 20   <td>The number 
d920: 6f 66 20 75 73 65 72 20 64 65 66 69 6e 65 64 20  of user defined 
d930: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 46  columns in the F
d940: 54 53 0a 20 20 20 20 74 61 62 6c 65 20 28 69 2e  TS.    table (i.
d950: 65 2e 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67  e. not including
d960: 20 74 68 65 20 64 6f 63 69 64 20 6f 72 20 74 68   the docid or th
d970: 65 20 5b 46 54 53 20 68 69 64 64 65 6e 20 63 6f  e [FTS hidden co
d980: 6c 75 6d 6e 5d 29 2e 0a 20 20 3c 74 72 3e 3c 74  lumn])..  <tr><t
d990: 64 3e 78 20 3c 74 64 20 73 74 79 6c 65 3d 22 77  d>x <td style="w
d9a0: 68 69 74 65 2d 73 70 61 63 65 3a 6e 6f 77 72 61  hite-space:nowra
d9b0: 70 22 3e 33 20 2a 20 3c 69 3e 63 6f 6c 73 3c 2f  p">3 * <i>cols</
d9c0: 69 3e 20 2a 20 3c 69 3e 70 68 72 61 73 65 73 3c  i> * <i>phrases<
d9d0: 2f 69 3e 20 0a 20 20 20 20 3c 74 64 3e 0a 20 20  /i> .    <td>.  
d9e0: 20 20 20 20 46 6f 72 20 65 61 63 68 20 64 69 73      For each dis
d9f0: 74 69 6e 63 74 20 63 6f 6d 62 69 6e 61 74 69 6f  tinct combinatio
da00: 6e 20 6f 66 20 61 20 70 68 72 61 73 65 20 61 6e  n of a phrase an
da10: 64 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c 20  d table column, 
da20: 74 68 65 0a 20 20 20 20 20 20 66 6f 6c 6c 6f 77  the.      follow
da30: 69 6e 67 20 74 68 72 65 65 20 76 61 6c 75 65 73  ing three values
da40: 3a 0a 20 20 20 20 20 20 3c 75 6c 3e 0a 20 20 20  :.      <ul>.   
da50: 20 20 20 20 20 3c 6c 69 3e 20 49 6e 20 74 68 65       <li> In the
da60: 20 63 75 72 72 65 6e 74 20 72 6f 77 2c 20 74 68   current row, th
da70: 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65  e number of time
da80: 73 20 74 68 65 20 70 68 72 61 73 65 20 61 70 70  s the phrase app
da90: 65 61 72 73 20 69 6e 20 0a 20 20 20 20 20 20 20  ears in .       
daa0: 20 20 20 20 20 20 74 68 65 20 63 6f 6c 75 6d 6e        the column
dab0: 2e 0a 20 20 20 20 20 20 20 20 3c 6c 69 3e 20 54  ..        <li> T
dac0: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
dad0: 6f 66 20 74 69 6d 65 73 20 74 68 65 20 70 68 72  of times the phr
dae0: 61 73 65 20 61 70 70 65 61 72 73 20 69 6e 20 74  ase appears in t
daf0: 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 0a 20 20 20  he column in.   
db00: 20 20 20 20 20 20 20 20 20 20 61 6c 6c 20 72 6f            all ro
db10: 77 73 20 69 6e 20 74 68 65 20 46 54 53 20 74 61  ws in the FTS ta
db20: 62 6c 65 2e 0a 20 20 20 20 20 20 20 20 3c 6c 69  ble..        <li
db30: 3e 20 54 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  > The total numb
db40: 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
db50: 65 20 46 54 53 20 74 61 62 6c 65 20 66 6f 72 20  e FTS table for 
db60: 77 68 69 63 68 20 74 68 65 20 0a 20 20 20 20 20  which the .     
db70: 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 63          column c
db80: 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65 61 73 74  ontains at least
db90: 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66   one instance of
dba0: 20 74 68 65 20 70 68 72 61 73 65 2e 0a 20 20 20   the phrase..   
dbb0: 20 20 20 3c 2f 75 6c 3e 0a 20 20 20 20 20 20 54     </ul>.      T
dbc0: 68 65 20 66 69 72 73 74 20 73 65 74 20 6f 66 20  he first set of 
dbd0: 74 68 72 65 65 20 76 61 6c 75 65 73 20 63 6f 72  three values cor
dbe0: 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20  responds to the 
dbf0: 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  left-most column
dc00: 0a 20 20 20 20 20 20 6f 66 20 74 68 65 20 74 61  .      of the ta
dc10: 62 6c 65 20 28 63 6f 6c 75 6d 6e 20 30 29 20 61  ble (column 0) a
dc20: 6e 64 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  nd the left-most
dc30: 20 6d 61 74 63 68 61 62 6c 65 20 70 68 72 61 73   matchable phras
dc40: 65 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 71  e in the.      q
dc50: 75 65 72 79 20 28 70 68 72 61 73 65 20 30 29 2e  uery (phrase 0).
dc60: 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 68 61   If the table ha
dc70: 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
dc80: 63 6f 6c 75 6d 6e 2c 20 74 68 65 20 73 65 63 6f  column, the seco
dc90: 6e 64 0a 20 20 20 20 20 20 73 65 74 20 6f 66 20  nd.      set of 
dca0: 74 68 72 65 65 20 76 61 6c 75 65 73 20 69 6e 20  three values in 
dcb0: 74 68 65 20 6f 75 74 70 75 74 20 61 72 72 61 79  the output array
dcc0: 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 70   correspond to p
dcd0: 68 72 61 73 65 20 30 20 61 6e 64 0a 20 20 20 20  hrase 0 and.    
dce0: 20 20 63 6f 6c 75 6d 6e 20 31 2e 20 46 6f 6c 6c    column 1. Foll
dcf0: 6f 77 65 64 20 62 79 20 70 68 72 61 73 65 20 30  owed by phrase 0
dd00: 2c 20 63 6f 6c 75 6d 6e 20 32 20 61 6e 64 20 73  , column 2 and s
dd10: 6f 20 6f 6e 20 66 6f 72 20 61 6c 6c 20 63 6f 6c  o on for all col
dd20: 75 6d 6e 73 20 6f 66 0a 20 20 20 20 20 20 74 68  umns of.      th
dd30: 65 20 74 61 62 6c 65 2e 20 41 6e 64 20 73 6f 20  e table. And so 
dd40: 6f 6e 20 66 6f 72 20 70 68 72 61 73 65 20 31 2c  on for phrase 1,
dd50: 20 63 6f 6c 75 6d 6e 20 30 2c 20 74 68 65 6e 20   column 0, then 
dd60: 70 68 72 61 73 65 20 31 2c 20 63 6f 6c 75 6d 6e  phrase 1, column
dd70: 20 31 0a 20 20 20 20 20 20 65 74 63 2e 20 49 6e   1.      etc. In
dd80: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68   other words, th
dd90: 65 20 64 61 74 61 20 66 6f 72 20 6f 63 63 75 72  e data for occur
dda0: 65 6e 63 65 73 20 6f 66 20 70 68 72 61 73 65 20  ences of phrase 
ddb0: 3c 69 3e 70 3c 2f 69 3e 20 69 6e 0a 20 20 20 20  <i>p</i> in.    
ddc0: 20 20 63 6f 6c 75 6d 6e 20 3c 69 3e 63 3c 2f 69    column <i>c</i
ddd0: 3e 20 6d 61 79 20 62 65 20 66 6f 75 6e 64 20 75  > may be found u
dde0: 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69  sing the followi
ddf0: 6e 67 20 66 6f 72 6d 75 6c 61 3a 0a 3c 70 72 65  ng formula:.<pre
de00: 3e 0a 20 20 20 20 20 20 20 20 20 20 68 69 74 73  >.          hits
de10: 5f 74 68 69 73 5f 72 6f 77 20 20 3d 20 61 72 72  _this_row  = arr
de20: 61 79 26 23 39 31 3b 33 20 2a 20 28 63 20 2b 20  ay&#91;3 * (c + 
de30: 70 2a 63 6f 6c 73 29 20 2b 20 30 26 23 39 33 3b  p*cols) + 0&#93;
de40: 0a 20 20 20 20 20 20 20 20 20 20 68 69 74 73 5f  .          hits_
de50: 61 6c 6c 5f 72 6f 77 73 20 20 3d 20 61 72 72 61  all_rows  = arra
de60: 79 26 23 39 31 3b 33 20 2a 20 28 63 20 2b 20 70  y&#91;3 * (c + p
de70: 2a 63 6f 6c 73 29 20 2b 20 31 26 23 39 33 3b 0a  *cols) + 1&#93;.
de80: 20 20 20 20 20 20 20 20 20 20 64 6f 63 73 5f 77            docs_w
de90: 69 74 68 5f 68 69 74 73 20 3d 20 61 72 72 61 79  ith_hits = array
dea0: 26 23 39 31 3b 33 20 2a 20 28 63 20 2b 20 70 2a  &#91;3 * (c + p*
deb0: 63 6f 6c 73 29 20 2b 20 32 26 23 39 33 3b 0a 3c  cols) + 2&#93;.<
dec0: 2f 70 72 65 3e 0a 0a 20 20 3c 74 72 3e 3c 74 64  /pre>..  <tr><td
ded0: 3e 6e 20 3c 74 64 3e 31 20 3c 74 64 3e 54 68 65  >n <td>1 <td>The
dee0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
def0: 69 6e 20 74 68 65 20 46 54 53 34 20 74 61 62 6c  in the FTS4 tabl
df00: 65 2e 20 54 68 69 73 20 76 61 6c 75 65 20 69 73  e. This value is
df10: 0a 20 20 20 20 6f 6e 6c 79 20 61 76 61 69 6c 61  .    only availa
df20: 62 6c 65 20 77 68 65 6e 20 71 75 65 72 79 69 6e  ble when queryin
df30: 67 20 46 54 53 34 20 74 61 62 6c 65 73 2c 20 6e  g FTS4 tables, n
df40: 6f 74 20 46 54 53 33 2e 0a 20 20 3c 74 72 3e 3c  ot FTS3..  <tr><
df50: 74 64 3e 61 20 3c 74 64 3e 3c 69 3e 63 6f 6c 73  td>a <td><i>cols
df60: 3c 2f 69 3e 20 3c 74 64 3e 46 6f 72 20 65 61 63  </i> <td>For eac
df70: 68 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20 61 76  h column, the av
df80: 65 72 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 0a  erage number of.
df90: 20 20 20 20 74 6f 6b 65 6e 73 20 69 6e 20 74 68      tokens in th
dfa0: 65 20 74 65 78 74 20 76 61 6c 75 65 73 20 73 74  e text values st
dfb0: 6f 72 65 64 20 69 6e 20 74 68 65 20 63 6f 6c 75  ored in the colu
dfc0: 6d 6e 20 28 63 6f 6e 73 69 64 65 72 69 6e 67 20  mn (considering 
dfd0: 61 6c 6c 20 72 6f 77 73 20 69 6e 0a 20 20 20 20  all rows in.    
dfe0: 74 68 65 20 46 54 53 34 20 74 61 62 6c 65 29 2e  the FTS4 table).
dff0: 20 54 68 69 73 20 76 61 6c 75 65 20 69 73 20 6f   This value is o
e000: 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 77 68  nly available wh
e010: 65 6e 20 71 75 65 72 79 69 6e 67 20 46 54 53 34  en querying FTS4
e020: 20 74 61 62 6c 65 73 2c 0a 20 20 20 20 6e 6f 74   tables,.    not
e030: 20 46 54 53 33 2e 20 20 0a 20 20 3c 74 72 3e 3c   FTS3.  .  <tr><
e040: 74 64 3e 6c 20 3c 74 64 3e 3c 69 3e 63 6f 6c 73  td>l <td><i>cols
e050: 3c 2f 69 3e 20 3c 74 64 3e 0a 20 20 20 20 46 6f  </i> <td>.    Fo
e060: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2c 20 74  r each column, t
e070: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65  he length of the
e080: 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
e090: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
e0a0: 20 6f 66 20 74 68 65 0a 20 20 20 20 46 54 53 34   of the.    FTS4
e0b0: 20 74 61 62 6c 65 2c 20 69 6e 20 74 6f 6b 65 6e   table, in token
e0c0: 73 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 69  s.  This value i
e0d0: 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  s only available
e0e0: 20 77 68 65 6e 20 71 75 65 72 79 69 6e 67 0a 20   when querying. 
e0f0: 20 20 20 46 54 53 34 20 74 61 62 6c 65 73 2c 20     FTS4 tables, 
e100: 6e 6f 74 20 46 54 53 33 2e 20 41 6e 64 20 6f 6e  not FTS3. And on
e110: 6c 79 20 69 66 20 74 68 65 20 22 6d 61 74 63 68  ly if the "match
e120: 69 6e 66 6f 3d 66 74 73 33 22 20 64 69 72 65 63  info=fts3" direc
e130: 74 69 76 65 20 77 61 73 20 6e 6f 74 0a 20 20 20  tive was not.   
e140: 20 73 70 65 63 69 66 69 65 64 20 61 73 20 70 61   specified as pa
e150: 72 74 20 6f 66 20 74 68 65 20 22 43 52 45 41 54  rt of the "CREAT
e160: 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 22  E VIRTUAL TABLE"
e170: 20 73 74 61 74 65 6d 65 6e 74 20 75 73 65 64 20   statement used 
e180: 74 6f 20 63 72 65 61 74 65 0a 20 20 20 20 74 68  to create.    th
e190: 65 20 46 54 53 34 20 74 61 62 6c 65 2e 0a 20 20  e FTS4 table..  
e1a0: 3c 74 72 3e 3c 74 64 3e 73 20 3c 74 64 3e 3c 69  <tr><td>s <td><i
e1b0: 3e 63 6f 6c 73 3c 2f 69 3e 20 3c 74 64 3e 46 6f  >cols</i> <td>Fo
e1c0: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2c 20 74  r each column, t
e1d0: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65  he length of the
e1e0: 20 6c 6f 6e 67 65 73 74 20 0a 20 20 20 20 73 75   longest .    su
e1f0: 62 73 65 71 75 65 6e 63 65 20 6f 66 20 70 68 72  bsequence of phr
e200: 61 73 65 20 6d 61 74 63 68 65 73 20 74 68 61 74  ase matches that
e210: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75   the column valu
e220: 65 20 68 61 73 20 69 6e 20 63 6f 6d 6d 6f 6e 0a  e has in common.
e230: 20 20 20 20 77 69 74 68 20 74 68 65 20 71 75 65      with the que
e240: 72 79 20 74 65 78 74 2e 20 46 6f 72 20 65 78 61  ry text. For exa
e250: 6d 70 6c 65 2c 20 69 66 20 61 20 74 61 62 6c 65  mple, if a table
e260: 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73   column contains
e270: 20 74 68 65 20 74 65 78 74 0a 20 20 20 20 27 61   the text.    'a
e280: 20 62 20 63 20 64 20 65 27 20 61 6e 64 20 74 68   b c d e' and th
e290: 65 20 71 75 65 72 79 20 69 73 20 27 61 20 63 20  e query is 'a c 
e2a0: 22 64 20 65 22 27 2c 20 74 68 65 6e 20 74 68 65  "d e"', then the
e2b0: 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 6c   length of the l
e2c0: 6f 6e 67 65 73 74 0a 20 20 20 20 63 6f 6d 6d 6f  ongest.    commo
e2d0: 6e 20 73 75 62 73 65 71 75 65 6e 63 65 20 69 73  n subsequence is
e2e0: 20 32 20 28 70 68 72 61 73 65 20 22 63 22 20 66   2 (phrase "c" f
e2f0: 6f 6c 6c 6f 77 65 64 20 62 79 20 70 68 72 61 73  ollowed by phras
e300: 65 20 22 64 20 65 22 29 2e 0a 20 20 20 20 0a 20  e "d e")..    . 
e310: 20 20 20 0a 3c 2f 74 61 62 6c 65 3e 0a 0a 3c 70     .</table>..<p
e320: 3e 0a 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a  >.  For example:
e330: 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20  ..<codeblock>.  
e340: 3c 69 3e 2d 2d 20 43 72 65 61 74 65 20 61 6e 64  <i>-- Create and
e350: 20 70 6f 70 75 6c 61 74 65 20 61 6e 20 46 54 53   populate an FTS
e360: 34 20 74 61 62 6c 65 20 77 69 74 68 20 74 77 6f  4 table with two
e370: 20 63 6f 6c 75 6d 6e 73 3a 3c 2f 69 3e 0a 20 20   columns:</i>.  
e380: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
e390: 41 42 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74  ABLE t1 USING ft
e3a0: 73 34 28 61 2c 20 62 29 3b 0a 20 20 49 4e 53 45  s4(a, b);.  INSE
e3b0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
e3c0: 53 28 27 74 72 61 6e 73 61 63 74 69 6f 6e 20 64  S('transaction d
e3d0: 65 66 61 75 6c 74 20 6d 6f 64 65 6c 73 20 64 65  efault models de
e3e0: 66 61 75 6c 74 27 2c 20 27 4e 6f 6e 20 74 72 61  fault', 'Non tra
e3f0: 6e 73 61 63 74 69 6f 6e 20 72 65 61 64 73 27 29  nsaction reads')
e400: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
e410: 74 31 20 56 41 4c 55 45 53 28 27 74 68 65 20 64  t1 VALUES('the d
e420: 65 66 61 75 6c 74 20 74 72 61 6e 73 61 63 74 69  efault transacti
e430: 6f 6e 27 2c 20 27 74 68 65 73 65 20 73 65 6d 61  on', 'these sema
e440: 6e 74 69 63 73 20 70 72 65 73 65 6e 74 27 29 3b  ntics present');
e450: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
e460: 31 20 56 41 4c 55 45 53 28 27 73 69 6e 67 6c 65  1 VALUES('single
e470: 20 72 65 71 75 65 73 74 27 2c 20 27 64 65 66 61   request', 'defa
e480: 75 6c 74 20 64 61 74 61 27 29 3b 0a 0a 20 20 3c  ult data');..  <
e490: 69 3e 2d 2d 20 49 6e 20 74 68 65 20 66 6f 6c 6c  i>-- In the foll
e4a0: 6f 77 69 6e 67 20 71 75 65 72 79 2c 20 6e 6f 20  owing query, no 
e4b0: 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 69 73  format string is
e4c0: 20 73 70 65 63 69 66 69 65 64 20 61 6e 64 20 73   specified and s
e4d0: 6f 20 69 74 20 64 65 66 61 75 6c 74 73 3c 2f 69  o it defaults</i
e4e0: 3e 0a 20 20 3c 69 3e 2d 2d 20 74 6f 20 22 70 63  >.  <i>-- to "pc
e4f0: 78 22 2e 20 49 74 20 74 68 65 72 65 66 6f 72 65  x". It therefore
e500: 20 72 65 74 75 72 6e 73 20 61 20 73 69 6e 67 6c   returns a singl
e510: 65 20 72 6f 77 20 63 6f 6e 73 69 73 74 69 6e 67  e row consisting
e520: 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 62 6c 6f   of a single blo
e530: 62 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 76 61  b</i>.  <i>-- va
e540: 6c 75 65 20 38 30 20 62 79 74 65 73 20 69 6e 20  lue 80 bytes in 
e550: 73 69 7a 65 20 28 32 30 20 33 32 2d 62 69 74 20  size (20 32-bit 
e560: 69 6e 74 65 67 65 72 73 20 2d 20 31 20 66 6f 72  integers - 1 for
e570: 20 22 70 22 2c 20 31 20 66 6f 72 20 22 63 22 20   "p", 1 for "c" 
e580: 61 6e 64 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20  and</i>.  <i>-- 
e590: 33 2a 32 2a 33 20 66 6f 72 20 22 78 22 29 2e 20  3*2*3 for "x"). 
e5a0: 49 66 20 65 61 63 68 20 62 6c 6f 63 6b 20 6f 66  If each block of
e5b0: 20 34 20 62 79 74 65 73 20 69 6e 3c 2f 69 3e 20   4 bytes in</i> 
e5c0: 74 68 65 20 62 6c 6f 62 20 69 73 20 69 6e 74 65  the blob is inte
e5d0: 72 70 72 65 74 65 64 3c 2f 69 3e 20 0a 20 20 3c  rpreted</i> .  <
e5e0: 69 3e 2d 2d 20 61 73 20 61 6e 20 75 6e 73 69 67  i>-- as an unsig
e5f0: 6e 65 64 20 69 6e 74 65 67 65 72 20 69 6e 20 6d  ned integer in m
e600: 61 63 68 69 6e 65 20 62 79 74 65 2d 6f 72 64 65  achine byte-orde
e610: 72 2c 20 74 68 65 20 76 61 6c 75 65 73 20 77 69  r, the values wi
e620: 6c 6c 20 62 65 3a 3c 2f 69 3e 0a 20 20 3c 69 3e  ll be:</i>.  <i>
e630: 2d 2d 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20  --</i>.  <i>--  
e640: 20 20 20 33 20 32 20 20 31 20 33 20 32 20 20 30     3 2  1 3 2  0
e650: 20 31 20 31 20 20 31 20 32 20 32 20 20 30 20 31   1 1  1 2 2  0 1
e660: 20 31 20 20 30 20 30 20 30 20 20 31 20 31 20 31   1  0 0 0  1 1 1
e670: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 3c 2f 69 3e  </i>.  <i>--</i>
e680: 0a 20 20 3c 69 3e 2d 2d 20 54 68 65 20 72 6f 77  .  <i>-- The row
e690: 20 72 65 74 75 72 6e 65 64 20 63 6f 72 72 65 73   returned corres
e6a0: 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 73 65 63  ponds to the sec
e6b0: 6f 6e 64 20 65 6e 74 72 79 20 69 6e 73 65 72 74  ond entry insert
e6c0: 65 64 20 69 6e 74 6f 20 74 61 62 6c 65 20 74 31  ed into table t1
e6d0: 2e 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 54 68  .</i>.  <i>-- Th
e6e0: 65 20 66 69 72 73 74 20 74 77 6f 20 69 6e 74 65  e first two inte
e6f0: 67 65 72 73 20 69 6e 20 74 68 65 20 62 6c 6f 62  gers in the blob
e700: 20 73 68 6f 77 20 74 68 61 74 20 74 68 65 20 71   show that the q
e710: 75 65 72 79 20 63 6f 6e 74 61 69 6e 65 64 20 74  uery contained t
e720: 68 72 65 65 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  hree</i>.  <i>--
e730: 20 70 68 72 61 73 65 73 20 61 6e 64 20 74 68 65   phrases and the
e740: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65   table being que
e750: 72 69 65 64 20 68 61 73 20 74 77 6f 20 63 6f 6c  ried has two col
e760: 75 6d 6e 73 2e 20 54 68 65 20 6e 65 78 74 20 62  umns. The next b
e770: 6c 6f 63 6b 20 6f 66 3c 2f 69 3e 0a 20 20 3c 69  lock of</i>.  <i
e780: 3e 2d 2d 20 74 68 72 65 65 20 69 6e 74 65 67 65  >-- three intege
e790: 72 73 20 64 65 73 63 72 69 62 65 73 20 63 6f 6c  rs describes col
e7a0: 75 6d 6e 20 30 20 28 69 6e 20 74 68 69 73 20 63  umn 0 (in this c
e7b0: 61 73 65 20 63 6f 6c 75 6d 6e 20 22 61 22 29 20  ase column "a") 
e7c0: 61 6e 64 20 70 68 72 61 73 65 3c 2f 69 3e 0a 20  and phrase</i>. 
e7d0: 20 3c 69 3e 2d 2d 20 30 20 28 69 6e 20 74 68 69   <i>-- 0 (in thi
e7e0: 73 20 63 61 73 65 20 22 64 65 66 61 75 6c 74 22  s case "default"
e7f0: 29 2e 20 54 68 65 20 63 75 72 72 65 6e 74 20 72  ). The current r
e800: 6f 77 20 63 6f 6e 74 61 69 6e 73 20 31 20 68 69  ow contains 1 hi
e810: 74 20 66 6f 72 20 22 64 65 66 61 75 6c 74 22 3c  t for "default"<
e820: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 69 6e 20 63  /i>.  <i>-- in c
e830: 6f 6c 75 6d 6e 20 30 2c 20 6f 66 20 61 20 74 6f  olumn 0, of a to
e840: 74 61 6c 20 6f 66 20 33 20 68 69 74 73 20 66 6f  tal of 3 hits fo
e850: 72 20 22 64 65 66 61 75 6c 74 22 20 74 68 61 74  r "default" that
e860: 20 6f 63 63 75 72 20 69 6e 20 63 6f 6c 75 6d 6e   occur in column
e870: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 30 20 6f  </i>.  <i>-- 0 o
e880: 66 20 61 6e 79 20 74 61 62 6c 65 20 72 6f 77 2e  f any table row.
e890: 20 54 68 65 20 33 20 68 69 74 73 20 61 72 65 20   The 3 hits are 
e8a0: 73 70 72 65 61 64 20 61 63 72 6f 73 73 20 32 20  spread across 2 
e8b0: 64 69 66 66 65 72 65 6e 74 20 72 6f 77 73 2e 3c  different rows.<
e8c0: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 3c 2f 69 3e 0a  /i>.  <i>--</i>.
e8d0: 20 20 3c 69 3e 2d 2d 20 54 68 65 20 6e 65 78 74    <i>-- The next
e8e0: 20 73 65 74 20 6f 66 20 74 68 72 65 65 20 69 6e   set of three in
e8f0: 74 65 67 65 72 73 20 28 30 20 31 20 31 29 20 70  tegers (0 1 1) p
e900: 65 72 74 61 69 6e 20 74 6f 20 74 68 65 20 68 69  ertain to the hi
e910: 74 73 20 66 6f 72 20 22 64 65 66 61 75 6c 74 22  ts for "default"
e920: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 69 6e 20  </i>.  <i>-- in 
e930: 63 6f 6c 75 6d 6e 20 31 20 6f 66 20 74 68 65 20  column 1 of the 
e940: 74 61 62 6c 65 20 28 30 20 69 6e 20 74 68 69 73  table (0 in this
e950: 20 72 6f 77 2c 20 31 20 69 6e 20 61 6c 6c 20 72   row, 1 in all r
e960: 6f 77 73 2c 20 73 70 72 65 61 64 20 61 63 72 6f  ows, spread acro
e970: 73 73 20 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20  ss </i>.  <i>-- 
e980: 31 20 72 6f 77 73 29 2e 3c 2f 69 3e 0a 20 20 3c  1 rows).</i>.  <
e990: 69 3e 2d 2d 3c 2f 69 3e 0a 20 20 53 45 4c 45 43  i>--</i>.  SELEC
e9a0: 54 20 6d 61 74 63 68 69 6e 66 6f 28 74 31 29 20  T matchinfo(t1) 
e9b0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 74 31  FROM t1 WHERE t1
e9c0: 20 4d 41 54 43 48 20 27 64 65 66 61 75 6c 74 20   MATCH 'default 
e9d0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 22 74 68 65  transaction "the
e9e0: 73 65 20 73 65 6d 61 6e 74 69 63 73 22 27 3b 0a  se semantics"';.
e9f0: 0a 20 20 3c 69 3e 2d 2d 20 54 68 65 20 66 6f 72  .  <i>-- The for
ea00: 6d 61 74 20 73 74 72 69 6e 67 20 66 6f 72 20 74  mat string for t
ea10: 68 69 73 20 71 75 65 72 79 20 69 73 20 22 6e 6c  his query is "nl
ea20: 22 2e 20 54 68 65 20 6f 75 74 70 75 74 20 61 72  ". The output ar
ea30: 72 61 79 20 77 69 6c 6c 20 74 68 65 72 65 66 6f  ray will therefo
ea40: 72 65 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 63  re</i>.  <i>-- c
ea50: 6f 6e 74 61 69 6e 20 33 20 69 6e 74 65 67 65 72  ontain 3 integer
ea60: 20 76 61 6c 75 65 73 20 2d 20 31 20 66 6f 72 20   values - 1 for 
ea70: 22 6e 22 20 61 6e 64 20 32 20 66 6f 72 20 22 6c  "n" and 2 for "l
ea80: 22 2e 20 54 68 65 20 71 75 65 72 79 20 72 65 74  ". The query ret
ea90: 75 72 6e 73 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  urns</i>.  <i>--
eaa0: 20 74 77 6f 20 72 6f 77 73 20 28 74 68 65 20 66   two rows (the f
eab0: 69 72 73 74 20 74 77 6f 20 72 6f 77 73 20 69 6e  irst two rows in
eac0: 20 74 68 65 20 74 61 62 6c 65 20 6d 61 74 63 68   the table match
ead0: 29 2e 20 54 68 65 20 76 61 6c 75 65 73 20 72 65  ). The values re
eae0: 74 75 72 6e 65 64 20 61 72 65 3a 3c 2f 69 3e 0a  turned are:</i>.
eaf0: 20 20 3c 69 3e 2d 2d 3c 2f 69 3e 0a 20 20 3c 69    <i>--</i>.  <i
eb00: 3e 2d 2d 20 20 20 20 20 33 20 20 31 20 31 3c 2f  >--     3  1 1</
eb10: 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20 20 20 33  i>.  <i>--     3
eb20: 20 20 32 20 30 3c 2f 69 3e 0a 20 20 3c 69 3e 2d    2 0</i>.  <i>-
eb30: 2d 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 54 68  -</i>.  <i>-- Th
eb40: 65 20 66 69 72 73 74 20 76 61 6c 75 65 20 69 6e  e first value in
eb50: 20 74 68 65 20 6d 61 74 63 68 69 6e 66 6f 20 61   the matchinfo a
eb60: 72 72 61 79 20 72 65 74 75 72 6e 65 64 20 66 6f  rray returned fo
eb70: 72 20 62 6f 74 68 20 72 6f 77 73 20 69 73 20 33  r both rows is 3
eb80: 20 28 74 68 65 20 3c 2f 69 3e 0a 20 20 3c 69 3e   (the </i>.  <i>
eb90: 2d 2d 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  -- number of row
eba0: 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 29 2e  s in the table).
ebb0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
ebc0: 77 6f 20 76 61 6c 75 65 73 20 61 72 65 20 74 68  wo values are th
ebd0: 65 20 6c 65 6e 67 74 68 73 20 3c 2f 69 3e 0a 20  e lengths </i>. 
ebe0: 20 3c 69 3e 2d 2d 20 6f 66 20 74 68 65 20 6c 6f   <i>-- of the lo
ebf0: 6e 67 65 73 74 20 63 6f 6d 6d 6f 6e 20 73 75 62  ngest common sub
ec00: 73 65 71 75 65 6e 63 65 20 6f 66 20 70 68 72 61  sequence of phra
ec10: 73 65 20 6d 61 74 63 68 65 73 20 69 6e 20 65 61  se matches in ea
ec20: 63 68 20 63 6f 6c 75 6d 6e 2e 3c 2f 69 3e 0a 20  ch column.</i>. 
ec30: 20 53 45 4c 45 43 54 20 6d 61 74 63 68 69 6e 66   SELECT matchinf
ec40: 6f 28 74 31 2c 20 27 6e 6c 27 29 20 46 52 4f 4d  o(t1, 'nl') FROM
ec50: 20 74 31 20 57 48 45 52 45 20 74 31 20 4d 41 54   t1 WHERE t1 MAT
ec60: 43 48 20 27 64 65 66 61 75 6c 74 20 74 72 61 6e  CH 'default tran
ec70: 73 61 63 74 69 6f 6e 27 3b 0a 3c 2f 63 6f 64 65  saction';.</code
ec80: 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 54 68  block>..<p>.  Th
ec90: 65 20 6d 61 74 63 68 69 6e 66 6f 20 66 75 6e 63  e matchinfo func
eca0: 74 69 6f 6e 20 69 73 20 6d 75 63 68 20 66 61 73  tion is much fas
ecb0: 74 65 72 20 74 68 61 6e 20 65 69 74 68 65 72 20  ter than either 
ecc0: 74 68 65 20 73 6e 69 70 70 65 74 20 6f 72 20 6f  the snippet or o
ecd0: 66 66 73 65 74 73 0a 20 20 66 75 6e 63 74 69 6f  ffsets.  functio
ece0: 6e 73 2e 20 54 68 69 73 20 69 73 20 62 65 63 61  ns. This is beca
ecf0: 75 73 65 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  use the implemen
ed00: 74 61 74 69 6f 6e 20 6f 66 20 62 6f 74 68 20 73  tation of both s
ed10: 6e 69 70 70 65 74 20 61 6e 64 20 6f 66 66 73 65  nippet and offse
ed20: 74 73 0a 20 20 69 73 20 72 65 71 75 69 72 65 64  ts.  is required
ed30: 20 74 6f 20 72 65 74 72 69 65 76 65 20 74 68 65   to retrieve the
ed40: 20 64 6f 63 75 6d 65 6e 74 73 20 62 65 69 6e 67   documents being
ed50: 20 61 6e 61 6c 79 7a 65 64 20 66 72 6f 6d 20 64   analyzed from d
ed60: 69 73 6b 2c 20 77 68 65 72 65 61 73 0a 20 20 61  isk, whereas.  a
ed70: 6c 6c 20 64 61 74 61 20 72 65 71 75 69 72 65 64  ll data required
ed80: 20 62 79 20 6d 61 74 63 68 69 6e 66 6f 20 69 73   by matchinfo is
ed90: 20 61 76 61 69 6c 61 62 6c 65 20 61 73 20 70 61   available as pa
eda0: 72 74 20 6f 66 20 74 68 65 20 73 61 6d 65 20 70  rt of the same p
edb0: 6f 72 74 69 6f 6e 73 0a 20 20 6f 66 20 74 68 65  ortions.  of the
edc0: 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78   full-text index
edd0: 20 74 68 61 74 20 61 72 65 20 72 65 71 75 69 72   that are requir
ede0: 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
edf0: 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 71 75  the full-text qu
ee00: 65 72 79 0a 20 20 69 74 73 65 6c 66 2e 20 54 68  ery.  itself. Th
ee10: 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 66  is means that of
ee20: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
ee30: 77 6f 20 71 75 65 72 69 65 73 2c 20 74 68 65 20  wo queries, the 
ee40: 66 69 72 73 74 20 6d 61 79 20 62 65 0a 20 20 61  first may be.  a
ee50: 6e 20 6f 72 64 65 72 20 6f 66 20 6d 61 67 6e 69  n order of magni
ee60: 74 75 64 65 20 66 61 73 74 65 72 20 74 68 61 6e  tude faster than
ee70: 20 74 68 65 20 73 65 63 6f 6e 64 3a 0a 0a 3c 63   the second:..<c
ee80: 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 53 45 4c 45  odeblock>.  SELE
ee90: 43 54 20 64 6f 63 69 64 2c 20 6d 61 74 63 68 69  CT docid, matchi
eea0: 6e 66 6f 28 74 62 6c 29 20 46 52 4f 4d 20 74 62  nfo(tbl) FROM tb
eeb0: 6c 20 57 48 45 52 45 20 74 62 6c 20 4d 41 54 43  l WHERE tbl MATC
eec0: 48 20 26 6c 74 3b 71 75 65 72 79 20 65 78 70 72  H &lt;query expr
eed0: 65 73 73 69 6f 6e 26 67 74 3b 3b 0a 20 20 53 45  ession&gt;;.  SE
eee0: 4c 45 43 54 20 64 6f 63 69 64 2c 20 6f 66 66 73  LECT docid, offs
eef0: 65 74 73 28 74 62 6c 29 20 46 52 4f 4d 20 74 62  ets(tbl) FROM tb
ef00: 6c 20 57 48 45 52 45 20 74 62 6c 20 4d 41 54 43  l WHERE tbl MATC
ef10: 48 20 26 6c 74 3b 71 75 65 72 79 20 65 78 70 72  H &lt;query expr
ef20: 65 73 73 69 6f 6e 26 67 74 3b 3b 0a 3c 2f 63 6f  ession&gt;;.</co
ef30: 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20  deblock>..<p>.  
ef40: 54 68 65 20 6d 61 74 63 68 69 6e 66 6f 20 66 75  The matchinfo fu
ef50: 6e 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 73 20  nction provides 
ef60: 61 6c 6c 20 74 68 65 20 69 6e 66 6f 72 6d 61 74  all the informat
ef70: 69 6f 6e 20 72 65 71 75 69 72 65 64 20 74 6f 20  ion required to 
ef80: 63 61 6c 63 75 6c 61 74 65 0a 20 20 70 72 6f 62  calculate.  prob
ef90: 61 62 69 6c 69 73 74 69 63 20 22 62 61 67 2d 6f  abilistic "bag-o
efa0: 66 2d 77 6f 72 64 73 22 20 72 65 6c 65 76 61 6e  f-words" relevan
efb0: 63 79 20 73 63 6f 72 65 73 20 73 75 63 68 20 61  cy scores such a
efc0: 73 20 0a 20 20 3c 61 20 68 72 65 66 3d 68 74 74  s .  <a href=htt
efd0: 70 3a 2f 2f 65 6e 2e 77 69 6b 69 70 65 64 69 61  p://en.wikipedia
efe0: 2e 6f 72 67 2f 77 69 6b 69 2f 4f 6b 61 70 69 5f  .org/wiki/Okapi_
eff0: 42 4d 32 35 3e 4f 6b 61 70 69 20 42 4d 32 35 2f  BM25>Okapi BM25/
f000: 42 4d 32 35 46 3c 2f 61 3e 20 74 68 61 74 20 6d  BM25F</a> that m
f010: 61 79 0a 20 20 62 65 20 75 73 65 64 20 74 6f 20  ay.  be used to 
f020: 6f 72 64 65 72 20 72 65 73 75 6c 74 73 20 69 6e  order results in
f030: 20 61 20 66 75 6c 6c 2d 74 65 78 74 20 73 65 61   a full-text sea
f040: 72 63 68 20 61 70 70 6c 69 63 61 74 69 6f 6e 2e  rch application.
f050: 20 41 70 70 65 6e 64 69 78 20 41 20 6f 66 20 74   Appendix A of t
f060: 68 69 73 20 0a 20 20 64 6f 63 75 6d 65 6e 74 2c  his .  document,
f070: 20 22 5b 73 65 61 72 63 68 20 61 70 70 6c 69 63   "[search applic
f080: 61 74 69 6f 6e 20 74 69 70 73 5d 22 2c 20 63 6f  ation tips]", co
f090: 6e 74 61 69 6e 73 20 61 6e 20 65 78 61 6d 70 6c  ntains an exampl
f0a0: 65 20 6f 66 20 75 73 69 6e 67 20 74 68 65 0a 20  e of using the. 
f0b0: 20 6d 61 74 63 68 69 6e 66 6f 28 29 20 66 75 6e   matchinfo() fun
f0c0: 63 74 69 6f 6e 20 65 66 66 69 63 69 65 6e 74 6c  ction efficientl
f0d0: 79 2e 0a 0a 3c 68 31 20 69 64 3d 66 74 73 34 61  y...<h1 id=fts4a
f0e0: 75 78 20 74 61 67 73 3d 22 66 74 73 34 61 75 78  ux tags="fts4aux
f0f0: 22 3e 46 74 73 34 61 75 78 20 2d 20 44 69 72 65  ">Fts4aux - Dire
f100: 63 74 20 41 63 63 65 73 73 20 74 6f 20 74 68 65  ct Access to the
f110: 20 46 75 6c 6c 2d 54 65 78 74 20 49 6e 64 65 78   Full-Text Index
f120: 3c 2f 68 31 3e 0a 0a 3c 70 3e 0a 20 20 41 73 20  </h1>..<p>.  As 
f130: 6f 66 20 76 65 72 73 69 6f 6e 20 33 2e 37 2e 36  of version 3.7.6
f140: 2c 20 53 51 4c 69 74 65 20 69 6e 63 6c 75 64 65  , SQLite include
f150: 73 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20  s a new virtual 
f160: 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 63 61 6c  table module cal
f170: 6c 65 64 20 0a 20 20 22 66 74 73 34 61 75 78 22  led .  "fts4aux"
f180: 2c 20 77 68 69 63 68 20 63 61 6e 20 62 65 20 75  , which can be u
f190: 73 65 64 20 74 6f 20 69 6e 73 70 65 63 74 20 74  sed to inspect t
f1a0: 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64  he full-text ind
f1b0: 65 78 20 6f 66 20 61 6e 20 65 78 69 74 69 6e 67  ex of an exiting
f1c0: 0a 20 20 46 54 53 20 74 61 62 6c 65 20 64 69 72  .  FTS table dir
f1d0: 65 63 74 6c 79 2e 20 44 65 73 70 69 74 65 20 69  ectly. Despite i
f1e0: 74 73 20 6e 61 6d 65 2c 20 66 74 73 34 61 75 78  ts name, fts4aux
f1f0: 20 77 6f 72 6b 73 20 6a 75 73 74 20 61 73 20 77   works just as w
f200: 65 6c 6c 20 77 69 74 68 20 46 54 53 33 0a 20 20  ell with FTS3.  
f210: 74 61 62 6c 65 73 20 61 73 20 69 74 20 64 6f 65  tables as it doe
f220: 73 20 77 69 74 68 20 46 54 53 34 20 74 61 62 6c  s with FTS4 tabl
f230: 65 73 2e 20 46 74 73 34 61 75 78 20 74 61 62 6c  es. Fts4aux tabl
f240: 65 73 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79  es are read-only
f250: 2e 20 54 68 65 20 6f 6e 6c 79 0a 20 20 77 61 79  . The only.  way
f260: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 63   to modify the c
f270: 6f 6e 74 65 6e 74 73 20 6f 66 20 61 6e 20 66 74  ontents of an ft
f280: 73 34 61 75 78 20 74 61 62 6c 65 20 69 73 20 62  s4aux table is b
f290: 79 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 0a  y modifying the.
f2a0: 20 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68    contents of th
f2b0: 65 20 61 73 73 6f 63 69 61 74 65 64 20 46 54 53  e associated FTS
f2c0: 20 74 61 62 6c 65 2e 20 54 68 65 20 66 74 73 34   table. The fts4
f2d0: 61 75 78 20 6d 6f 64 75 6c 65 20 69 73 20 61 75  aux module is au
f2e0: 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 20 20 69 6e  tomatically.  in
f2f0: 63 6c 75 64 65 64 20 69 6e 20 61 6c 6c 20 5b 63  cluded in all [c
f300: 6f 6d 70 69 6c 65 20 66 74 73 7c 62 75 69 6c 64  ompile fts|build
f310: 73 20 74 68 61 74 20 69 6e 63 6c 75 64 65 20 46  s that include F
f320: 54 53 5d 2e 0a 0a 3c 70 3e 0a 20 20 41 6e 20 66  TS]...<p>.  An f
f330: 74 73 34 61 75 78 20 76 69 72 74 75 61 6c 20 74  ts4aux virtual t
f340: 61 62 6c 65 20 69 73 20 63 6f 6e 73 74 72 75 63  able is construc
f350: 74 65 64 20 77 69 74 68 20 61 20 73 69 6e 67 6c  ted with a singl
f360: 65 20 61 72 67 75 6d 65 6e 74 20 2d 20 74 68 65  e argument - the
f370: 20 0a 20 20 75 6e 71 75 61 6c 69 66 69 65 64 20   .  unqualified 
f380: 6e 61 6d 65 20 6f 66 20 74 68 65 20 46 54 53 20  name of the FTS 
f390: 74 61 62 6c 65 20 74 68 61 74 20 69 74 20 77 69  table that it wi
f3a0: 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 61 63  ll be used to ac
f3b0: 63 65 73 73 2e 0a 20 20 46 6f 72 20 65 78 61 6d  cess..  For exam
f3c0: 70 6c 65 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b  ple:..<codeblock
f3d0: 3e 0a 20 20 3c 69 3e 2d 2d 20 43 72 65 61 74 65  >.  <i>-- Create
f3e0: 20 61 6e 20 46 54 53 34 20 74 61 62 6c 65 3c 2f   an FTS4 table</
f3f0: 69 3e 0a 20 20 43 52 45 41 54 45 20 56 49 52 54  i>.  CREATE VIRT
f400: 55 41 4c 20 54 41 42 4c 45 20 66 74 20 55 53 49  UAL TABLE ft USI
f410: 4e 47 20 66 74 73 34 28 78 2c 20 79 29 3b 0a 0a  NG fts4(x, y);..
f420: 20 20 3c 69 3e 2d 2d 20 43 72 65 61 74 65 20 61    <i>-- Create a
f430: 6e 20 66 74 73 34 61 75 78 20 74 61 62 6c 65 20  n fts4aux table 
f440: 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 66 75  to access the fu
f450: 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 20 66 6f  ll-text index fo
f460: 72 20 74 61 62 6c 65 20 22 66 74 22 3c 2f 69 3e  r table "ft"</i>
f470: 0a 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41  .  CREATE VIRTUA
f480: 4c 20 54 41 42 4c 45 20 66 74 5f 74 65 72 6d 73  L TABLE ft_terms
f490: 20 55 53 49 4e 47 20 66 74 73 34 61 75 78 28 66   USING fts4aux(f
f4a0: 74 29 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e  t);.</codeblock>
f4b0: 0a 0a 3c 70 3e 0a 20 20 46 6f 72 20 65 61 63 68  ..<p>.  For each
f4c0: 20 74 65 72 6d 20 70 72 65 73 65 6e 74 20 69 6e   term present in
f4d0: 20 74 68 65 20 46 54 53 20 74 61 62 6c 65 2c 20   the FTS table, 
f4e0: 74 68 65 72 65 20 61 72 65 20 62 65 74 77 65 65  there are betwee
f4f0: 6e 20 32 20 61 6e 64 20 4e 2b 31 20 72 6f 77 73  n 2 and N+1 rows
f500: 0a 20 20 69 6e 20 74 68 65 20 66 74 73 34 61 75  .  in the fts4au
f510: 78 20 74 61 62 6c 65 2c 20 77 68 65 72 65 20 4e  x table, where N
f520: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
f530: 66 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 63  f user-defined c
f540: 6f 6c 75 6d 6e 73 20 69 6e 0a 20 20 74 68 65 20  olumns in.  the 
f550: 61 73 73 6f 63 69 61 74 65 64 20 46 54 53 20 74  associated FTS t
f560: 61 62 6c 65 2e 20 41 6e 20 66 74 73 34 61 75 78  able. An fts4aux
f570: 20 74 61 62 6c 65 20 61 6c 77 61 79 73 20 68 61   table always ha
f580: 73 20 74 68 65 20 73 61 6d 65 20 66 6f 75 72 20  s the same four 
f590: 63 6f 6c 75 6d 6e 73 2c 20 0a 20 20 61 73 20 66  columns, .  as f
f5a0: 6f 6c 6c 6f 77 73 2c 20 66 72 6f 6d 20 6c 65 66  ollows, from lef
f5b0: 74 20 74 6f 20 72 69 67 68 74 3a 0a 0a 3c 74 61  t to right:..<ta
f5c0: 62 6c 65 20 73 74 72 69 70 65 64 3d 31 3e 0a 20  ble striped=1>. 
f5d0: 20 3c 74 72 3e 3c 74 68 3e 43 6f 6c 75 6d 6e 20   <tr><th>Column 
f5e0: 4e 61 6d 65 3c 74 68 3e 43 6f 6c 75 6d 6e 20 43  Name<th>Column C
f5f0: 6f 6e 74 65 6e 74 73 0a 20 20 3c 74 72 3e 3c 74  ontents.  <tr><t
f600: 64 3e 74 65 72 6d 3c 74 64 3e 20 0a 20 20 20 20  d>term<td> .    
f610: 43 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 65 78  Contains the tex
f620: 74 20 6f 66 20 74 68 65 20 74 65 72 6d 20 66 6f  t of the term fo
f630: 72 20 74 68 69 73 20 72 6f 77 2e 0a 20 20 3c 74  r this row..  <t
f640: 72 3e 3c 74 64 3e 63 6f 6c 3c 74 64 3e 20 0a 20  r><td>col<td> . 
f650: 20 20 20 54 68 69 73 20 63 6f 6c 75 6d 6e 20 6d     This column m
f660: 61 79 20 63 6f 6e 74 61 69 6e 20 65 69 74 68 65  ay contain eithe
f670: 72 20 74 68 65 20 74 65 78 74 20 76 61 6c 75 65  r the text value
f680: 20 27 2a 27 20 28 69 2e 65 2e 20 61 20 73 69 6e   '*' (i.e. a sin
f690: 67 6c 65 20 0a 20 20 20 20 63 68 61 72 61 63 74  gle .    charact
f6a0: 65 72 2c 20 55 54 46 20 63 6f 64 65 70 6f 69 6e  er, UTF codepoin
f6b0: 74 20 34 32 29 20 6f 72 20 61 6e 20 69 6e 74 65  t 42) or an inte
f6c0: 67 65 72 20 62 65 74 77 65 65 6e 20 30 20 61 6e  ger between 0 an
f6d0: 64 20 4e 2d 31 2c 20 77 68 65 72 65 20 4e 20 69  d N-1, where N i
f6e0: 73 0a 20 20 20 20 61 67 61 69 6e 20 74 68 65 20  s.    again the 
f6f0: 6e 75 6d 62 65 72 20 6f 66 20 75 73 65 72 2d 64  number of user-d
f700: 65 66 69 6e 65 64 20 63 6f 6c 75 6d 6e 73 20 69  efined columns i
f710: 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 69  n the corresponi
f720: 6e 67 20 46 54 53 20 74 61 62 6c 65 2e 0a 0a 20  ng FTS table... 
f730: 20 3c 74 72 3e 3c 74 64 3e 64 6f 63 75 6d 65 6e   <tr><td>documen
f740: 74 73 3c 74 64 3e 0a 20 20 20 20 54 68 69 73 20  ts<td>.    This 
f750: 63 6f 6c 75 6d 6e 20 61 6c 77 61 79 73 20 63 6f  column always co
f760: 6e 74 61 69 6e 73 20 61 6e 20 69 6e 74 65 67 65  ntains an intege
f770: 72 20 76 61 6c 75 65 20 67 72 65 61 74 65 72 20  r value greater 
f780: 74 68 61 6e 20 7a 65 72 6f 2e 0a 20 20 20 20 3c  than zero..    <
f790: 62 72 3e 3c 62 72 3e 0a 20 20 20 20 49 66 20 74  br><br>.    If t
f7a0: 68 65 20 22 63 6f 6c 22 20 63 6f 6c 75 6d 6e 20  he "col" column 
f7b0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c  contains the val
f7c0: 75 65 20 27 2a 27 2c 20 74 68 65 6e 20 74 68 69  ue '*', then thi
f7d0: 73 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 63 6f 6e  s column.    con
f7e0: 74 61 69 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  tains the number
f7f0: 20 6f 66 20 72 6f 77 73 20 6f 66 20 74 68 65 20   of rows of the 
f800: 46 54 53 20 74 61 62 6c 65 20 74 68 61 74 20 63  FTS table that c
f810: 6f 6e 74 61 69 6e 20 61 74 20 6c 65 61 73 74 20  ontain at least 
f820: 6f 6e 65 0a 20 20 20 20 69 6e 73 74 61 6e 63 65  one.    instance
f830: 20 6f 66 20 74 68 65 20 74 65 72 6d 20 28 69 6e   of the term (in
f840: 20 61 6e 79 20 63 6f 6c 75 6d 6e 29 2e 20 49 66   any column). If
f850: 20 63 6f 6c 20 63 6f 6e 74 61 69 6e 73 20 61 6e   col contains an
f860: 20 69 6e 74 65 67 65 72 0a 20 20 20 20 76 61 6c   integer.    val
f870: 75 65 2c 20 74 68 65 6e 20 74 68 69 73 20 63 6f  ue, then this co
f880: 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68  lumn contains th
f890: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
f8a0: 20 6f 66 20 74 68 65 20 46 54 53 20 74 61 62 6c   of the FTS tabl
f8b0: 65 20 74 68 61 74 0a 20 20 20 20 63 6f 6e 74 61  e that.    conta
f8c0: 69 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  in at least one 
f8d0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
f8e0: 74 65 72 6d 20 69 6e 20 74 68 65 20 63 6f 6c 75  term in the colu
f8f0: 6d 6e 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  mn identified by
f900: 0a 20 20 20 20 74 68 65 20 63 6f 6c 20 76 61 6c  .    the col val
f910: 75 65 2e 20 41 73 20 75 73 75 61 6c 2c 20 74 68  ue. As usual, th
f920: 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  e columns of the
f930: 20 46 54 53 20 74 61 62 6c 65 20 61 72 65 20 6e   FTS table are n
f940: 75 6d 62 65 72 65 64 0a 20 20 20 20 66 72 6f 6d  umbered.    from
f950: 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2c 20   left to right, 
f960: 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 7a 65  starting with ze
f970: 72 6f 2e 0a 0a 20 20 3c 74 72 3e 3c 74 64 3e 6f  ro...  <tr><td>o
f980: 63 63 75 72 72 65 6e 63 65 73 3c 74 64 3e 0a 20  ccurrences<td>. 
f990: 20 20 20 54 68 69 73 20 63 6f 6c 75 6d 6e 20 61     This column a
f9a0: 6c 73 6f 20 61 6c 77 61 79 73 20 63 6f 6e 74 61  lso always conta
f9b0: 69 6e 73 20 61 6e 20 69 6e 74 65 67 65 72 20 76  ins an integer v
f9c0: 61 6c 75 65 20 67 72 65 61 74 65 72 20 74 68 61  alue greater tha
f9d0: 6e 20 7a 65 72 6f 2e 0a 20 20 20 20 3c 62 72 3e  n zero..    <br>
f9e0: 3c 62 72 3e 0a 20 20 20 20 49 66 20 74 68 65 20  <br>.    If the 
f9f0: 22 63 6f 6c 22 20 63 6f 6c 75 6d 6e 20 63 6f 6e  "col" column con
fa00: 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65 20  tains the value 
fa10: 27 2a 27 2c 20 74 68 65 6e 20 74 68 69 73 20 63  '*', then this c
fa20: 6f 6c 75 6d 6e 0a 20 20 20 20 63 6f 6e 74 61 69  olumn.    contai
fa30: 6e 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  ns the total num
fa40: 62 65 72 20 6f 66 20 69 6e 73 74 61 6e 63 65 73  ber of instances
fa50: 20 6f 66 20 74 68 65 20 74 65 72 6d 20 69 6e 20   of the term in 
fa60: 61 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68 65 20  all rows of the 
fa70: 0a 20 20 20 20 46 54 53 20 74 61 62 6c 65 20 28  .    FTS table (
fa80: 69 6e 20 61 6e 79 20 63 6f 6c 75 6d 6e 29 2e 20  in any column). 
fa90: 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 63 6f  Otherwise, if co
faa0: 6c 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e  l contains an in
fab0: 74 65 67 65 72 0a 20 20 20 20 76 61 6c 75 65 2c  teger.    value,
fac0: 20 74 68 65 6e 20 74 68 69 73 20 63 6f 6c 75 6d   then this colum
fad0: 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74  n contains the t
fae0: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 69  otal number of i
faf0: 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 0a  nstances of the.
fb00: 20 20 20 20 74 65 72 6d 20 74 68 61 74 20 61 70      term that ap
fb10: 70 65 61 72 20 69 6e 20 74 68 65 20 46 54 53 20  pear in the FTS 
fb20: 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 69 64 65  table column ide
fb30: 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20 63  ntified by the c
fb40: 6f 6c 0a 20 20 20 20 76 61 6c 75 65 2e 0a 3c 2f  ol.    value..</
fb50: 74 61 62 6c 65 3e 0a 0a 3c 70 3e 0a 20 20 46 6f  table>..<p>.  Fo
fb60: 72 20 65 78 61 6d 70 6c 65 2c 20 75 73 69 6e 67  r example, using
fb70: 20 74 68 65 20 74 61 62 6c 65 73 20 63 72 65 61   the tables crea
fb80: 74 65 64 20 61 62 6f 76 65 3a 0a 0a 3c 63 6f 64  ted above:..<cod
fb90: 65 62 6c 6f 63 6b 3e 0a 20 20 49 4e 53 45 52 54  eblock>.  INSERT
fba0: 20 49 4e 54 4f 20 66 74 28 78 2c 20 79 29 20 56   INTO ft(x, y) V
fbb0: 41 4c 55 45 53 28 27 41 70 70 6c 65 20 62 61 6e  ALUES('Apple ban
fbc0: 61 6e 61 27 2c 20 27 43 68 65 72 72 79 27 29 3b  ana', 'Cherry');
fbd0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 66  .  INSERT INTO f
fbe0: 74 28 78 2c 20 79 29 20 56 41 4c 55 45 53 28 27  t(x, y) VALUES('
fbf0: 42 61 6e 61 6e 61 20 44 61 74 65 20 44 61 74 65  Banana Date Date
fc00: 27 2c 20 27 63 68 65 72 72 79 27 29 3b 0a 20 20  ', 'cherry');.  
fc10: 49 4e 53 45 52 54 20 49 4e 54 4f 20 66 74 28 78  INSERT INTO ft(x
fc20: 2c 20 79 29 20 56 41 4c 55 45 53 28 27 43 68 65  , y) VALUES('Che
fc30: 72 72 79 20 45 6c 64 65 72 62 65 72 72 79 27 2c  rry Elderberry',
fc40: 20 27 45 6c 64 65 72 62 65 72 72 79 27 29 3b 0a   'Elderberry');.
fc50: 0a 20 20 3c 69 3e 2d 2d 20 54 68 65 20 66 6f 6c  .  <i>-- The fol
fc60: 6c 6f 77 69 6e 67 20 71 75 65 72 79 20 72 65 74  lowing query ret
fc70: 75 72 6e 73 20 74 68 69 73 20 64 61 74 61 3a 3c  urns this data:<
fc80: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 3c 2f 69 3e 0a  /i>.  <i>--</i>.
fc90: 20 20 3c 69 3e 2d 2d 20 20 20 20 20 61 70 70 6c    <i>--     appl
fca0: 65 20 20 20 20 20 20 20 7c 20 20 2a 20 20 7c 20  e       |  *  | 
fcb0: 20 31 20 20 7c 20 20 31 3c 2f 69 3e 0a 20 20 3c   1  |  1</i>.  <
fcc0: 69 3e 2d 2d 20 20 20 20 20 61 70 70 6c 65 20 20  i>--     apple  
fcd0: 20 20 20 20 20 7c 20 20 30 20 20 7c 20 20 31 20       |  0  |  1 
fce0: 20 7c 20 20 31 3c 2f 69 3e 0a 20 20 3c 69 3e 2d   |  1</i>.  <i>-
fcf0: 2d 20 20 20 20 20 62 61 6e 61 6e 61 20 20 20 20  -     banana    
fd00: 20 20 7c 20 20 2a 20 20 7c 20 20 32 20 20 7c 20    |  *  |  2  | 
fd10: 20 32 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20   2</i>.  <i>--  
fd20: 20 20 20 62 61 6e 61 6e 61 20 20 20 20 20 20 7c     banana      |
fd30: 20 20 30 20 20 7c 20 20 32 20 20 7c 20 20 32 3c    0  |  2  |  2<
fd40: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20 20 20  /i>.  <i>--     
fd50: 63 68 65 72 72 79 20 20 20 20 20 20 7c 20 20 2a  cherry      |  *
fd60: 20 20 7c 20 20 33 20 20 7c 20 20 33 3c 2f 69 3e    |  3  |  3</i>
fd70: 0a 20 20 3c 69 3e 2d 2d 20 20 20 20 20 63 68 65  .  <i>--     che
fd80: 72 72 79 20 20 20 20 20 20 7c 20 20 30 20 20 7c  rry      |  0  |
fd90: 20 20 31 20 20 7c 20 20 31 3c 2f 69 3e 0a 20 20    1  |  1</i>.  
fda0: 3c 69 3e 2d 2d 20 20 20 20 20 63 68 65 72 72 79  <i>--     cherry
fdb0: 20 20 20 20 20 20 7c 20 20 31 20 20 7c 20 20 32        |  1  |  2
fdc0: 20 20 7c 20 20 32 3c 2f 69 3e 0a 20 20 3c 69 3e    |  2</i>.  <i>
fdd0: 2d 2d 20 20 20 20 20 64 61 74 65 20 20 20 20 20  --     date     
fde0: 20 20 20 7c 20 20 2a 20 20 7c 20 20 31 20 20 7c     |  *  |  1  |
fdf0: 20 20 32 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20    2</i>.  <i>-- 
fe00: 20 20 20 20 64 61 74 65 20 20 20 20 20 20 20 20      date        
fe10: 7c 20 20 30 20 20 7c 20 20 31 20 20 7c 20 20 32  |  0  |  1  |  2
fe20: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20 20  </i>.  <i>--    
fe30: 20 65 6c 64 65 72 62 65 72 72 79 20 20 7c 20 20   elderberry  |  
fe40: 2a 20 20 7c 20 20 31 20 20 7c 20 20 32 3c 2f 69  *  |  1  |  2</i
fe50: 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20 20 20 65 6c  >.  <i>--     el
fe60: 64 65 72 62 65 72 72 79 20 20 7c 20 20 31 20 20  derberry  |  1  
fe70: 7c 20 20 31 20 20 7c 20 20 31 3c 2f 69 3e 0a 20  |  1  |  1</i>. 
fe80: 20 3c 69 3e 2d 2d 20 20 20 20 20 65 6c 64 65 72   <i>--     elder
fe90: 62 65 72 72 79 20 20 7c 20 20 31 20 20 7c 20 20  berry  |  1  |  
fea0: 31 20 20 7c 20 20 31 3c 2f 69 3e 0a 20 20 3c 69  1  |  1</i>.  <i
feb0: 3e 2d 2d 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54  >--</i>.  SELECT
fec0: 20 74 65 72 6d 2c 20 63 6f 6c 2c 20 64 6f 63 75   term, col, docu
fed0: 6d 65 6e 74 73 2c 20 6f 63 63 75 72 72 65 6e 63  ments, occurrenc
fee0: 65 73 20 46 52 4f 4d 20 66 74 5f 74 65 72 6d 73  es FROM ft_terms
fef0: 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a  ;.</codeblock>..
ff00: 3c 70 3e 0a 20 20 49 6e 20 74 68 65 20 65 78 61  <p>.  In the exa
ff10: 6d 70 6c 65 2c 20 74 68 65 20 76 61 6c 75 65 73  mple, the values
ff20: 20 69 6e 20 74 68 65 20 22 74 65 72 6d 22 20 63   in the "term" c
ff30: 6f 6c 75 6d 6e 20 61 72 65 20 61 6c 6c 20 6c 6f  olumn are all lo
ff40: 77 65 72 20 63 61 73 65 2c 20 0a 20 20 65 76 65  wer case, .  eve
ff50: 6e 20 74 68 6f 75 67 68 20 74 68 65 79 20 77 65  n though they we
ff60: 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  re inserted into
ff70: 20 74 61 62 6c 65 20 22 66 74 22 20 69 6e 20 6d   table "ft" in m
ff80: 69 78 65 64 20 63 61 73 65 2e 20 54 68 69 73 20  ixed case. This 
ff90: 69 73 20 62 65 63 61 75 73 65 0a 20 20 61 6e 20  is because.  an 
ffa0: 66 74 73 33 61 75 78 20 74 61 62 6c 65 20 63 6f  fts3aux table co
ffb0: 6e 74 61 69 6e 73 20 74 68 65 20 74 65 72 6d 73  ntains the terms
ffc0: 20 61 73 20 65 78 74 72 61 63 74 65 64 20 66 72   as extracted fr
ffd0: 6f 6d 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 20  om the document 
ffe0: 74 65 78 74 0a 20 20 62 79 20 74 68 65 20 5b 74  text.  by the [t
fff0: 6f 6b 65 6e 69 7a 65 72 5d 2e 20 49 6e 20 74 68  okenizer]. In th
10000 69 73 20 63 61 73 65 2c 20 73 69 6e 63 65 20 74  is case, since t
10010 61 62 6c 65 20 22 66 74 22 20 75 73 65 73 20 74  able "ft" uses t
10020 68 65 20 0a 20 20 5b 74 6f 6b 65 6e 69 7a 65 72  he .  [tokenizer
10030 7c 73 69 6d 70 6c 65 20 74 6f 6b 65 6e 69 7a 65  |simple tokenize
10040 72 5d 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 61  r], this means a
10050 6c 6c 20 74 65 72 6d 73 20 68 61 76 65 20 62 65  ll terms have be
10060 65 6e 20 66 6f 6c 64 65 64 20 74 6f 0a 20 20 6c  en folded to.  l
10070 6f 77 65 72 20 63 61 73 65 2e 20 41 6c 73 6f 2c  ower case. Also,
10080 20 74 68 65 72 65 20 69 73 20 28 66 6f 72 20 65   there is (for e
10090 78 61 6d 70 6c 65 29 20 6e 6f 20 72 6f 77 20 77  xample) no row w
100a0 69 74 68 20 63 6f 6c 75 6d 6e 20 22 74 65 72 6d  ith column "term
100b0 22 0a 20 20 73 65 74 20 74 6f 20 22 61 70 70 6c  ".  set to "appl
100c0 65 22 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 22 63  e" and column "c
100d0 6f 6c 22 20 73 65 74 20 74 6f 20 31 2e 20 53 69  ol" set to 1. Si
100e0 6e 63 65 20 74 68 65 72 65 20 61 72 65 20 6e 6f  nce there are no
100f0 20 69 6e 73 74 61 6e 63 65 73 0a 20 20 6f 66 20   instances.  of 
10100 74 68 65 20 74 65 72 6d 20 22 61 70 70 6c 65 22  the term "apple"
10110 20 69 6e 20 63 6f 6c 75 6d 6e 20 31 2c 20 6e 6f   in column 1, no
10120 20 72 6f 77 20 69 73 20 70 72 65 73 65 6e 74 20   row is present 
10130 69 6e 20 74 68 65 20 66 74 73 34 61 75 78 20 74  in the fts4aux t
10140 61 62 6c 65 2e 0a 0a 3c 70 3e 0a 20 20 44 75 72  able...<p>.  Dur
10150 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ing a transactio
10160 6e 2c 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 64  n, some of the d
10170 61 74 61 20 77 72 69 74 74 65 6e 20 74 6f 20 61  ata written to a
10180 6e 20 46 54 53 20 74 61 62 6c 65 20 6d 61 79 20  n FTS table may 
10190 62 65 20 0a 20 20 63 61 63 68 65 64 20 69 6e 20  be .  cached in 
101a0 6d 65 6d 6f 72 79 20 61 6e 64 20 77 72 69 74 74  memory and writt
101b0 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  en to the databa
101c0 73 65 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65  se only when the
101d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
101e0 0a 20 20 63 6f 6d 6d 69 74 74 65 64 2e 20 48 6f  .  committed. Ho
101f0 77 65 76 65 72 20 74 68 65 20 69 6d 70 6c 65 6d  wever the implem
10200 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
10210 66 74 73 34 61 75 78 20 6d 6f 64 75 6c 65 20 69  fts4aux module i
10220 73 20 6f 6e 6c 79 20 61 62 6c 65 20 0a 20 20 74  s only able .  t
10230 6f 20 72 65 61 64 20 64 61 74 61 20 66 72 6f 6d  o read data from
10240 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
10250 6e 20 70 72 61 63 74 69 63 65 20 74 68 69 73 20  n practice this 
10260 6d 65 61 6e 73 20 74 68 61 74 20 69 66 20 61 6e  means that if an
10270 20 66 74 73 34 61 75 78 20 0a 20 20 74 61 62 6c   fts4aux .  tabl
10280 65 20 69 73 20 71 75 65 72 69 65 64 20 66 72 6f  e is queried fro
10290 6d 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  m within a trans
102a0 61 63 74 69 6f 6e 20 69 6e 20 77 68 69 63 68 20  action in which 
102b0 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 0a  the associated .
102c0 20 20 46 54 53 20 74 61 62 6c 65 20 68 61 73 20    FTS table has 
102d0 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2c 20 74  been modified, t
102e0 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
102f0 65 20 71 75 65 72 79 20 61 72 65 20 6c 69 6b 65  e query are like
10300 6c 79 20 74 6f 20 72 65 66 6c 65 63 74 20 0a 20  ly to reflect . 
10310 20 6f 6e 6c 79 20 61 20 28 70 6f 73 73 69 62 6c   only a (possibl
10320 79 20 65 6d 70 74 79 29 20 73 75 62 73 65 74 20  y empty) subset 
10330 6f 66 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d  of the changes m
10340 61 64 65 2e 0a 0a 3c 68 31 20 69 64 3d 74 6f 6b  ade...<h1 id=tok
10350 65 6e 69 7a 65 72 20 74 61 67 73 3d 22 74 6f 6b  enizer tags="tok
10360 65 6e 69 7a 65 72 22 3e 54 6f 6b 65 6e 69 7a 65  enizer">Tokenize
10370 72 73 3c 2f 68 31 3e 0a 0a 3c 70 3e 0a 20 20 41  rs</h1>..<p>.  A
10380 6e 20 46 54 53 20 74 6f 6b 65 6e 69 7a 65 72 20  n FTS tokenizer 
10390 69 73 20 61 20 73 65 74 20 6f 66 20 72 75 6c 65  is a set of rule
103a0 73 20 66 6f 72 20 65 78 74 72 61 63 74 69 6e 67  s for extracting
103b0 20 74 65 72 6d 73 20 66 72 6f 6d 20 61 20 64 6f   terms from a do
103c0 63 75 6d 65 6e 74 20 0a 20 20 6f 72 20 62 61 73  cument .  or bas
103d0 69 63 20 46 54 53 20 66 75 6c 6c 2d 74 65 78 74  ic FTS full-text
103e0 20 71 75 65 72 79 2e 20 0a 0a 3c 70 3e 0a 20 20   query. ..<p>.  
103f0 55 6e 6c 65 73 73 20 61 20 73 70 65 63 69 66 69  Unless a specifi
10400 63 20 74 6f 6b 65 6e 69 7a 65 72 20 69 73 20 73  c tokenizer is s
10410 70 65 63 69 66 69 65 64 20 61 73 20 70 61 72 74  pecified as part
10420 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 0a   of the CREATE .
10430 20 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20    VIRTUAL TABLE 
10440 73 74 61 74 65 6d 65 6e 74 20 75 73 65 64 20 74  statement used t
10450 6f 20 63 72 65 61 74 65 20 74 68 65 20 46 54 53  o create the FTS
10460 20 74 61 62 6c 65 2c 20 74 68 65 20 64 65 66 61   table, the defa
10470 75 6c 74 20 0a 20 20 74 6f 6b 65 6e 69 7a 65 72  ult .  tokenizer
10480 2c 20 22 73 69 6d 70 6c 65 22 2c 20 69 73 20 75  , "simple", is u
10490 73 65 64 2e 20 54 68 65 20 73 69 6d 70 6c 65 20  sed. The simple 
104a0 74 6f 6b 65 6e 69 7a 65 72 20 65 78 74 72 61 63  tokenizer extrac
104b0 74 73 20 74 6f 6b 65 6e 73 20 66 72 6f 6d 0a 20  ts tokens from. 
104c0 20 61 20 64 6f 63 75 6d 65 6e 74 20 6f 72 20 62   a document or b
104d0 61 73 69 63 20 46 54 53 20 66 75 6c 6c 2d 74 65  asic FTS full-te
104e0 78 74 20 71 75 65 72 79 20 61 63 63 6f 72 64 69  xt query accordi
104f0 6e 67 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  ng to the follow
10500 69 6e 67 20 0a 20 20 72 75 6c 65 73 3a 0a 0a 3c  ing .  rules:..<
10510 75 6c 3e 0a 20 20 3c 6c 69 3e 3c 70 3e 20 41 20  ul>.  <li><p> A 
10520 74 65 72 6d 20 69 73 20 61 20 63 6f 6e 74 69 67  term is a contig
10530 75 6f 75 73 20 73 65 71 75 65 6e 63 65 20 6f 66  uous sequence of
10540 20 65 6c 69 67 69 62 6c 65 20 63 68 61 72 61 63   eligible charac
10550 74 65 72 73 2c 20 77 68 65 72 65 20 0a 20 20 20  ters, where .   
10560 20 65 6c 69 67 69 62 6c 65 20 63 68 61 72 61 63   eligible charac
10570 74 65 72 73 20 61 72 65 20 61 6c 6c 20 61 6c 70  ters are all alp
10580 68 61 6e 75 6d 65 72 69 63 20 63 68 61 72 61 63  hanumeric charac
10590 74 65 72 73 2c 20 74 68 65 20 22 5f 22 20 63 68  ters, the "_" ch
105a0 61 72 61 63 74 65 72 2c 0a 20 20 20 20 61 6e 64  aracter,.    and
105b0 20 61 6c 6c 20 63 68 61 72 61 63 74 65 72 73 20   all characters 
105c0 77 69 74 68 20 55 54 46 20 63 6f 64 65 70 6f 69  with UTF codepoi
105d0 6e 74 73 20 67 72 65 61 74 65 72 20 74 68 61 6e  nts greater than
105e0 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 31 32 38   or equal to 128
105f0 2e 0a 20 20 20 20 41 6c 6c 20 6f 74 68 65 72 20  ..    All other 
10600 63 68 61 72 61 63 74 65 72 73 20 61 72 65 20 64  characters are d
10610 69 73 63 61 72 64 65 64 20 77 68 65 6e 20 73 70  iscarded when sp
10620 6c 69 74 74 69 6e 67 20 61 20 64 6f 63 75 6d 65  litting a docume
10630 6e 74 20 69 6e 74 6f 20 74 65 72 6d 73 2e 0a 20  nt into terms.. 
10640 20 20 20 54 68 65 69 72 20 6f 6e 6c 79 20 63 6f     Their only co
10650 6e 74 72 69 62 75 74 69 6f 6e 20 69 73 20 74 6f  ntribution is to
10660 20 73 65 70 61 72 61 74 65 20 61 64 6a 61 63 65   separate adjace
10670 6e 74 20 74 65 72 6d 73 2e 0a 0a 20 20 3c 6c 69  nt terms...  <li
10680 3e 3c 70 3e 20 41 6c 6c 20 75 70 70 65 72 63 61  ><p> All upperca
10690 73 65 20 63 68 61 72 61 63 74 65 72 73 20 77 69  se characters wi
106a0 74 68 69 6e 20 74 68 65 20 41 53 43 49 49 20 72  thin the ASCII r
106b0 61 6e 67 65 20 28 55 54 46 20 63 6f 64 65 70 6f  ange (UTF codepo
106c0 69 6e 74 73 20 6c 65 73 73 20 0a 20 20 20 20 74  ints less .    t
106d0 68 61 6e 20 31 32 38 29 2c 20 61 72 65 20 74 72  han 128), are tr
106e0 61 6e 73 66 6f 72 6d 65 64 20 74 6f 20 74 68 65  ansformed to the
106f0 69 72 20 6c 6f 77 65 72 63 61 73 65 20 65 71 75  ir lowercase equ
10700 69 76 61 6c 65 6e 74 73 20 61 73 20 70 61 72 74  ivalents as part
10710 20 6f 66 20 74 68 65 0a 20 20 20 20 74 6f 6b 65   of the.    toke
10720 6e 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 73 73  nization process
10730 2e 20 54 68 75 73 2c 20 66 75 6c 6c 2d 74 65 78  . Thus, full-tex
10740 74 20 71 75 65 72 69 65 73 20 61 72 65 20 63 61  t queries are ca
10750 73 65 2d 69 6e 73 65 6e 73 69 74 69 76 65 20 77  se-insensitive w
10760 68 65 6e 0a 20 20 20 20 75 73 69 6e 67 20 74 68  hen.    using th
10770 65 20 73 69 6d 70 6c 65 20 74 6f 6b 65 6e 69 7a  e simple tokeniz
10780 65 72 2e 0a 3c 2f 75 6c 3e 0a 0a 3c 70 3e 0a 20  er..</ul>..<p>. 
10790 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68   For example, wh
107a0 65 6e 20 61 20 64 6f 63 75 6d 65 6e 74 20 63 6f  en a document co
107b0 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 65 78  ntaining the tex
107c0 74 20 22 52 69 67 68 74 20 6e 6f 77 2c 20 74 68  t "Right now, th
107d0 65 79 27 72 65 20 76 65 72 79 0a 20 20 66 72 75  ey're very.  fru
107e0 73 74 72 61 74 65 64 2e 22 2c 20 74 68 65 20 74  strated.", the t
107f0 65 72 6d 73 20 65 78 74 72 61 63 74 65 64 20 66  erms extracted f
10800 72 6f 6d 20 74 68 65 20 64 6f 63 75 6d 65 6e 74  rom the document
10810 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68   and added to th
10820 65 20 0a 20 20 66 75 6c 6c 2d 74 65 78 74 20 69  e .  full-text i
10830 6e 64 65 78 20 61 72 65 2c 20 69 6e 20 6f 72 64  ndex are, in ord
10840 65 72 2c 20 22 72 69 67 68 74 20 6e 6f 77 20 74  er, "right now t
10850 68 65 79 20 72 65 20 76 65 72 79 20 66 72 75 73  hey re very frus
10860 74 72 61 74 65 64 22 2e 20 53 75 63 68 0a 20 20  trated". Such.  
10870 61 20 64 6f 63 75 6d 65 6e 74 20 77 6f 75 6c 64  a document would
10880 20 6d 61 74 63 68 20 61 20 66 75 6c 6c 2d 74 65   match a full-te
10890 78 74 20 71 75 65 72 79 20 73 75 63 68 20 61 73  xt query such as
108a0 20 22 4d 41 54 43 48 20 27 46 72 75 73 74 72 61   "MATCH 'Frustra
108b0 74 65 64 27 22 2c 20 0a 20 20 61 73 20 74 68 65  ted'", .  as the
108c0 20 73 69 6d 70 6c 65 20 74 6f 6b 65 6e 69 7a 65   simple tokenize
108d0 72 20 74 72 61 6e 73 66 6f 72 6d 73 20 74 68 65  r transforms the
108e0 20 74 65 72 6d 20 69 6e 20 74 68 65 20 71 75 65   term in the que
108f0 72 79 20 74 6f 20 6c 6f 77 65 72 63 61 73 65 0a  ry to lowercase.
10900 20 20 62 65 66 6f 72 65 20 73 65 61 72 63 68 69    before searchi
10910 6e 67 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74  ng the full-text
10920 20 69 6e 64 65 78 2e 0a 0a 3c 70 3e 0a 20 20 41   index...<p>.  A
10930 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 22 73  s well as the "s
10940 69 6d 70 6c 65 22 20 74 6f 6b 65 6e 69 7a 65 72  imple" tokenizer
10950 2c 20 74 68 65 20 46 54 53 20 73 6f 75 72 63 65  , the FTS source
10960 20 63 6f 64 65 20 66 65 61 74 75 72 65 73 20 61   code features a
10970 20 74 6f 6b 65 6e 69 7a 65 72 20 0a 20 20 74 68   tokenizer .  th
10980 61 74 20 75 73 65 73 20 74 68 65 20 3c 61 20 68  at uses the <a h
10990 72 65 66 3d 22 68 74 74 70 3a 2f 2f 74 61 72 74  ref="http://tart
109a0 61 72 75 73 2e 6f 72 67 2f 7e 6d 61 72 74 69 6e  arus.org/~martin
109b0 2f 50 6f 72 74 65 72 53 74 65 6d 6d 65 72 2f 22  /PorterStemmer/"
109c0 3e 50 6f 72 74 65 72 20 0a 20 20 53 74 65 6d 6d  >Porter .  Stemm
109d0 69 6e 67 20 61 6c 67 6f 72 69 74 68 6d 3c 2f 61  ing algorithm</a
109e0 3e 2e 20 54 68 69 73 20 74 6f 6b 65 6e 69 7a 65  >. This tokenize
109f0 72 20 75 73 65 73 20 74 68 65 20 73 61 6d 65 20  r uses the same 
10a00 72 75 6c 65 73 20 74 6f 20 73 65 70 61 72 61 74  rules to separat
10a10 65 0a 20 20 74 68 65 20 69 6e 70 75 74 20 64 6f  e.  the input do
10a20 63 75 6d 65 6e 74 20 69 6e 74 6f 20 74 65 72 6d  cument into term
10a30 73 2c 20 62 75 74 20 61 73 20 77 65 6c 6c 20 61  s, but as well a
10a40 73 20 66 6f 6c 64 69 6e 67 20 61 6c 6c 20 74 65  s folding all te
10a50 72 6d 73 20 74 6f 20 6c 6f 77 65 72 0a 20 20 63  rms to lower.  c
10a60 61 73 65 20 69 74 20 75 73 65 73 20 74 68 65 20  ase it uses the 
10a70 50 6f 72 74 65 72 20 53 74 65 6d 6d 69 6e 67 20  Porter Stemming 
10a80 61 6c 67 6f 72 69 74 68 6d 20 74 6f 20 72 65 64  algorithm to red
10a90 75 63 65 20 72 65 6c 61 74 65 64 20 45 6e 67 6c  uce related Engl
10aa0 69 73 68 20 6c 61 6e 67 75 61 67 65 0a 20 20 77  ish language.  w
10ab0 6f 72 64 73 20 74 6f 20 61 20 63 6f 6d 6d 6f 6e  ords to a common
10ac0 20 72 6f 6f 74 2e 20 46 6f 72 20 65 78 61 6d 70   root. For examp
10ad0 6c 65 2c 20 75 73 69 6e 67 20 74 68 65 20 73 61  le, using the sa
10ae0 6d 65 20 69 6e 70 75 74 20 64 6f 63 75 6d 65 6e  me input documen
10af0 74 20 61 73 20 69 6e 20 74 68 65 0a 20 20 70 61  t as in the.  pa
10b00 72 61 67 72 61 70 68 20 61 62 6f 76 65 2c 20 74  ragraph above, t
10b10 68 65 20 70 6f 72 74 65 72 20 74 6f 6b 65 6e 69  he porter tokeni
10b20 7a 65 72 20 65 78 74 72 61 63 74 73 20 74 68 65  zer extracts the
10b30 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 6f 6b 65 6e   following token
10b40 73 3a 0a 20 20 22 72 69 67 68 74 20 6e 6f 77 20  s:.  "right now 
10b50 74 68 65 69 20 76 65 72 69 20 66 72 75 73 74 72  thei veri frustr
10b60 61 74 22 2e 20 45 76 65 6e 20 74 68 6f 75 67 68  at". Even though
10b70 20 73 6f 6d 65 20 6f 66 20 74 68 65 73 65 20 74   some of these t
10b80 65 72 6d 73 20 61 72 65 20 6e 6f 74 20 65 76 65  erms are not eve
10b90 6e 0a 20 20 45 6e 67 6c 69 73 68 20 77 6f 72 64  n.  English word
10ba0 73 2c 20 69 6e 20 73 6f 6d 65 20 63 61 73 65 73  s, in some cases
10bb0 20 75 73 69 6e 67 20 74 68 65 6d 20 74 6f 20 62   using them to b
10bc0 75 69 6c 64 20 74 68 65 20 66 75 6c 6c 2d 74 65  uild the full-te
10bd0 78 74 20 69 6e 64 65 78 20 69 73 20 6d 6f 72 65  xt index is more
10be0 0a 20 20 75 73 65 66 75 6c 20 74 68 61 6e 20 74  .  useful than t
10bf0 68 65 20 6d 6f 72 65 20 69 6e 74 65 6c 6c 69 67  he more intellig
10c00 69 62 6c 65 20 6f 75 74 70 75 74 20 70 72 6f 64  ible output prod
10c10 75 63 65 64 20 62 79 20 74 68 65 20 73 69 6d 70  uced by the simp
10c20 6c 65 20 74 6f 6b 65 6e 69 7a 65 72 2e 0a 20 20  le tokenizer..  
10c30 55 73 69 6e 67 20 74 68 65 20 70 6f 72 74 65 72  Using the porter
10c40 20 74 6f 6b 65 6e 69 7a 65 72 2c 20 74 68 65 20   tokenizer, the 
10c50 64 6f 63 75 6d 65 6e 74 20 6e 6f 74 20 6f 6e 6c  document not onl
10c60 79 20 6d 61 74 63 68 65 73 20 66 75 6c 6c 2d 74  y matches full-t
10c70 65 78 74 20 71 75 65 72 69 65 73 0a 20 20 73 75  ext queries.  su
10c80 63 68 20 61 73 20 22 4d 41 54 43 48 20 27 46 72  ch as "MATCH 'Fr
10c90 75 73 74 72 61 74 65 64 27 22 2c 20 62 75 74 20  ustrated'", but 
10ca0 61 6c 73 6f 20 71 75 65 72 69 65 73 20 73 75 63  also queries suc
10cb0 68 20 61 73 20 22 4d 41 54 43 48 20 27 46 72 75  h as "MATCH 'Fru
10cc0 73 74 72 61 74 69 6f 6e 27 22 2c 0a 20 20 61 73  stration'",.  as
10cd0 20 74 68 65 20 74 65 72 6d 20 22 46 72 75 73 74   the term "Frust
10ce0 72 61 74 69 6f 6e 22 20 69 73 20 72 65 64 75 63  ration" is reduc
10cf0 65 64 20 62 79 20 74 68 65 20 50 6f 72 74 65 72  ed by the Porter
10d00 20 73 74 65 6d 6d 65 72 20 61 6c 67 6f 72 69 74   stemmer algorit
10d10 68 6d 20 74 6f 20 0a 20 20 22 66 72 75 73 74 72  hm to .  "frustr
10d20 61 74 22 20 2d 20 6a 75 73 74 20 61 73 20 22 46  at" - just as "F
10d30 72 75 73 74 72 61 74 65 64 22 20 69 73 2e 20 53  rustrated" is. S
10d40 6f 2c 20 77 68 65 6e 20 75 73 69 6e 67 20 74 68  o, when using th
10d50 65 20 70 6f 72 74 65 72 20 74 6f 6b 65 6e 69 7a  e porter tokeniz
10d60 65 72 2c 0a 20 20 46 54 53 20 69 73 20 61 62 6c  er,.  FTS is abl
10d70 65 20 74 6f 20 66 69 6e 64 20 6e 6f 74 20 6a 75  e to find not ju
10d80 73 74 20 65 78 61 63 74 20 6d 61 74 63 68 65 73  st exact matches
10d90 20 66 6f 72 20 71 75 65 72 69 65 64 20 74 65 72   for queried ter
10da0 6d 73 2c 20 62 75 74 20 6d 61 74 63 68 65 73 0a  ms, but matches.
10db0 20 20 61 67 61 69 6e 73 74 20 73 69 6d 69 6c 61    against simila
10dc0 72 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61  r English langua
10dd0 67 65 20 74 65 72 6d 73 2e 20 46 6f 72 20 6d 6f  ge terms. For mo
10de0 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  re information o
10df0 6e 20 74 68 65 20 0a 20 20 50 6f 72 74 65 72 20  n the .  Porter 
10e00 53 74 65 6d 6d 65 72 20 61 6c 67 6f 72 69 74 68  Stemmer algorith
10e10 6d 2c 20 70 6c 65 61 73 65 20 72 65 66 65 72 20  m, please refer 
10e20 74 6f 20 74 68 65 20 70 61 67 65 20 6c 69 6e 6b  to the page link
10e30 65 64 20 61 62 6f 76 65 2e 0a 0a 3c 70 3e 0a 20  ed above...<p>. 
10e40 20 45 78 61 6d 70 6c 65 20 69 6c 6c 75 73 74 72   Example illustr
10e50 61 74 69 6e 67 20 74 68 65 20 64 69 66 66 65 72  ating the differ
10e60 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 65  ence between the
10e70 20 22 73 69 6d 70 6c 65 22 20 61 6e 64 20 22 70   "simple" and "p
10e80 6f 72 74 65 72 22 0a 20 20 74 6f 6b 65 6e 69 7a  orter".  tokeniz
10e90 65 72 73 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b  ers:..<codeblock
10ea0 3e 0a 20 20 3c 69 3e 2d 2d 20 43 72 65 61 74 65  >.  <i>-- Create
10eb0 20 61 20 74 61 62 6c 65 20 75 73 69 6e 67 20 74   a table using t
10ec0 68 65 20 73 69 6d 70 6c 65 20 74 6f 6b 65 6e 69  he simple tokeni
10ed0 7a 65 72 2e 20 49 6e 73 65 72 74 20 61 20 64 6f  zer. Insert a do
10ee0 63 75 6d 65 6e 74 20 69 6e 74 6f 20 69 74 2e 3c  cument into it.<
10ef0 2f 69 3e 0a 20 20 43 52 45 41 54 45 20 56 49 52  /i>.  CREATE VIR
10f00 54 55 41 4c 20 54 41 42 4c 45 20 73 69 6d 70 6c  TUAL TABLE simpl
10f10 65 20 55 53 49 4e 47 20 66 74 73 33 28 74 6f 6b  e USING fts3(tok
10f20 65 6e 69 7a 65 3d 73 69 6d 70 6c 65 29 3b 0a 20  enize=simple);. 
10f30 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 73 69 6d   INSERT INTO sim
10f40 70 6c 65 20 56 41 4c 55 45 53 28 27 52 69 67 68  ple VALUES('Righ
10f50 74 20 6e 6f 77 20 74 68 65 79 27 27 72 65 20 76  t now they''re v
10f60 65 72 79 20 66 72 75 73 74 72 61 74 65 64 27 29  ery frustrated')
10f70 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68 65 20 66  ;..  <i>-- The f
10f80 69 72 73 74 20 6f 66 20 74 68 65 20 66 6f 6c 6c  irst of the foll
10f90 6f 77 69 6e 67 20 74 77 6f 20 71 75 65 72 69 65  owing two querie
10fa0 73 20 6d 61 74 63 68 65 73 20 74 68 65 20 64 6f  s matches the do
10fb0 63 75 6d 65 6e 74 20 73 74 6f 72 65 64 20 69 6e  cument stored in
10fc0 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 61 62  </i>.  <i>-- tab
10fd0 6c 65 20 22 73 69 6d 70 6c 65 22 2e 20 54 68 65  le "simple". The
10fe0 20 73 65 63 6f 6e 64 20 64 6f 65 73 20 6e 6f 74   second does not
10ff0 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a  .</i>.  SELECT *
11000 20 46 52 4f 4d 20 73 69 6d 70 6c 65 20 57 48 45   FROM simple WHE
11010 52 45 20 73 69 6d 70 6c 65 20 4d 41 54 43 48 20  RE simple MATCH 
11020 27 46 72 75 73 74 72 61 74 65 64 27 3b 0a 20 20  'Frustrated';.  
11030 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 69  SELECT * FROM si
11040 6d 70 6c 65 20 57 48 45 52 45 20 73 69 6d 70 6c  mple WHERE simpl
11050 65 20 4d 41 54 43 48 20 27 46 72 75 73 74 72 61  e MATCH 'Frustra
11060 74 69 6f 6e 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20  tion';..  <i>-- 
11070 43 72 65 61 74 65 20 61 20 74 61 62 6c 65 20 75  Create a table u
11080 73 69 6e 67 20 74 68 65 20 70 6f 72 74 65 72 20  sing the porter 
11090 74 6f 6b 65 6e 69 7a 65 72 2e 20 49 6e 73 65 72  tokenizer. Inser
110a0 74 20 74 68 65 20 73 61 6d 65 20 64 6f 63 75 6d  t the same docum
110b0 65 6e 74 20 69 6e 74 6f 20 69 74 3c 2f 69 3e 0a  ent into it</i>.
110c0 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c    CREATE VIRTUAL
110d0 20 54 41 42 4c 45 20 70 6f 72 74 65 72 20 55 53   TABLE porter US
110e0 49 4e 47 20 66 74 73 33 28 74 6f 6b 65 6e 69 7a  ING fts3(tokeniz
110f0 65 3d 70 6f 72 74 65 72 29 3b 0a 20 20 49 4e 53  e=porter);.  INS
11100 45 52 54 20 49 4e 54 4f 20 70 6f 72 74 65 72 20  ERT INTO porter 
11110 56 41 4c 55 45 53 28 27 52 69 67 68 74 20 6e 6f  VALUES('Right no
11120 77 20 74 68 65 79 27 27 72 65 20 76 65 72 79 20  w they''re very 
11130 66 72 75 73 74 72 61 74 65 64 27 29 3b 0a 0a 20  frustrated');.. 
11140 20 3c 69 3e 2d 2d 20 42 6f 74 68 20 6f 66 20 74   <i>-- Both of t
11150 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65  he following que
11160 72 69 65 73 20 6d 61 74 63 68 20 74 68 65 20 64  ries match the d
11170 6f 63 75 6d 65 6e 74 20 73 74 6f 72 65 64 20 69  ocument stored i
11180 6e 20 74 61 62 6c 65 20 22 70 6f 72 74 65 72 22  n table "porter"
11190 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a  .</i>.  SELECT *
111a0 20 46 52 4f 4d 20 70 6f 72 74 65 72 20 57 48 45   FROM porter WHE
111b0 52 45 20 70 6f 72 74 65 72 20 4d 41 54 43 48 20  RE porter MATCH 
111c0 27 46 72 75 73 74 72 61 74 65 64 27 3b 0a 20 20  'Frustrated';.  
111d0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 70 6f  SELECT * FROM po
111e0 72 74 65 72 20 57 48 45 52 45 20 70 6f 72 74 65  rter WHERE porte
111f0 72 20 4d 41 54 43 48 20 27 46 72 75 73 74 72 61  r MATCH 'Frustra
11200 74 69 6f 6e 27 3b 0a 3c 2f 63 6f 64 65 62 6c 6f  tion';.</codeblo
11210 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 49 66 20 74 68  ck>..<p>.  If th
11220 69 73 20 65 78 74 65 6e 73 69 6f 6e 20 69 73 20  is extension is 
11230 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68  compiled with th
11240 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
11250 49 43 55 20 70 72 65 2d 70 72 6f 63 65 73 73 6f  ICU pre-processo
11260 72 0a 20 20 73 79 6d 62 6f 6c 20 64 65 66 69 6e  r.  symbol defin
11270 65 64 2c 20 74 68 65 6e 20 74 68 65 72 65 20 65  ed, then there e
11280 78 69 73 74 73 20 61 20 62 75 69 6c 74 2d 69 6e  xists a built-in
11290 20 74 6f 6b 65 6e 69 7a 65 72 20 6e 61 6d 65 64   tokenizer named
112a0 20 22 69 63 75 22 0a 20 20 69 6d 70 6c 65 6d 65   "icu".  impleme
112b0 6e 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 49  nted using the I
112c0 43 55 20 6c 69 62 72 61 72 79 2e 20 54 68 65 20  CU library. The 
112d0 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70  first argument p
112e0 61 73 73 65 64 20 74 6f 20 74 68 65 0a 20 20 78  assed to the.  x
112f0 43 72 65 61 74 65 28 29 20 6d 65 74 68 6f 64 20  Create() method 
11300 28 73 65 65 20 66 74 73 33 5f 74 6f 6b 65 6e 69  (see fts3_tokeni
11310 7a 65 72 2e 68 29 20 6f 66 20 74 68 69 73 20 74  zer.h) of this t
11320 6f 6b 65 6e 69 7a 65 72 20 6d 61 79 20 62 65 0a  okenizer may be.
11330 20 20 61 6e 20 49 43 55 20 6c 6f 63 61 6c 65 20    an ICU locale 
11340 69 64 65 6e 74 69 66 69 65 72 2e 20 46 6f 72 20  identifier. For 
11350 65 78 61 6d 70 6c 65 20 22 74 72 5f 54 52 22 20  example "tr_TR" 
11360 66 6f 72 20 54 75 72 6b 69 73 68 20 61 73 20 75  for Turkish as u
11370 73 65 64 0a 20 20 69 6e 20 54 75 72 6b 65 79 2c  sed.  in Turkey,
11380 20 6f 72 20 22 65 6e 5f 41 55 22 20 66 6f 72 20   or "en_AU" for 
11390 45 6e 67 6c 69 73 68 20 61 73 20 75 73 65 64 20  English as used 
113a0 69 6e 20 41 75 73 74 72 61 6c 69 61 2e 20 46 6f  in Australia. Fo
113b0 72 20 65 78 61 6d 70 6c 65 3a 0a 0a 3c 63 6f 64  r example:..<cod
113c0 65 62 6c 6f 63 6b 3e 0a 20 20 20 20 43 52 45 41  eblock>.    CREA
113d0 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
113e0 20 74 68 61 69 5f 74 65 78 74 20 55 53 49 4e 47   thai_text USING
113f0 20 66 74 73 33 28 74 65 78 74 2c 20 74 6f 6b 65   fts3(text, toke
11400 6e 69 7a 65 3d 69 63 75 20 74 68 5f 54 48 29 0a  nize=icu th_TH).
11410 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70  </codeblock>..<p
11420 3e 0a 20 20 54 68 65 20 49 43 55 20 74 6f 6b 65  >.  The ICU toke
11430 6e 69 7a 65 72 20 69 6d 70 6c 65 6d 65 6e 74 61  nizer implementa
11440 74 69 6f 6e 20 69 73 20 76 65 72 79 20 73 69 6d  tion is very sim
11450 70 6c 65 2e 20 49 74 20 73 70 6c 69 74 73 20 74  ple. It splits t
11460 68 65 20 69 6e 70 75 74 0a 20 20 74 65 78 74 20  he input.  text 
11470 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
11480 20 49 43 55 20 72 75 6c 65 73 20 66 6f 72 20 66   ICU rules for f
11490 69 6e 64 69 6e 67 20 77 6f 72 64 20 62 6f 75 6e  inding word boun
114a0 64 61 72 69 65 73 20 61 6e 64 20 64 69 73 63 61  daries and disca
114b0 72 64 73 0a 20 20 61 6e 79 20 74 6f 6b 65 6e 73  rds.  any tokens
114c0 20 74 68 61 74 20 63 6f 6e 73 69 73 74 20 65 6e   that consist en
114d0 74 69 72 65 6c 79 20 6f 66 20 77 68 69 74 65 2d  tirely of white-
114e0 73 70 61 63 65 2e 20 54 68 69 73 20 6d 61 79 20  space. This may 
114f0 62 65 20 73 75 69 74 61 62 6c 65 0a 20 20 66 6f  be suitable.  fo
11500 72 20 73 6f 6d 65 20 61 70 70 6c 69 63 61 74 69  r some applicati
11510 6f 6e 73 20 69 6e 20 73 6f 6d 65 20 6c 6f 63 61  ons in some loca
11520 6c 65 73 2c 20 62 75 74 20 6e 6f 74 20 61 6c 6c  les, but not all
11530 2e 20 49 66 20 6d 6f 72 65 20 63 6f 6d 70 6c 65  . If more comple
11540 78 0a 20 20 70 72 6f 63 65 73 73 69 6e 67 20 69  x.  processing i
11550 73 20 72 65 71 75 69 72 65 64 2c 20 66 6f 72 20  s required, for 
11560 65 78 61 6d 70 6c 65 20 74 6f 20 69 6d 70 6c 65  example to imple
11570 6d 65 6e 74 20 73 74 65 6d 6d 69 6e 67 20 6f 72  ment stemming or
11580 0a 20 20 64 69 73 63 61 72 64 20 70 75 6e 63 74  .  discard punct
11590 75 61 74 69 6f 6e 2c 20 74 68 69 73 20 63 61 6e  uation, this can
115a0 20 62 65 20 64 6f 6e 65 20 62 79 20 63 72 65 61   be done by crea
115b0 74 69 6e 67 20 61 20 74 6f 6b 65 6e 69 7a 65 72  ting a tokenizer
115c0 0a 20 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  .  implementatio
115d0 6e 20 74 68 61 74 20 75 73 65 73 20 74 68 65 20  n that uses the 
115e0 49 43 55 20 74 6f 6b 65 6e 69 7a 65 72 20 61 73  ICU tokenizer as
115f0 20 70 61 72 74 20 6f 66 20 69 74 73 20 69 6d 70   part of its imp
11600 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 0a 3c 68  lementation...<h
11610 32 3e 43 75 73 74 6f 6d 20 28 55 73 65 72 20 49  2>Custom (User I
11620 6d 70 6c 65 6d 65 6e 74 65 64 29 20 54 6f 6b 65  mplemented) Toke
11630 6e 69 7a 65 72 73 3c 2f 68 32 3e 0a 0a 3c 70 3e  nizers</h2>..<p>
11640 0a 20 20 41 73 20 77 65 6c 6c 20 61 73 20 74 68  .  As well as th
11650 65 20 62 75 69 6c 74 2d 69 6e 20 22 73 69 6d 70  e built-in "simp
11660 6c 65 22 2c 20 22 70 6f 72 74 65 72 22 20 61 6e  le", "porter" an
11670 64 20 28 70 6f 73 73 69 62 6c 79 29 20 22 69 63  d (possibly) "ic
11680 75 22 20 74 6f 6b 65 6e 69 7a 65 72 73 2c 0a 20  u" tokenizers,. 
11690 20 46 54 53 20 65 78 70 6f 72 74 73 20 61 6e 20   FTS exports an 
116a0 69 6e 74 65 72 66 61 63 65 20 74 68 61 74 20 61  interface that a
116b0 6c 6c 6f 77 73 20 75 73 65 72 73 20 74 6f 20 69  llows users to i
116c0 6d 70 6c 65 6d 65 6e 74 20 63 75 73 74 6f 6d 20  mplement custom 
116d0 74 6f 6b 65 6e 69 7a 65 72 73 0a 20 20 75 73 69  tokenizers.  usi
116e0 6e 67 20 43 2e 20 54 68 65 20 69 6e 74 65 72 66  ng C. The interf
116f0 61 63 65 20 75 73 65 64 20 74 6f 20 63 72 65 61  ace used to crea
11700 74 65 20 61 20 6e 65 77 20 74 6f 6b 65 6e 69 7a  te a new tokeniz
11710 65 72 20 69 73 20 64 65 66 69 6e 65 64 20 61 6e  er is defined an
11720 64 20 0a 20 20 64 65 73 63 72 69 62 65 64 20 69  d .  described i
11730 6e 20 74 68 65 20 66 74 73 33 5f 74 6f 6b 65 6e  n the fts3_token
11740 69 7a 65 72 2e 68 20 73 6f 75 72 63 65 20 66 69  izer.h source fi
11750 6c 65 2e 0a 0a 3c 70 3e 0a 20 20 52 65 67 69 73  le...<p>.  Regis
11760 74 65 72 69 6e 67 20 61 20 6e 65 77 20 46 54 53  tering a new FTS
11770 20 74 6f 6b 65 6e 69 7a 65 72 20 69 73 20 73 69   tokenizer is si
11780 6d 69 6c 61 72 20 74 6f 20 72 65 67 69 73 74 65  milar to registe
11790 72 69 6e 67 20 61 20 6e 65 77 0a 20 20 76 69 72  ring a new.  vir
117a0 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c  tual table modul
117b0 65 20 77 69 74 68 20 53 51 4c 69 74 65 2e 20 54  e with SQLite. T
117c0 68 65 20 75 73 65 72 20 70 61 73 73 65 73 20 61  he user passes a
117d0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 0a 20 20   pointer to a.  
117e0 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
117f0 6e 69 6e 67 20 70 6f 69 6e 74 65 72 73 20 74 6f  ning pointers to
11800 20 76 61 72 69 6f 75 73 20 63 61 6c 6c 62 61 63   various callbac
11810 6b 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74  k functions that
11820 0a 20 20 6d 61 6b 65 20 75 70 20 74 68 65 20 69  .  make up the i
11830 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
11840 20 74 68 65 20 6e 65 77 20 74 6f 6b 65 6e 69 7a   the new tokeniz
11850 65 72 20 74 79 70 65 2e 20 46 6f 72 20 74 6f 6b  er type. For tok
11860 65 6e 69 7a 65 72 73 2c 0a 20 20 74 68 65 20 73  enizers,.  the s
11870 74 72 75 63 74 75 72 65 20 28 64 65 66 69 6e 65  tructure (define
11880 64 20 69 6e 20 66 74 73 33 5f 74 6f 6b 65 6e 69  d in fts3_tokeni
11890 7a 65 72 2e 68 29 20 69 73 20 63 61 6c 6c 65 64  zer.h) is called
118a0 0a 20 20 22 73 71 6c 69 74 65 33 5f 74 6f 6b 65  .  "sqlite3_toke
118b0 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65 22 2e 0a 0a  nizer_module"...
118c0 3c 70 3e 0a 20 20 46 54 53 20 64 6f 65 73 20 6e  <p>.  FTS does n
118d0 6f 74 20 65 78 70 6f 73 65 20 61 20 43 2d 66 75  ot expose a C-fu
118e0 6e 63 74 69 6f 6e 20 74 68 61 74 20 75 73 65 72  nction that user
118f0 73 20 63 61 6c 6c 20 74 6f 20 72 65 67 69 73 74  s call to regist
11900 65 72 20 6e 65 77 0a 20 20 74 6f 6b 65 6e 69 7a  er new.  tokeniz
11910 65 72 20 74 79 70 65 73 20 77 69 74 68 20 61 20  er types with a 
11920 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e  database handle.
11930 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 70 6f   Instead, the po
11940 69 6e 74 65 72 20 6d 75 73 74 0a 20 20 62 65 20  inter must.  be 
11950 65 6e 63 6f 64 65 64 20 61 73 20 61 6e 20 53 51  encoded as an SQ
11960 4c 20 62 6c 6f 62 20 76 61 6c 75 65 20 61 6e 64  L blob value and
11970 20 70 61 73 73 65 64 20 74 6f 20 46 54 53 20 74   passed to FTS t
11980 68 72 6f 75 67 68 20 74 68 65 20 53 51 4c 0a 20  hrough the SQL. 
11990 20 65 6e 67 69 6e 65 20 62 79 20 65 76 61 6c 75   engine by evalu
119a0 61 74 69 6e 67 20 61 20 73 70 65 63 69 61 6c 20  ating a special 
119b0 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 2c  scalar function,
119c0 20 22 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72   "fts3_tokenizer
119d0 28 29 22 2e 0a 20 20 54 68 65 20 66 74 73 33 5f  ()"..  The fts3_
119e0 74 6f 6b 65 6e 69 7a 65 72 28 29 20 66 75 6e 63  tokenizer() func
119f0 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c  tion may be call
11a00 65 64 20 77 69 74 68 20 6f 6e 65 20 6f 72 20 74  ed with one or t
11a10 77 6f 20 61 72 67 75 6d 65 6e 74 73 2c 0a 20 20  wo arguments,.  
11a20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 0a 3c 63 6f  as follows:..<co
11a30 64 65 62 6c 6f 63 6b 3e 0a 20 20 20 20 53 45 4c  deblock>.    SEL
11a40 45 43 54 20 66 74 73 33 5f 74 6f 6b 65 6e 69 7a  ECT fts3_tokeniz
11a50 65 72 28 26 6c 74 3b 74 6f 6b 65 6e 69 7a 65 72  er(&lt;tokenizer
11a60 2d 6e 61 6d 65 26 67 74 3b 29 3b 0a 20 20 20 20  -name&gt;);.    
11a70 53 45 4c 45 43 54 20 66 74 73 33 5f 74 6f 6b 65  SELECT fts3_toke
11a80 6e 69 7a 65 72 28 26 6c 74 3b 74 6f 6b 65 6e 69  nizer(&lt;tokeni
11a90 7a 65 72 2d 6e 61 6d 65 26 67 74 3b 2c 20 26 6c  zer-name&gt;, &l
11aa0 74 3b 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69  t;sqlite3_tokeni
11ab0 7a 65 72 5f 6d 6f 64 75 6c 65 20 70 74 72 26 67  zer_module ptr&g
11ac0 74 3b 29 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b  t;);.</codeblock
11ad0 3e 0a 0a 3c 70 3e 0a 20 20 57 68 65 72 65 20 3c  >..<p>.  Where <
11ae0 74 6f 6b 65 6e 69 7a 65 72 2d 6e 61 6d 65 3e 20  tokenizer-name> 
11af0 69 73 20 61 20 73 74 72 69 6e 67 20 69 64 65 6e  is a string iden
11b00 74 69 66 79 69 6e 67 20 74 68 65 20 74 6f 6b 65  tifying the toke
11b10 6e 69 7a 65 72 20 61 6e 64 0a 20 20 3c 73 71 6c  nizer and.  <sql
11b20 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d  ite3_tokenizer_m
11b30 6f 64 75 6c 65 20 70 74 72 3e 20 69 73 20 61 20  odule ptr> is a 
11b40 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71  pointer to an sq
11b50 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f  lite3_tokenizer_
11b60 6d 6f 64 75 6c 65 0a 20 20 73 74 72 75 63 74 75  module.  structu
11b70 72 65 20 65 6e 63 6f 64 65 64 20 61 73 20 61 6e  re encoded as an
11b80 20 53 51 4c 20 62 6c 6f 62 2e 20 49 66 20 74 68   SQL blob. If th
11b90 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
11ba0 74 20 69 73 20 70 72 65 73 65 6e 74 2c 0a 20 20  t is present,.  
11bb0 69 74 20 69 73 20 72 65 67 69 73 74 65 72 65 64  it is registered
11bc0 20 61 73 20 74 6f 6b 65 6e 69 7a 65 72 20 3c 74   as tokenizer <t
11bd0 6f 6b 65 6e 69 7a 65 72 2d 6e 61 6d 65 3e 20 61  okenizer-name> a
11be0 6e 64 20 61 20 63 6f 70 79 20 6f 66 20 69 74 0a  nd a copy of it.
11bf0 20 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6f    returned. If o
11c00 6e 6c 79 20 6f 6e 65 20 61 72 67 75 6d 65 6e 74  nly one argument
11c10 20 69 73 20 70 61 73 73 65 64 2c 20 61 20 70 6f   is passed, a po
11c20 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74 6f 6b  inter to the tok
11c30 65 6e 69 7a 65 72 0a 20 20 69 6d 70 6c 65 6d 65  enizer.  impleme
11c40 6e 74 61 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c  ntation currentl
11c50 79 20 72 65 67 69 73 74 65 72 65 64 20 61 73 20  y registered as 
11c60 3c 74 6f 6b 65 6e 69 7a 65 72 2d 6e 61 6d 65 3e  <tokenizer-name>
11c70 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 20 20   is returned,.  
11c80 65 6e 63 6f 64 65 64 20 61 73 20 61 20 62 6c 6f  encoded as a blo
11c90 62 2e 20 4f 72 2c 20 69 66 20 6e 6f 20 73 75 63  b. Or, if no suc
11ca0 68 20 74 6f 6b 65 6e 69 7a 65 72 20 65 78 69 73  h tokenizer exis
11cb0 74 73 2c 20 61 6e 20 53 51 4c 20 65 78 63 65 70  ts, an SQL excep
11cc0 74 69 6f 6e 0a 20 20 28 65 72 72 6f 72 29 20 69  tion.  (error) i
11cd0 73 20 72 61 69 73 65 64 2e 0a 0a 3c 70 3e 0a 20  s raised...<p>. 
11ce0 20 3c 62 3e 53 45 43 55 52 49 54 59 20 57 41 52   <b>SECURITY WAR
11cf0 4e 49 4e 47 3c 2f 62 3e 3a 20 49 66 20 74 68 65  NING</b>: If the
11d00 20 66 74 73 33 2f 34 20 65 78 74 65 6e 73 69 6f   fts3/4 extensio
11d10 6e 20 69 73 20 75 73 65 64 20 69 6e 20 61 6e 20  n is used in an 
11d20 65 6e 76 69 72 6f 6e 6d 65 6e 74 0a 20 20 77 68  environment.  wh
11d30 65 72 65 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20  ere potentially 
11d40 6d 61 6c 69 63 69 6f 75 73 20 75 73 65 72 73 20  malicious users 
11d50 6d 61 79 20 65 78 65 63 75 74 65 20 61 72 62 69  may execute arbi
11d60 74 72 61 72 79 20 53 51 4c 2c 20 74 68 65 79 20  trary SQL, they 
11d70 73 68 6f 75 6c 64 20 0a 20 20 62 65 20 70 72 65  should .  be pre
11d80 76 65 6e 74 65 64 20 66 72 6f 6d 20 69 6e 76 6f  vented from invo
11d90 6b 69 6e 67 20 74 68 65 20 66 74 73 33 5f 74 6f  king the fts3_to
11da0 6b 65 6e 69 7a 65 72 28 29 20 66 75 6e 63 74 69  kenizer() functi
11db0 6f 6e 2c 20 70 6f 73 73 69 62 6c 79 20 75 73 69  on, possibly usi
11dc0 6e 67 20 0a 20 20 74 68 65 20 5b 73 71 6c 69 74  ng .  the [sqlit
11dd0 65 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65  e3_set_authorize
11de0 72 28 29 7c 61 75 74 68 6f 72 69 73 61 74 69 6f  r()|authorisatio
11df0 6e 20 63 61 6c 6c 62 61 63 6b 5d 2e 0a 0a 3c 70  n callback]...<p
11e00 3e 0a 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  >.  The followin
11e10 67 20 62 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73  g block contains
11e20 20 61 6e 20 65 78 61 6d 70 6c 65 20 6f 66 20 63   an example of c
11e30 61 6c 6c 69 6e 67 20 74 68 65 20 66 74 73 33 5f  alling the fts3_
11e40 74 6f 6b 65 6e 69 7a 65 72 28 29 0a 20 20 66 75  tokenizer().  fu
11e50 6e 63 74 69 6f 6e 20 66 72 6f 6d 20 43 20 63 6f  nction from C co
11e60 64 65 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e  de:..<codeblock>
11e70 0a 20 20 3c 69 3e 2f 2a 0a 20 20 2a 2a 20 52 65  .  <i>/*.  ** Re
11e80 67 69 73 74 65 72 20 61 20 74 6f 6b 65 6e 69 7a  gister a tokeniz
11e90 65 72 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  er implementatio
11ea0 6e 20 77 69 74 68 20 46 54 53 33 20 6f 72 20 46  n with FTS3 or F
11eb0 54 53 34 2e 0a 20 20 2a 2f 3c 2f 69 3e 0a 20 20  TS4..  */</i>.  
11ec0 69 6e 74 20 72 65 67 69 73 74 65 72 54 6f 6b 65  int registerToke
11ed0 6e 69 7a 65 72 28 0a 20 20 20 20 73 71 6c 69 74  nizer(.    sqlit
11ee0 65 33 20 2a 64 62 2c 0a 20 20 20 20 63 68 61 72  e3 *db,.    char
11ef0 20 2a 7a 4e 61 6d 65 2c 0a 20 20 20 20 63 6f 6e   *zName,.    con
11f00 73 74 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e  st sqlite3_token
11f10 69 7a 65 72 5f 6d 6f 64 75 6c 65 20 2a 70 0a 20  izer_module *p. 
11f20 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
11f30 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
11f40 20 2a 70 53 74 6d 74 3b 0a 20 20 20 20 63 6f 6e   *pStmt;.    con
11f50 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20  st char *zSql = 
11f60 22 53 45 4c 45 43 54 20 66 74 73 33 5f 74 6f 6b  "SELECT fts3_tok
11f70 65 6e 69 7a 65 72 28 3f 2c 20 3f 29 22 3b 0a 0a  enizer(?, ?)";..
11f80 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11f90 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20  _prepare_v2(db, 
11fa0 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74  zSql, -1, &pStmt
11fb0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
11fc0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
11fd0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
11fe0 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74      }..    sqlit
11ff0 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74  e3_bind_text(pSt
12000 6d 74 2c 20 31 2c 20 7a 4e 61 6d 65 2c 20 2d 31  mt, 1, zName, -1
12010 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
12020 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ;.    sqlite3_bi
12030 6e 64 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 32  nd_blob(pStmt, 2
12040 2c 20 26 70 2c 20 73 69 7a 65 6f 66 28 70 29 2c  , &p, sizeof(p),
12050 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
12060 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65  .    sqlite3_ste
12070 70 28 70 53 74 6d 74 29 3b 0a 0a 20 20 20 20 72  p(pStmt);..    r
12080 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 66 69  eturn sqlite3_fi
12090 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
120a0 20 7d 0a 0a 20 20 3c 69 3e 2f 2a 0a 20 20 2a 2a   }..  <i>/*.  **
120b0 20 51 75 65 72 79 20 46 54 53 20 66 6f 72 20 74   Query FTS for t
120c0 68 65 20 74 6f 6b 65 6e 69 7a 65 72 20 69 6d 70  he tokenizer imp
120d0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6e 61 6d 65  lementation name
120e0 64 20 7a 4e 61 6d 65 2e 0a 20 20 2a 2f 3c 2f 69  d zName..  */</i
120f0 3e 0a 20 20 69 6e 74 20 71 75 65 72 79 54 6f 6b  >.  int queryTok
12100 65 6e 69 7a 65 72 28 0a 20 20 20 20 73 71 6c 69  enizer(.    sqli
12110 74 65 33 20 2a 64 62 2c 0a 20 20 20 20 63 68 61  te3 *db,.    cha
12120 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 20 20 63 6f  r *zName,.    co
12130 6e 73 74 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65  nst sqlite3_toke
12140 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65 20 2a 2a 70  nizer_module **p
12150 70 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  p.  ){.    int r
12160 63 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  c;.    sqlite3_s
12170 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 20 20  tmt *pStmt;.    
12180 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
12190 20 3d 20 22 53 45 4c 45 43 54 20 66 74 73 33 5f   = "SELECT fts3_
121a0 74 6f 6b 65 6e 69 7a 65 72 28 3f 29 22 3b 0a 0a  tokenizer(?)";..
121b0 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 20      *pp = 0;.   
121c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
121d0 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71  epare_v2(db, zSq
121e0 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30  l, -1, &pStmt, 0
121f0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
12200 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12210 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
12220 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   }..    sqlite3_
12230 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c  bind_text(pStmt,
12240 20 31 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53   1, zName, -1, S
12250 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
12260 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f     if( SQLITE_RO
12270 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
12280 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20  pStmt) ){.      
12290 69 66 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  if( sqlite3_colu
122a0 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c 20 30  mn_type(pStmt, 0
122b0 29 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29  )==SQLITE_BLOB )
122c0 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
122d0 28 70 70 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  (pp, sqlite3_col
122e0 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20  umn_blob(pStmt, 
122f0 30 29 2c 20 73 69 7a 65 6f 66 28 2a 70 70 29 29  0), sizeof(*pp))
12300 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
12310 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
12320 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
12330 6d 74 29 3b 0a 20 20 7d 0a 3c 2f 63 6f 64 65 62  mt);.  }.</codeb
12340 6c 6f 63 6b 3e 0a 0a 20 20 0a 3c 68 31 20 74 61  lock>..  .<h1 ta
12350 67 73 3d 22 73 65 67 6d 65 6e 74 20 62 74 72 65  gs="segment btre
12360 65 22 3e 44 61 74 61 20 53 74 72 75 63 74 75 72  e">Data Structur
12370 65 73 3c 2f 68 31 3e 0a 0a 3c 70 3e 0a 20 20 54  es</h1>..<p>.  T
12380 68 69 73 20 73 65 63 74 69 6f 6e 20 64 65 73 63  his section desc
12390 72 69 62 65 73 20 61 74 20 61 20 68 69 67 68 2d  ribes at a high-
123a0 6c 65 76 65 6c 20 74 68 65 20 77 61 79 20 74 68  level the way th
123b0 65 20 46 54 53 20 6d 6f 64 75 6c 65 20 73 74 6f  e FTS module sto
123c0 72 65 73 20 69 74 73 0a 20 20 69 6e 64 65 78 20  res its.  index 
123d0 61 6e 64 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74  and content in t
123e0 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 74 20  he database. It 
123f0 69 73 20 3c 62 3e 6e 6f 74 20 6e 65 63 65 73 73  is <b>not necess
12400 61 72 79 20 74 6f 20 72 65 61 64 20 6f 72 20 0a  ary to read or .
12410 20 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65    understand the
12420 20 6d 61 74 65 72 69 61 6c 20 69 6e 20 74 68 69   material in thi
12430 73 20 73 65 63 74 69 6f 6e 20 69 6e 20 6f 72 64  s section in ord
12440 65 72 20 74 6f 20 75 73 65 20 46 54 53 3c 2f 62  er to use FTS</b
12450 3e 20 69 6e 20 61 6e 20 0a 20 20 61 70 70 6c 69  > in an .  appli
12460 63 61 74 69 6f 6e 2e 20 48 6f 77 65 76 65 72 2c  cation. However,
12470 20 69 74 20 6d 61 79 20 62 65 20 75 73 65 66 75   it may be usefu
12480 6c 20 74 6f 20 61 70 70 6c 69 63 61 74 69 6f 6e  l to application
12490 20 64 65 76 65 6c 6f 70 65 72 73 20 61 74 74 65   developers atte
124a0 6d 70 74 69 6e 67 20 0a 20 20 74 6f 20 61 6e 61  mpting .  to ana
124b0 6c 79 7a 65 20 61 6e 64 20 75 6e 64 65 72 73 74  lyze and underst
124c0 61 6e 64 20 46 54 53 20 70 65 72 66 6f 72 6d 61  and FTS performa
124d0 6e 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74  nce characterist
124e0 69 63 73 2c 20 6f 72 20 74 6f 20 64 65 76 65 6c  ics, or to devel
124f0 6f 70 65 72 73 20 0a 20 20 63 6f 6e 74 65 6d 70  opers .  contemp
12500 6c 61 74 69 6e 67 20 65 6e 68 61 6e 63 65 6d 65  lating enhanceme
12510 6e 74 73 20 74 6f 20 74 68 65 20 65 78 69 73 74  nts to the exist
12520 69 6e 67 20 46 54 53 20 66 65 61 74 75 72 65 20  ing FTS feature 
12530 73 65 74 2e 0a 0a 3c 74 63 6c 3e 68 64 5f 66 72  set...<tcl>hd_fr
12540 61 67 6d 65 6e 74 20 2a 73 68 61 64 6f 77 74 61  agment *shadowta
12550 62 20 7b 46 54 53 20 73 68 61 64 6f 77 20 74 61  b {FTS shadow ta
12560 62 6c 65 73 7d 3c 2f 74 63 6c 3e 0a 3c 70 3e 0a  bles}</tcl>.<p>.
12570 20 20 46 6f 72 20 65 61 63 68 20 46 54 53 20 76    For each FTS v
12580 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6e 20  irtual table in 
12590 61 20 64 61 74 61 62 61 73 65 2c 20 74 68 72 65  a database, thre
125a0 65 20 74 6f 20 66 69 76 65 20 72 65 61 6c 20 28  e to five real (
125b0 6e 6f 6e 2d 76 69 72 74 75 61 6c 29 20 74 61 62  non-virtual) tab
125c0 6c 65 73 0a 20 20 61 72 65 20 63 72 65 61 74 65  les.  are create
125d0 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 75  d to store the u
125e0 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 2e 20  nderlying data. 
125f0 20 54 68 65 73 65 20 72 65 61 6c 20 74 61 62 6c   These real tabl
12600 65 73 20 61 72 65 20 63 61 6c 6c 65 64 20 22 73  es are called "s
12610 68 61 64 6f 77 20 74 61 62 6c 65 73 22 2e 0a 20  hadow tables".. 
12620 20 54 68 65 20 72 65 61 6c 20 74 61 62 6c 65 73   The real tables
12630 20 61 72 65 20 6e 61 6d 65 64 20 22 25 5f 63 6f   are named "%_co
12640 6e 74 65 6e 74 22 2c 0a 20 20 22 25 5f 73 65 67  ntent",.  "%_seg
12650 64 69 72 22 2c 20 22 25 5f 73 65 67 6d 65 6e 74  dir", "%_segment
12660 73 22 2c 20 22 25 5f 73 74 61 74 22 2c 20 61 6e  s", "%_stat", an
12670 64 20 22 25 5f 64 6f 63 73 69 7a 65 22 2c 20 77  d "%_docsize", w
12680 68 65 72 65 20 22 25 22 20 69 73 20 72 65 70 6c  here "%" is repl
12690 61 63 65 64 20 62 79 20 74 68 65 20 6e 61 6d 65  aced by the name
126a0 0a 20 20 6f 66 20 74 68 65 20 46 54 53 20 76 69  .  of the FTS vi
126b0 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 0a 3c 70  rtual table...<p
126c0 3e 0a 20 20 54 68 65 20 6c 65 66 74 6d 6f 73 74  >.  The leftmost
126d0 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 22   column of the "
126e0 25 5f 63 6f 6e 74 65 6e 74 22 20 74 61 62 6c 65  %_content" table
126f0 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50   is an INTEGER P
12700 52 49 4d 41 52 59 20 4b 45 59 20 66 69 65 6c 64  RIMARY KEY field
12710 0a 20 20 6e 61 6d 65 64 20 22 64 6f 63 69 64 22  .  named "docid"
12720 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73  . Following this
12730 20 69 73 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 66   is one column f
12740 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f  or each column o
12750 66 20 74 68 65 20 46 54 53 0a 20 20 76 69 72 74  f the FTS.  virt
12760 75 61 6c 20 74 61 62 6c 65 20 61 73 20 64 65 63  ual table as dec
12770 6c 61 72 65 64 20 62 79 20 74 68 65 20 75 73 65  lared by the use
12780 72 2c 20 6e 61 6d 65 64 20 62 79 20 70 72 65 70  r, named by prep
12790 65 6e 64 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d  ending the colum
127a0 6e 20 6e 61 6d 65 0a 20 20 73 75 70 70 6c 69 65  n name.  supplie
127b0 64 20 62 79 20 74 68 65 20 75 73 65 72 20 77 69  d by the user wi
127c0 74 68 20 22 63 3c 69 3e 4e 3c 2f 69 3e 22 2c 20  th "c<i>N</i>", 
127d0 77 68 65 72 65 20 3c 69 3e 4e 3c 2f 69 3e 20 69  where <i>N</i> i
127e0 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  s the index of t
127f0 68 65 20 0a 20 20 63 6f 6c 75 6d 6e 20 77 69 74  he .  column wit
12800 68 69 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 6e  hin the table, n
12810 75 6d 62 65 72 65 64 20 66 72 6f 6d 20 6c 65 66  umbered from lef
12820 74 20 74 6f 20 72 69 67 68 74 20 73 74 61 72 74  t to right start
12830 69 6e 67 20 77 69 74 68 20 30 2e 20 44 61 74 61  ing with 0. Data
12840 0a 20 20 74 79 70 65 73 20 73 75 70 70 6c 69 65  .  types supplie
12850 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
12860 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 64   virtual table d
12870 65 63 6c 61 72 61 74 69 6f 6e 20 61 72 65 20 6e  eclaration are n
12880 6f 74 20 75 73 65 64 20 61 73 0a 20 20 70 61 72  ot used as.  par
12890 74 20 6f 66 20 74 68 65 20 25 5f 63 6f 6e 74 65  t of the %_conte
128a0 6e 74 20 74 61 62 6c 65 20 64 65 63 6c 61 72 61  nt table declara
128b0 74 69 6f 6e 2e 20 46 6f 72 20 65 78 61 6d 70 6c  tion. For exampl
128c0 65 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a  e:..<codeblock>.
128d0 20 20 3c 69 3e 2d 2d 20 56 69 72 74 75 61 6c 20    <i>-- Virtual 
128e0 74 61 62 6c 65 20 64 65 63 6c 61 72 61 74 69 6f  table declaratio
128f0 6e 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45 20 56  n</i>.  CREATE V
12900 49 52 54 55 41 4c 20 54 41 42 4c 45 20 61 62 63  IRTUAL TABLE abc
12910 20 55 53 49 4e 47 20 66 74 73 34 28 61 20 4e 55   USING fts4(a NU
12920 4d 42 45 52 2c 20 62 20 54 45 58 54 2c 20 63 29  MBER, b TEXT, c)
12930 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 43 6f 72 72 65  ;..  <i>-- Corre
12940 73 70 6f 6e 64 69 6e 67 20 25 5f 63 6f 6e 74 65  sponding %_conte
12950 6e 74 20 74 61 62 6c 65 20 64 65 63 6c 61 72 61  nt table declara
12960 74 69 6f 6e 3c 2f 69 3e 0a 20 20 43 52 45 41 54  tion</i>.  CREAT
12970 45 20 54 41 42 4c 45 20 61 62 63 5f 63 6f 6e 74  E TABLE abc_cont
12980 65 6e 74 28 64 6f 63 69 64 20 49 4e 54 45 47 45  ent(docid INTEGE
12990 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 63  R PRIMARY KEY, c
129a0 30 61 2c 20 63 31 62 2c 20 63 32 63 29 3b 0a 3c  0a, c1b, c2c);.<
129b0 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e  /codeblock>..<p>
129c0 0a 20 20 54 68 65 20 25 5f 63 6f 6e 74 65 6e 74  .  The %_content
129d0 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20   table contains 
129e0 74 68 65 20 75 6e 61 64 75 6c 74 65 72 61 74 65  the unadulterate
129f0 64 20 64 61 74 61 20 69 6e 73 65 72 74 65 64 20  d data inserted 
12a00 62 79 20 74 68 65 20 75 73 65 72 20 0a 20 20 69  by the user .  i
12a10 6e 74 6f 20 74 68 65 20 46 54 53 20 76 69 72 74  nto the FTS virt
12a20 75 61 6c 20 74 61 62 6c 65 20 62 79 20 74 68 65  ual table by the
12a30 20 75 73 65 72 2e 20 49 66 20 74 68 65 20 75 73   user. If the us
12a40 65 72 20 64 6f 65 73 20 6e 6f 74 20 65 78 70 6c  er does not expl
12a50 69 63 69 74 6c 79 0a 20 20 73 75 70 70 6c 79 20  icitly.  supply 
12a60 61 20 22 64 6f 63 69 64 22 20 76 61 6c 75 65 20  a "docid" value 
12a70 77 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 20 72  when inserting r
12a80 65 63 6f 72 64 73 2c 20 6f 6e 65 20 69 73 20 73  ecords, one is s
12a90 65 6c 65 63 74 65 64 20 61 75 74 6f 6d 61 74 69  elected automati
12aa0 63 61 6c 6c 79 0a 20 20 62 79 20 74 68 65 20 73  cally.  by the s
12ab0 79 73 74 65 6d 2e 0a 0a 3c 70 3e 0a 20 20 54 68  ystem...<p>.  Th
12ac0 65 20 25 5f 73 74 61 74 20 61 6e 64 20 25 5f 64  e %_stat and %_d
12ad0 6f 63 73 69 7a 65 20 74 61 62 6c 65 73 20 61 72  ocsize tables ar
12ae0 65 20 6f 6e 6c 79 20 63 72 65 61 74 65 64 20 69  e only created i
12af0 66 20 74 68 65 20 46 54 53 20 74 61 62 6c 65 20  f the FTS table 
12b00 75 73 65 73 20 74 68 65 0a 20 20 46 54 53 34 20  uses the.  FTS4 
12b10 6d 6f 64 75 6c 65 2c 20 6e 6f 74 20 46 54 53 33  module, not FTS3
12b20 2e 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 74  . Furthermore, t
12b30 68 65 20 25 5f 64 6f 63 73 69 7a 65 20 74 61 62  he %_docsize tab
12b40 6c 65 20 69 73 20 6f 6d 69 74 74 65 64 20 69 66  le is omitted if
12b50 20 74 68 65 0a 20 20 46 54 53 34 20 74 61 62 6c   the.  FTS4 tabl
12b60 65 20 69 73 20 63 72 65 61 74 65 64 20 77 69 74  e is created wit
12b70 68 20 74 68 65 20 5b 6d 61 74 63 68 69 6e 66 6f  h the [matchinfo
12b80 5f 66 74 73 33 7c 22 6d 61 74 63 68 69 6e 66 6f  _fts3|"matchinfo
12b90 3d 66 74 73 33 22 5d 20 64 69 72 65 63 74 69 76  =fts3"] directiv
12ba0 65 0a 20 20 73 70 65 63 69 66 69 65 64 20 61 73  e.  specified as
12bb0 20 70 61 72 74 20 6f 66 20 74 68 65 20 43 52 45   part of the CRE
12bc0 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
12bd0 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 49 66 20  E statement. If 
12be0 74 68 65 79 20 61 72 65 20 63 72 65 61 74 65 64  they are created
12bf0 2c 0a 20 20 74 68 65 20 73 63 68 65 6d 61 20 6f  ,.  the schema o
12c00 66 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73  f the two tables
12c10 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
12c20 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 43 52  <codeblock>.  CR
12c30 45 41 54 45 20 54 41 42 4c 45 20 25 5f 73 74 61  EATE TABLE %_sta
12c40 74 28 0a 20 20 20 20 69 64 20 49 4e 54 45 47 45  t(.    id INTEGE
12c50 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 0a  R PRIMARY KEY, .
12c60 20 20 20 20 76 61 6c 75 65 20 42 4c 4f 42 0a 20      value BLOB. 
12c70 20 29 3b 0a 0a 20 20 43 52 45 41 54 45 20 54 41   );..  CREATE TA
12c80 42 4c 45 20 25 5f 64 6f 63 73 69 7a 65 28 0a 20  BLE %_docsize(. 
12c90 20 20 20 64 6f 63 69 64 20 49 4e 54 45 47 45 52     docid INTEGER
12ca0 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 0a 20 20   PRIMARY KEY,.  
12cb0 20 20 73 69 7a 65 20 42 4c 4f 42 0a 20 20 29 3b    size BLOB.  );
12cc0 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c  .</codeblock>..<
12cd0 70 3e 0a 20 20 46 6f 72 20 65 61 63 68 20 72 6f  p>.  For each ro
12ce0 77 20 69 6e 20 74 68 65 20 46 54 53 20 74 61 62  w in the FTS tab
12cf0 6c 65 2c 20 74 68 65 20 25 5f 64 6f 63 73 69 7a  le, the %_docsiz
12d00 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73  e table contains
12d10 20 61 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67   a corresponding
12d20 0a 20 20 72 6f 77 20 77 69 74 68 20 74 68 65 20  .  row with the 
12d30 73 61 6d 65 20 22 64 6f 63 69 64 22 20 76 61 6c  same "docid" val
12d40 75 65 2e 20 54 68 65 20 22 73 69 7a 65 22 20 66  ue. The "size" f
12d50 69 65 6c 64 20 63 6f 6e 74 61 69 6e 73 20 61 20  ield contains a 
12d60 62 6c 6f 62 20 63 6f 6e 73 69 73 74 69 6e 67 0a  blob consisting.
12d70 20 20 6f 66 20 3c 69 3e 4e 3c 2f 69 3e 20 46 54    of <i>N</i> FT
12d80 53 20 76 61 72 69 6e 74 73 2c 20 77 68 65 72 65  S varints, where
12d90 20 3c 69 3e 4e 3c 2f 69 3e 20 69 73 20 74 68 65   <i>N</i> is the
12da0 20 6e 75 6d 62 65 72 20 6f 66 20 75 73 65 72 2d   number of user-
12db0 64 65 66 69 6e 65 64 20 63 6f 6c 75 6d 6e 73 0a  defined columns.
12dc0 20 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20    in the table. 
12dd0 45 61 63 68 20 76 61 72 69 6e 74 20 69 6e 20 74  Each varint in t
12de0 68 65 20 22 73 69 7a 65 22 20 62 6c 6f 62 20 69  he "size" blob i
12df0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
12e00 74 6f 6b 65 6e 73 20 69 6e 20 74 68 65 0a 20 20  tokens in the.  
12e10 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63 6f  corresponding co
12e20 6c 75 6d 6e 20 6f 66 20 74 68 65 20 61 73 73 6f  lumn of the asso
12e30 63 69 61 74 65 64 20 72 6f 77 20 69 6e 20 74 68  ciated row in th
12e40 65 20 46 54 53 20 74 61 62 6c 65 2e 20 54 68 65  e FTS table. The
12e50 20 25 5f 73 74 61 74 20 74 61 62 6c 65 0a 20 20   %_stat table.  
12e60 61 6c 77 61 79 73 20 63 6f 6e 74 61 69 6e 73 20  always contains 
12e70 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 77 69 74  a single row wit
12e80 68 20 74 68 65 20 22 69 64 22 20 63 6f 6c 75 6d  h the "id" colum
12e90 6e 20 73 65 74 20 74 6f 20 30 2e 20 54 68 65 20  n set to 0. The 
12ea0 22 76 61 6c 75 65 22 20 0a 20 20 63 6f 6c 75 6d  "value" .  colum
12eb0 6e 20 63 6f 6e 74 61 69 6e 73 20 61 20 62 6c 6f  n contains a blo
12ec0 62 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20  b consisting of 
12ed0 3c 69 3e 4e 2b 31 3c 2f 69 3e 20 46 54 53 20 76  <i>N+1</i> FTS v
12ee0 61 72 69 6e 74 73 2c 20 77 68 65 72 65 20 3c 69  arints, where <i
12ef0 3e 4e 3c 2f 69 3e 0a 20 20 69 73 20 61 67 61 69  >N</i>.  is agai
12f00 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
12f10 75 73 65 72 2d 64 65 66 69 6e 65 64 20 63 6f 6c  user-defined col
12f20 75 6d 6e 73 20 69 6e 20 74 68 65 20 46 54 53 20  umns in the FTS 
12f30 74 61 62 6c 65 2e 20 54 68 65 20 66 69 72 73 74  table. The first
12f40 0a 20 20 76 61 72 69 6e 74 20 69 6e 20 74 68 65  .  varint in the
12f50 20 62 6c 6f 62 20 69 73 20 73 65 74 20 74 6f 20   blob is set to 
12f60 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
12f70 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
12f80 46 54 53 20 74 61 62 6c 65 2e 20 54 68 65 0a 20  FTS table. The. 
12f90 20 73 65 63 6f 6e 64 20 61 6e 64 20 73 75 62 73   second and subs
12fa0 65 71 75 65 6e 74 20 76 61 72 69 6e 74 73 20 63  equent varints c
12fb0 6f 6e 74 61 69 6e 20 74 68 65 20 74 6f 74 61 6c  ontain the total
12fc0 20 6e 75 6d 62 65 72 20 6f 66 20 74 6f 6b 65 6e   number of token
12fd0 73 20 73 74 6f 72 65 64 20 69 6e 0a 20 20 74 68  s stored in.  th
12fe0 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
12ff0 63 6f 6c 75 6d 6e 20 66 6f 72 20 61 6c 6c 20 72  column for all r
13000 6f 77 73 20 6f 66 20 74 68 65 20 46 54 53 20 74  ows of the FTS t
13010 61 62 6c 65 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65  able...<p>.  The
13020 20 74 77 6f 20 72 65 6d 61 69 6e 69 6e 67 20 74   two remaining t
13030 61 62 6c 65 73 2c 20 25 5f 73 65 67 6d 65 6e 74  ables, %_segment
13040 73 20 61 6e 64 20 25 5f 73 65 67 64 69 72 2c 20  s and %_segdir, 
13050 61 72 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72  are used to stor
13060 65 20 74 68 65 20 0a 20 20 66 75 6c 6c 2d 74 65  e the .  full-te
13070 78 74 20 69 6e 64 65 78 2e 20 43 6f 6e 63 65 70  xt index. Concep
13080 74 75 61 6c 6c 79 2c 20 74 68 69 73 20 69 6e 64  tually, this ind
13090 65 78 20 69 73 20 61 20 6c 6f 6f 6b 75 70 20 74  ex is a lookup t
130a0 61 62 6c 65 20 74 68 61 74 20 6d 61 70 73 20 65  able that maps e
130b0 61 63 68 20 0a 20 20 74 65 72 6d 20 28 77 6f 72  ach .  term (wor
130c0 64 29 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66  d) to the set of
130d0 20 64 6f 63 69 64 20 76 61 6c 75 65 73 20 63 6f   docid values co
130e0 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 72  rresponding to r
130f0 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 0a 20  ecords in the . 
13100 20 25 5f 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65   %_content table
13110 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 6f 6e   that contain on
13120 65 20 6f 72 20 6d 6f 72 65 20 6f 63 63 75 72 72  e or more occurr
13130 65 6e 63 65 73 20 6f 66 20 74 68 65 20 74 65 72  ences of the ter
13140 6d 2e 20 54 6f 0a 20 20 72 65 74 72 69 65 76 65  m. To.  retrieve
13150 20 61 6c 6c 20 64 6f 63 75 6d 65 6e 74 73 20 74   all documents t
13160 68 61 74 20 63 6f 6e 74 61 69 6e 20 61 20 73 70  hat contain a sp
13170 65 63 69 66 69 65 64 20 74 65 72 6d 2c 20 74 68  ecified term, th
13180 65 20 46 54 53 20 6d 6f 64 75 6c 65 0a 20 20 71  e FTS module.  q
13190 75 65 72 69 65 73 20 74 68 69 73 20 69 6e 64 65  ueries this inde
131a0 78 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  x to determine t
131b0 68 65 20 73 65 74 20 6f 66 20 64 6f 63 69 64 20  he set of docid 
131c0 76 61 6c 75 65 73 20 66 6f 72 20 72 65 63 6f 72  values for recor
131d0 64 73 20 74 68 61 74 0a 20 20 63 6f 6e 74 61 69  ds that.  contai
131e0 6e 20 74 68 65 20 74 65 72 6d 2c 20 74 68 65 6e  n the term, then
131f0 20 72 65 74 72 69 65 76 65 73 20 74 68 65 20 72   retrieves the r
13200 65 71 75 69 72 65 64 20 64 6f 63 75 6d 65 6e 74  equired document
13210 73 20 66 72 6f 6d 20 74 68 65 20 25 5f 63 6f 6e  s from the %_con
13220 74 65 6e 74 0a 20 20 74 61 62 6c 65 2e 20 52 65  tent.  table. Re
13230 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20  gardless of the 
13240 73 63 68 65 6d 61 20 6f 66 20 74 68 65 20 46 54  schema of the FT
13250 53 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c  S virtual table,
13260 20 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 0a   the %_segments.
13270 20 20 61 6e 64 20 25 5f 73 65 67 64 69 72 20 74    and %_segdir t
13280 61 62 6c 65 73 20 61 72 65 20 61 6c 77 61 79 73  ables are always
13290 20 63 72 65 61 74 65 64 20 61 73 20 66 6f 6c 6c   created as foll
132a0 6f 77 73 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b  ows:..<codeblock
132b0 3e 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  >.  CREATE TABLE
132c0 20 25 5f 73 65 67 6d 65 6e 74 73 28 0a 20 20 20   %_segments(.   
132d0 20 62 6c 6f 63 6b 69 64 20 49 4e 54 45 47 45 52   blockid INTEGER
132e0 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 20 20   PRIMARY KEY,   
132f0 20 20 20 20 3c 69 3e 2d 2d 20 42 2d 74 72 65 65      <i>-- B-tree
13300 20 6e 6f 64 65 20 69 64 3c 2f 69 3e 0a 20 20 20   node id</i>.   
13310 20 62 6c 6f 63 6b 20 62 6c 6f 62 20 20 20 20 20   block blob     
13320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13330 20 20 20 20 3c 69 3e 2d 2d 20 42 2d 74 72 65 65      <i>-- B-tree
13340 20 6e 6f 64 65 20 64 61 74 61 3c 2f 69 3e 0a 20   node data</i>. 
13350 20 29 3b 0a 0a 20 20 43 52 45 41 54 45 20 54 41   );..  CREATE TA
13360 42 4c 45 20 25 5f 73 65 67 64 69 72 28 0a 20 20  BLE %_segdir(.  
13370 20 20 6c 65 76 65 6c 20 49 4e 54 45 47 45 52 2c    level INTEGER,
13380 0a 20 20 20 20 69 64 78 20 49 4e 54 45 47 45 52  .    idx INTEGER
13390 2c 0a 20 20 20 20 73 74 61 72 74 5f 62 6c 6f 63  ,.    start_bloc
133a0 6b 20 49 4e 54 45 47 45 52 2c 20 20 20 20 20 20  k INTEGER,      
133b0 20 20 20 20 20 20 20 20 20 3c 69 3e 2d 2d 20 42           <i>-- B
133c0 6c 6f 63 6b 69 64 20 6f 66 20 66 69 72 73 74 20  lockid of first 
133d0 6e 6f 64 65 20 69 6e 20 25 5f 73 65 67 6d 65 6e  node in %_segmen
133e0 74 73 3c 2f 69 3e 0a 20 20 20 20 6c 65 61 76 65  ts</i>.    leave
133f0 73 5f 65 6e 64 5f 62 6c 6f 63 6b 20 49 4e 54 45  s_end_block INTE
13400 47 45 52 2c 20 20 20 20 20 20 20 20 20 20 3c 69  GER,          <i
13410 3e 2d 2d 20 42 6c 6f 63 6b 69 64 20 6f 66 20 6c  >-- Blockid of l
13420 61 73 74 20 6c 65 61 66 20 6e 6f 64 65 20 69 6e  ast leaf node in
13430 20 25 5f 73 65 67 6d 65 6e 74 73 3c 2f 69 3e 0a   %_segments</i>.
13440 20 20 20 20 65 6e 64 5f 62 6c 6f 63 6b 20 49 4e      end_block IN
13450 54 45 47 45 52 2c 20 20 20 20 20 20 20 20 20 20  TEGER,          
13460 20 20 20 20 20 20 20 3c 69 3e 2d 2d 20 42 6c 6f         <i>-- Blo
13470 63 6b 69 64 20 6f 66 20 6c 61 73 74 20 6e 6f 64  ckid of last nod
13480 65 20 69 6e 20 25 5f 73 65 67 6d 65 6e 74 73 3c  e in %_segments<
13490 2f 69 3e 0a 20 20 20 20 72 6f 6f 74 20 42 4c 4f  /i>.    root BLO
134a0 42 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  B,              
134b0 20 20 20 20 20 20 20 20 20 20 20 3c 69 3e 2d 2d             <i>--
134c0 20 42 2d 74 72 65 65 20 72 6f 6f 74 20 6e 6f 64   B-tree root nod
134d0 65 3c 2f 69 3e 0a 20 20 20 20 50 52 49 4d 41 52  e</i>.    PRIMAR
134e0 59 20 4b 45 59 28 6c 65 76 65 6c 2c 20 69 64 78  Y KEY(level, idx
134f0 29 0a 20 20 29 3b 0a 3c 2f 63 6f 64 65 62 6c 6f  ).  );.</codeblo
13500 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 73  ck>..<p>.  The s
13510 63 68 65 6d 61 20 64 65 70 69 63 74 65 64 20 61  chema depicted a
13520 62 6f 76 65 20 69 73 20 6e 6f 74 20 64 65 73 69  bove is not desi
13530 67 6e 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68  gned to store th
13540 65 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65  e full-text inde
13550 78 20 0a 20 20 64 69 72 65 63 74 6c 79 2e 20 49  x .  directly. I
13560 6e 73 74 65 61 64 2c 20 69 74 20 69 73 20 75 73  nstead, it is us
13570 65 64 20 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72  ed to one or mor
13580 65 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75  e b-tree structu
13590 72 65 73 2e 20 54 68 65 72 65 0a 20 20 69 73 20  res. There.  is 
135a0 6f 6e 65 20 62 2d 74 72 65 65 20 66 6f 72 20 65  one b-tree for e
135b0 61 63 68 20 72 6f 77 20 69 6e 20 74 68 65 20 25  ach row in the %
135c0 5f 73 65 67 64 69 72 20 74 61 62 6c 65 2e 20 54  _segdir table. T
135d0 68 65 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c  he %_segdir tabl
135e0 65 0a 20 20 72 6f 77 20 63 6f 6e 74 61 69 6e 73  e.  row contains
135f0 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 20 61   the root node a
13600 6e 64 20 76 61 72 69 6f 75 73 20 6d 65 74 61 2d  nd various meta-
13610 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20  data associated 
13620 77 69 74 68 20 74 68 65 0a 20 20 62 2d 74 72 65  with the.  b-tre
13630 65 20 73 74 72 75 63 74 75 72 65 2c 20 61 6e 64  e structure, and
13640 20 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20   the %_segments 
13650 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61  table contains a
13660 6c 6c 20 6f 74 68 65 72 20 28 6e 6f 6e 2d 72 6f  ll other (non-ro
13670 6f 74 29 0a 20 20 62 2d 74 72 65 65 20 6e 6f 64  ot).  b-tree nod
13680 65 73 2e 20 45 61 63 68 20 62 2d 74 72 65 65 20  es. Each b-tree 
13690 69 73 20 72 65 66 65 72 72 65 64 20 74 6f 20 61  is referred to a
136a0 73 20 61 20 22 73 65 67 6d 65 6e 74 22 2e 20 4f  s a "segment". O
136b0 6e 63 65 20 69 74 20 68 61 73 0a 20 20 62 65 65  nce it has.  bee
136c0 6e 20 63 72 65 61 74 65 64 2c 20 61 20 73 65 67  n created, a seg
136d0 6d 65 6e 74 20 62 2d 74 72 65 65 20 69 73 20 6e  ment b-tree is n
136e0 65 76 65 72 20 75 70 64 61 74 65 64 20 28 61 6c  ever updated (al
136f0 74 68 6f 75 67 68 20 69 74 20 6d 61 79 20 62 65  though it may be
13700 0a 20 20 64 65 6c 65 74 65 64 20 61 6c 74 6f 67  .  deleted altog
13710 65 74 68 65 72 29 2e 0a 0a 3c 70 3e 0a 20 20 54  ether)...<p>.  T
13720 68 65 20 6b 65 79 73 20 75 73 65 64 20 62 79 20  he keys used by 
13730 65 61 63 68 20 73 65 67 6d 65 6e 74 20 62 2d 74  each segment b-t
13740 72 65 65 20 61 72 65 20 74 65 72 6d 73 20 28 77  ree are terms (w
13750 6f 72 64 73 29 2e 20 41 73 20 77 65 6c 6c 20 61  ords). As well a
13760 73 20 74 68 65 0a 20 20 6b 65 79 2c 20 65 61 63  s the.  key, eac
13770 68 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65  h segment b-tree
13780 20 65 6e 74 72 79 20 68 61 73 20 61 6e 20 61 73   entry has an as
13790 73 6f 63 69 61 74 65 64 20 22 64 6f 63 6c 69 73  sociated "doclis
137a0 74 22 20 28 64 6f 63 75 6d 65 6e 74 20 6c 69 73  t" (document lis
137b0 74 29 2e 0a 20 20 41 20 64 6f 63 6c 69 73 74 20  t)..  A doclist 
137c0 63 6f 6e 73 69 73 74 73 20 6f 66 20 7a 65 72 6f  consists of zero
137d0 20 6f 72 20 6d 6f 72 65 20 65 6e 74 72 69 65 73   or more entries
137e0 2c 20 77 68 65 72 65 20 65 61 63 68 20 65 6e 74  , where each ent
137f0 72 79 20 63 6f 6e 73 69 73 74 73 20 6f 66 3a 0a  ry consists of:.
13800 0a 3c 75 6c 3e 0a 20 20 3c 6c 69 3e 20 41 20 64  .<ul>.  <li> A d
13810 6f 63 69 64 20 28 64 6f 63 75 6d 65 6e 74 20 69  ocid (document i
13820 64 29 2c 20 61 6e 64 0a 20 20 3c 6c 69 3e 20 41  d), and.  <li> A
13830 20 6c 69 73 74 20 6f 66 20 74 65 72 6d 20 6f 66   list of term of
13840 66 73 65 74 73 2c 20 6f 6e 65 20 66 6f 72 20 65  fsets, one for e
13850 61 63 68 20 6f 63 63 75 72 72 65 6e 63 65 20 6f  ach occurrence o
13860 66 20 74 68 65 20 74 65 72 6d 20 77 69 74 68 69  f the term withi
13870 6e 0a 20 20 20 20 20 20 20 74 68 65 20 64 6f 63  n.       the doc
13880 75 6d 65 6e 74 2e 20 41 20 74 65 72 6d 20 6f 66  ument. A term of
13890 66 73 65 74 20 69 6e 64 69 63 61 74 65 73 20 74  fset indicates t
138a0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 6f 6b  he number of tok
138b0 65 6e 73 20 28 77 6f 72 64 73 29 0a 20 20 20 20  ens (words).    
138c0 20 20 20 74 68 61 74 20 6f 63 63 75 72 20 62 65     that occur be
138d0 66 6f 72 65 20 74 68 65 20 74 65 72 6d 20 69 6e  fore the term in
138e0 20 71 75 65 73 74 69 6f 6e 2c 20 6e 6f 74 20 74   question, not t
138f0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61  he number of cha
13900 72 61 63 74 65 72 73 0a 20 20 20 20 20 20 20 6f  racters.       o
13910 72 20 62 79 74 65 73 2e 20 46 6f 72 20 65 78 61  r bytes. For exa
13920 6d 70 6c 65 2c 20 74 68 65 20 74 65 72 6d 20 6f  mple, the term o
13930 66 66 73 65 74 20 6f 66 20 74 68 65 20 74 65 72  ffset of the ter
13940 6d 20 22 77 61 72 22 20 69 6e 20 74 68 65 0a 20  m "war" in the. 
13950 20 20 20 20 20 20 70 68 72 61 73 65 20 22 41 6e        phrase "An
13960 63 65 73 74 72 61 6c 20 76 6f 69 63 65 73 20 70  cestral voices p
13970 72 6f 70 68 65 73 79 69 6e 67 20 77 61 72 21 22  rophesying war!"
13980 20 69 73 20 33 2e 0a 3c 2f 75 6c 3e 0a 0a 3c 70   is 3..</ul>..<p
13990 3e 0a 20 20 45 6e 74 72 69 65 73 20 77 69 74 68  >.  Entries with
139a0 69 6e 20 61 20 64 6f 63 6c 69 73 74 20 61 72 65  in a doclist are
139b0 20 73 6f 72 74 65 64 20 62 79 20 64 6f 63 69 64   sorted by docid
139c0 2e 20 50 6f 73 69 74 69 6f 6e 73 20 77 69 74 68  . Positions with
139d0 69 6e 20 61 20 64 6f 63 6c 69 73 74 0a 20 20 65  in a doclist.  e
139e0 6e 74 72 79 20 61 72 65 20 73 74 6f 72 65 64 20  ntry are stored 
139f0 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
13a00 65 72 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 63  er...<p>.  The c
13a10 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6c  ontents of the l
13a20 6f 67 69 63 61 6c 20 66 75 6c 6c 2d 74 65 78 74  ogical full-text
13a30 20 69 6e 64 65 78 20 69 73 20 66 6f 75 6e 64 20   index is found 
13a40 62 79 20 6d 65 72 67 69 6e 67 20 74 68 65 0a 20  by merging the. 
13a50 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 6c 6c   contents of all
13a60 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 73   segment b-trees
13a70 2e 20 49 66 20 61 20 74 65 72 6d 20 69 73 20 70  . If a term is p
13a80 72 65 73 65 6e 74 20 69 6e 20 6d 6f 72 65 20 74  resent in more t
13a90 68 61 6e 20 6f 6e 65 0a 20 20 73 65 67 6d 65 6e  han one.  segmen
13aa0 74 20 62 2d 74 72 65 65 2c 20 74 68 65 6e 20 69  t b-tree, then i
13ab0 74 20 6d 61 70 73 20 74 6f 20 74 68 65 20 75 6e  t maps to the un
13ac0 69 6f 6e 20 6f 66 20 65 61 63 68 20 69 6e 64 69  ion of each indi
13ad0 76 69 64 75 61 6c 20 64 6f 63 6c 69 73 74 2e 20  vidual doclist. 
13ae0 49 66 2c 0a 20 20 66 6f 72 20 61 20 73 69 6e 67  If,.  for a sing
13af0 6c 65 20 74 65 72 6d 2c 20 74 68 65 20 73 61 6d  le term, the sam
13b00 65 20 64 6f 63 69 64 20 6f 63 63 75 72 73 20 69  e docid occurs i
13b10 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  n more than one 
13b20 64 6f 63 6c 69 73 74 2c 20 74 68 65 6e 20 6f 6e  doclist, then on
13b30 6c 79 0a 20 20 74 68 65 20 64 6f 63 6c 69 73 74  ly.  the doclist
13b40 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
13b50 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
13b60 6c 79 20 63 72 65 61 74 65 64 20 73 65 67 6d 65  ly created segme
13b70 6e 74 20 62 2d 74 72 65 65 20 69 73 20 0a 20 20  nt b-tree is .  
13b80 63 6f 6e 73 69 64 65 72 65 64 20 76 61 6c 69 64  considered valid
13b90 2e 20 0a 0a 3c 70 3e 0a 20 20 4d 75 6c 74 69 70  . ..<p>.  Multip
13ba0 6c 65 20 62 2d 74 72 65 65 20 73 74 72 75 63 74  le b-tree struct
13bb0 75 72 65 73 20 61 72 65 20 75 73 65 64 20 69 6e  ures are used in
13bc0 73 74 65 61 64 20 6f 66 20 61 20 73 69 6e 67 6c  stead of a singl
13bd0 65 20 62 2d 74 72 65 65 20 74 6f 20 72 65 64 75  e b-tree to redu
13be0 63 65 0a 20 20 74 68 65 20 63 6f 73 74 20 6f 66  ce.  the cost of
13bf0 20 69 6e 73 65 72 74 69 6e 67 20 72 65 63 6f 72   inserting recor
13c00 64 73 20 69 6e 74 6f 20 46 54 53 20 74 61 62 6c  ds into FTS tabl
13c10 65 73 2e 20 57 68 65 6e 20 61 20 6e 65 77 20 72  es. When a new r
13c20 65 63 6f 72 64 20 69 73 20 0a 20 20 69 6e 73 65  ecord is .  inse
13c30 72 74 65 64 20 69 6e 74 6f 20 61 6e 20 46 54 53  rted into an FTS
13c40 20 74 61 62 6c 65 20 74 68 61 74 20 61 6c 72 65   table that alre
13c50 61 64 79 20 63 6f 6e 74 61 69 6e 73 20 61 20 6c  ady contains a l
13c60 6f 74 20 6f 66 20 64 61 74 61 2c 20 69 74 20 69  ot of data, it i
13c70 73 0a 20 20 6c 69 6b 65 6c 79 20 74 68 61 74 20  s.  likely that 
13c80 6d 61 6e 79 20 6f 66 20 74 68 65 20 74 65 72 6d  many of the term
13c90 73 20 69 6e 20 74 68 65 20 6e 65 77 20 72 65 63  s in the new rec
13ca0 6f 72 64 20 61 72 65 20 61 6c 72 65 61 64 79 20  ord are already 
13cb0 70 72 65 73 65 6e 74 20 69 6e 0a 20 20 61 20 6c  present in.  a l
13cc0 61 72 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 65  arge number of e
13cd0 78 69 73 74 69 6e 67 20 72 65 63 6f 72 64 73 2e  xisting records.
13ce0 20 49 66 20 61 20 73 69 6e 67 6c 65 20 62 2d 74   If a single b-t
13cf0 72 65 65 20 77 65 72 65 20 75 73 65 64 2c 20 74  ree were used, t
13d00 68 65 6e 0a 20 20 6c 61 72 67 65 20 64 6f 63 6c  hen.  large docl
13d10 69 73 74 20 73 74 72 75 63 74 75 72 65 73 20 77  ist structures w
13d20 6f 75 6c 64 20 68 61 76 65 20 74 6f 20 62 65 20  ould have to be 
13d30 6c 6f 61 64 65 64 20 66 72 6f 6d 20 74 68 65 20  loaded from the 
13d40 64 61 74 61 62 61 73 65 2c 0a 20 20 61 6d 65 6e  database,.  amen
13d50 64 65 64 20 74 6f 20 69 6e 63 6c 75 64 65 20 74  ded to include t
13d60 68 65 20 6e 65 77 20 64 6f 63 69 64 20 61 6e 64  he new docid and
13d70 20 74 65 72 6d 2d 6f 66 66 73 65 74 20 6c 69 73   term-offset lis
13d80 74 2c 20 74 68 65 6e 20 77 72 69 74 74 65 6e 20  t, then written 
13d90 62 61 63 6b 0a 20 20 74 6f 20 74 68 65 20 64 61  back.  to the da
13da0 74 61 62 61 73 65 2e 20 55 73 69 6e 67 20 6d 75  tabase. Using mu
13db0 6c 74 69 70 6c 65 20 62 2d 74 72 65 65 20 74 61  ltiple b-tree ta
13dc0 62 6c 65 73 20 61 6c 6c 6f 77 73 20 74 68 69 73  bles allows this
13dd0 20 74 6f 20 62 65 20 61 76 6f 69 64 65 64 0a 20   to be avoided. 
13de0 20 62 79 20 63 72 65 61 74 69 6e 67 20 61 20 6e   by creating a n
13df0 65 77 20 62 2d 74 72 65 65 20 77 68 69 63 68 20  ew b-tree which 
13e00 63 61 6e 20 62 65 20 6d 65 72 67 65 64 20 77 69  can be merged wi
13e10 74 68 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  th the existing 
13e20 62 2d 74 72 65 65 0a 20 20 28 6f 72 20 62 2d 74  b-tree.  (or b-t
13e30 72 65 65 73 29 20 6c 61 74 65 72 20 6f 6e 2e 20  rees) later on. 
13e40 4d 65 72 67 69 6e 67 20 6f 66 20 62 2d 74 72 65  Merging of b-tre
13e50 65 20 73 74 72 75 63 74 75 72 65 73 20 63 61 6e  e structures can
13e60 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 61 73   be performed as
13e70 0a 20 20 61 20 62 61 63 6b 67 72 6f 75 6e 64 20  .  a background 
13e80 74 61 73 6b 2c 20 6f 72 20 6f 6e 63 65 20 61 20  task, or once a 
13e90 63 65 72 74 61 69 6e 20 6e 75 6d 62 65 72 20 6f  certain number o
13ea0 66 20 73 65 70 61 72 61 74 65 20 62 2d 74 72 65  f separate b-tre
13eb0 65 20 73 74 72 75 63 74 75 72 65 73 0a 20 20 68  e structures.  h
13ec0 61 76 65 20 62 65 65 6e 20 61 63 63 75 6d 75 6c  ave been accumul
13ed0 61 74 65 64 2e 20 4f 66 20 63 6f 75 72 73 65 2c  ated. Of course,
13ee0 20 74 68 69 73 20 73 63 68 65 6d 65 20 6d 61 6b   this scheme mak
13ef0 65 73 20 71 75 65 72 69 65 73 20 6d 6f 72 65 20  es queries more 
13f00 65 78 70 65 6e 73 69 76 65 0a 20 20 28 61 73 20  expensive.  (as 
13f10 74 68 65 20 46 54 53 20 63 6f 64 65 20 6d 61 79  the FTS code may
13f20 20 68 61 76 65 20 74 6f 20 6c 6f 6f 6b 20 75 70   have to look up
13f30 20 69 6e 64 69 76 69 64 75 61 6c 20 74 65 72 6d   individual term
13f40 73 20 69 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f  s in more than o
13f50 6e 65 0a 20 20 62 2d 74 72 65 65 20 61 6e 64 20  ne.  b-tree and 
13f60 6d 65 72 67 65 20 74 68 65 20 72 65 73 75 6c 74  merge the result
13f70 73 29 2c 20 62 75 74 20 69 74 20 68 61 73 20 62  s), but it has b
13f80 65 65 6e 20 66 6f 75 6e 64 20 74 68 61 74 20 69  een found that i
13f90 6e 20 70 72 61 63 74 69 63 65 20 74 68 69 73 0a  n practice this.
13fa0 20 20 6f 76 65 72 68 65 61 64 20 69 73 20 6f 66    overhead is of
13fb0 74 65 6e 20 6e 65 67 6c 69 67 69 62 6c 65 2e 0a  ten negligible..
13fc0 20 20 0a 3c 68 32 3e 56 61 72 69 61 62 6c 65 20    .<h2>Variable 
13fd0 4c 65 6e 67 74 68 20 49 6e 74 65 67 65 72 20 28  Length Integer (
13fe0 76 61 72 69 6e 74 29 20 46 6f 72 6d 61 74 3c 2f  varint) Format</
13ff0 68 32 3e 0a 0a 3c 70 3e 0a 20 20 49 6e 74 65 67  h2>..<p>.  Integ
14000 65 72 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64  er values stored
14010 20 61 73 20 70 61 72 74 20 6f 66 20 73 65 67 6d   as part of segm
14020 65 6e 74 20 62 2d 74 72 65 65 20 6e 6f 64 65 73  ent b-tree nodes
14030 20 61 72 65 20 65 6e 63 6f 64 65 64 20 75 73 69   are encoded usi
14040 6e 67 20 74 68 65 0a 20 20 46 54 53 20 76 61 72  ng the.  FTS var
14050 69 6e 74 20 66 6f 72 6d 61 74 2e 20 54 68 69 73  int format. This
14060 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 73 69 6d   encoding is sim
14070 69 6c 61 72 2c 20 62 75 74 20 3c 62 3e 6e 6f 74  ilar, but <b>not
14080 20 69 64 65 6e 74 69 63 61 6c 3c 2f 62 3e 2c 20   identical</b>, 
14090 74 6f 20 74 68 65 0a 20 20 74 68 65 20 3c 61 20  to the.  the <a 
140a0 68 72 65 66 3d 22 66 69 6c 65 66 6f 72 6d 61 74  href="fileformat
140b0 2e 68 74 6d 6c 23 76 61 72 69 6e 74 5f 66 6f 72  .html#varint_for
140c0 6d 61 74 22 3e 53 51 4c 69 74 65 20 76 61 72 69  mat">SQLite vari
140d0 6e 74 20 66 6f 72 6d 61 74 3c 2f 61 3e 2e 0a 0a  nt format</a>...
140e0 3c 70 3e 0a 20 20 41 6e 20 65 6e 63 6f 64 65 64  <p>.  An encoded
140f0 20 46 54 53 20 76 61 72 69 6e 74 20 63 6f 6e 73   FTS varint cons
14100 75 6d 65 73 20 62 65 74 77 65 65 6e 20 6f 6e 65  umes between one
14110 20 61 6e 64 20 74 65 6e 20 62 79 74 65 73 20 6f   and ten bytes o
14120 66 20 73 70 61 63 65 2e 20 54 68 65 0a 20 20 6e  f space. The.  n
14130 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
14140 65 71 75 69 72 65 64 20 69 73 20 64 65 74 65 72  equired is deter
14150 6d 69 6e 65 64 20 62 79 20 74 68 65 20 73 69 67  mined by the sig
14160 6e 20 61 6e 64 20 6d 61 67 6e 69 74 75 64 65 20  n and magnitude 
14170 6f 66 20 74 68 65 0a 20 20 69 6e 74 65 67 65 72  of the.  integer
14180 20 76 61 6c 75 65 20 65 6e 63 6f 64 65 64 2e 20   value encoded. 
14190 4d 6f 72 65 20 61 63 63 75 72 61 74 65 6c 79 2c  More accurately,
141a0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
141b0 79 74 65 73 20 75 73 65 64 20 74 6f 20 73 74 6f  ytes used to sto
141c0 72 65 0a 20 20 74 68 65 20 65 6e 63 6f 64 65 64  re.  the encoded
141d0 20 69 6e 74 65 67 65 72 20 64 65 70 65 6e 64 73   integer depends
141e0 20 6f 6e 20 74 68 65 20 70 6f 73 69 74 69 6f 6e   on the position
141f0 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 73 69 67   of the most sig
14200 6e 69 66 69 63 61 6e 74 20 73 65 74 20 62 69 74  nificant set bit
14210 0a 20 20 69 6e 20 74 68 65 20 36 34 2d 62 69 74  .  in the 64-bit
14220 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74   twos-complement
14230 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
14240 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 76  of the integer v
14250 61 6c 75 65 2e 20 4e 65 67 61 74 69 76 65 0a 20  alue. Negative. 
14260 20 76 61 6c 75 65 73 20 61 6c 77 61 79 73 20 68   values always h
14270 61 76 65 20 74 68 65 20 6d 6f 73 74 20 73 69 67  ave the most sig
14280 6e 69 66 69 63 61 6e 74 20 62 69 74 20 73 65 74  nificant bit set
14290 20 28 74 68 65 20 73 69 67 6e 20 62 69 74 29 2c   (the sign bit),
142a0 20 61 6e 64 20 73 6f 20 61 72 65 0a 20 20 61 6c   and so are.  al
142b0 77 61 79 73 20 73 74 6f 72 65 64 20 75 73 69 6e  ways stored usin
142c0 67 20 74 68 65 20 66 75 6c 6c 20 74 65 6e 20 62  g the full ten b
142d0 79 74 65 73 2e 20 50 6f 73 69 74 69 76 65 20 69  ytes. Positive i
142e0 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20 6d 61  nteger values ma
142f0 79 20 62 65 0a 20 20 73 74 6f 72 65 64 20 75 73  y be.  stored us
14300 69 6e 67 20 6c 65 73 73 20 73 70 61 63 65 2e 0a  ing less space..
14310 0a 3c 70 3e 0a 20 20 54 68 65 20 66 69 6e 61 6c  .<p>.  The final
14320 20 62 79 74 65 20 6f 66 20 61 6e 20 65 6e 63 6f   byte of an enco
14330 64 65 64 20 46 54 53 20 76 61 72 69 6e 74 20 68  ded FTS varint h
14340 61 73 20 69 74 73 20 6d 6f 73 74 20 73 69 67 6e  as its most sign
14350 69 66 69 63 61 6e 74 20 62 69 74 20 0a 20 20 63  ificant bit .  c
14360 6c 65 61 72 65 64 2e 20 41 6c 6c 20 70 72 65 63  leared. All prec
14370 65 64 69 6e 67 20 62 79 74 65 73 20 68 61 76 65  eding bytes have
14380 20 74 68 65 20 6d 6f 73 74 20 73 69 67 6e 69 66   the most signif
14390 69 63 61 6e 74 20 62 69 74 20 73 65 74 2e 20 44  icant bit set. D
143a0 61 74 61 0a 20 20 69 73 20 73 74 6f 72 65 64 20  ata.  is stored 
143b0 69 6e 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67  in the remaining
143c0 20 73 65 76 65 6e 20 6c 65 61 73 74 20 73 69 67   seven least sig
143d0 6e 69 66 69 63 61 6e 74 20 62 69 74 73 20 6f 66  nificant bits of
143e0 20 65 61 63 68 20 62 79 74 65 2e 0a 20 20 54 68   each byte..  Th
143f0 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
14400 74 68 65 20 65 6e 63 6f 64 65 64 20 72 65 70 72  the encoded repr
14410 65 73 65 6e 74 61 74 69 6f 6e 20 63 6f 6e 74 61  esentation conta
14420 69 6e 73 20 74 68 65 20 6c 65 61 73 74 20 73 69  ins the least si
14430 67 6e 69 66 69 63 61 6e 74 0a 20 20 73 65 76 65  gnificant.  seve
14440 6e 20 62 69 74 73 20 6f 66 20 74 68 65 20 65 6e  n bits of the en
14450 63 6f 64 65 64 20 69 6e 74 65 67 65 72 20 76 61  coded integer va
14460 6c 75 65 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  lue. The second 
14470 62 79 74 65 20 6f 66 20 74 68 65 20 65 6e 63 6f  byte of the enco
14480 64 65 64 0a 20 20 72 65 70 72 65 73 65 6e 74 61  ded.  representa
14490 74 69 6f 6e 2c 20 69 66 20 69 74 20 69 73 20 70  tion, if it is p
144a0 72 65 73 65 6e 74 2c 20 63 6f 6e 74 61 69 6e 73  resent, contains
144b0 20 74 68 65 20 73 65 76 65 6e 20 6e 65 78 74 20   the seven next 
144c0 6c 65 61 73 74 20 73 69 67 6e 69 66 69 63 61 6e  least significan
144d0 74 0a 20 20 62 69 74 73 20 6f 66 20 74 68 65 20  t.  bits of the 
144e0 69 6e 74 65 67 65 72 20 76 61 6c 75 65 2c 20 61  integer value, a
144f0 6e 64 20 73 6f 20 6f 6e 2e 20 54 68 65 20 66 6f  nd so on. The fo
14500 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 63 6f  llowing table co
14510 6e 74 61 69 6e 73 20 65 78 61 6d 70 6c 65 73 0a  ntains examples.
14520 20 20 6f 66 20 65 6e 63 6f 64 65 64 20 69 6e 74    of encoded int
14530 65 67 65 72 20 76 61 6c 75 65 73 3a 0a 0a 3c 74  eger values:..<t
14540 61 62 6c 65 20 73 74 72 69 70 65 64 3d 31 3e 0a  able striped=1>.
14550 20 20 3c 74 72 3e 3c 74 68 3e 44 65 63 69 6d 61    <tr><th>Decima
14560 6c 3c 74 68 3e 48 65 78 61 64 65 63 69 6d 61 6c  l<th>Hexadecimal
14570 3c 74 68 20 77 69 64 74 68 3d 31 30 30 25 3e 45  <th width=100%>E
14580 6e 63 6f 64 65 64 20 52 65 70 72 65 73 65 6e 74  ncoded Represent
14590 61 74 69 6f 6e 0a 20 20 3c 74 72 3e 3c 74 64 3e  ation.  <tr><td>
145a0 34 33 3c 74 64 3e 30 78 30 30 30 30 30 30 30 30  43<td>0x00000000
145b0 30 30 30 30 30 30 32 42 3c 74 64 3e 30 78 32 42  0000002B<td>0x2B
145c0 20 0a 20 20 3c 74 72 3e 3c 74 64 3e 32 30 30 38   .  <tr><td>2008
145d0 31 35 3c 74 64 3e 30 78 30 30 30 30 30 30 30 30  15<td>0x00000000
145e0 30 30 30 33 31 30 36 46 3c 74 64 3e 30 78 39 43  0003106F<td>0x9C
145f0 20 30 78 41 30 20 30 78 30 43 0a 20 20 3c 74 72   0xA0 0x0C.  <tr
14600 3e 3c 74 64 3e 2d 31 3c 74 64 3e 30 78 46 46 46  ><td>-1<td>0xFFF
14610 46 46 46 46 46 46 46 46 46 46 46 46 46 3c 74 64  FFFFFFFFFFFFF<td
14620 3e 30 78 46 46 20 30 78 46 46 20 30 78 46 46 20  >0xFF 0xFF 0xFF 
14630 30 78 46 46 20 30 78 46 46 20 30 78 46 46 20 30  0xFF 0xFF 0xFF 0
14640 78 46 46 20 30 78 46 46 20 30 78 46 46 20 30 78  xFF 0xFF 0xFF 0x
14650 30 31 0a 3c 2f 74 61 62 6c 65 3e 0a 20 20 0a 0a  01.</table>.  ..
14660 3c 68 32 3e 53 65 67 6d 65 6e 74 20 42 2d 54 72  <h2>Segment B-Tr
14670 65 65 20 46 6f 72 6d 61 74 3c 2f 68 32 3e 0a 0a  ee Format</h2>..
14680 3c 70 3e 0a 20 20 53 65 67 6d 65 6e 74 20 62 2d  <p>.  Segment b-
14690 74 72 65 65 73 20 61 72 65 20 70 72 65 66 69 78  trees are prefix
146a0 2d 63 6f 6d 70 72 65 73 73 65 64 20 62 2b 2d 74  -compressed b+-t
146b0 72 65 65 73 2e 20 54 68 65 72 65 20 69 73 20 6f  rees. There is o
146c0 6e 65 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65  ne segment b-tre
146d0 65 0a 20 20 66 6f 72 20 65 61 63 68 20 72 6f 77  e.  for each row
146e0 20 69 6e 20 74 68 65 20 25 5f 73 65 67 64 69 72   in the %_segdir
146f0 20 74 61 62 6c 65 20 28 73 65 65 20 61 62 6f 76   table (see abov
14700 65 29 2e 20 54 68 65 20 72 6f 6f 74 20 6e 6f 64  e). The root nod
14710 65 20 6f 66 20 74 68 65 20 73 65 67 6d 65 6e 74  e of the segment
14720 0a 20 20 62 2d 74 72 65 65 20 69 73 20 73 74 6f  .  b-tree is sto
14730 72 65 64 20 61 73 20 61 20 62 6c 6f 62 20 69 6e  red as a blob in
14740 20 74 68 65 20 22 72 6f 6f 74 22 20 66 69 65 6c   the "root" fiel
14750 64 20 6f 66 20 74 68 65 20 63 6f 72 72 65 73 70  d of the corresp
14760 6f 6e 64 69 6e 67 20 72 6f 77 0a 20 20 6f 66 20  onding row.  of 
14770 74 68 65 20 25 5f 73 65 67 64 69 72 20 74 61 62  the %_segdir tab
14780 6c 65 2e 20 41 6c 6c 20 6f 74 68 65 72 20 6e 6f  le. All other no
14790 64 65 73 20 28 69 66 20 61 6e 79 20 65 78 69 73  des (if any exis
147a0 74 29 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e  t) are stored in
147b0 20 74 68 65 20 0a 20 20 22 62 6c 6f 62 22 20 63   the .  "blob" c
147c0 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 25 5f 73  olumn of the %_s
147d0 65 67 6d 65 6e 74 73 20 74 61 62 6c 65 2e 20 4e  egments table. N
147e0 6f 64 65 73 20 77 69 74 68 69 6e 20 74 68 65 20  odes within the 
147f0 25 5f 73 65 67 6d 65 6e 74 73 20 74 61 62 6c 65  %_segments table
14800 20 61 72 65 0a 20 20 69 64 65 6e 74 69 66 69 65   are.  identifie
14810 64 20 62 79 20 74 68 65 20 69 6e 74 65 67 65 72  d by the integer
14820 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 62 6c   value in the bl
14830 6f 63 6b 69 64 20 66 69 65 6c 64 20 6f 66 20 74  ockid field of t
14840 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
14850 0a 20 20 72 6f 77 2e 20 54 68 65 20 66 6f 6c 6c  .  row. The foll
14860 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63  owing table desc
14870 72 69 62 65 73 20 74 68 65 20 66 69 65 6c 64 73  ribes the fields
14880 20 6f 66 20 74 68 65 20 25 5f 73 65 67 64 69 72   of the %_segdir
14890 20 74 61 62 6c 65 3a 0a 0a 3c 74 61 62 6c 65 20   table:..<table 
148a0 73 74 72 69 70 65 64 3d 31 3e 0a 20 20 3c 74 72  striped=1>.  <tr
148b0 3e 3c 74 68 3e 43 6f 6c 75 6d 6e 20 20 20 20 20  ><th>Column     
148c0 20 20 20 20 20 20 3c 74 68 20 77 69 64 74 68 3d        <th width=
148d0 31 30 30 25 3e 49 6e 74 65 72 70 72 65 74 61 74  100%>Interpretat
148e0 69 6f 6e 0a 20 20 3c 74 72 3e 3c 74 64 3e 6c 65  ion.  <tr><td>le
148f0 76 65 6c 20 20 20 20 20 20 20 20 20 20 20 20 3c  vel            <
14900 74 64 3e 20 0a 20 20 20 20 42 65 74 77 65 65 6e  td> .    Between
14910 20 74 68 65 6d 2c 20 74 68 65 20 63 6f 6e 74 65   them, the conte
14920 6e 74 73 20 6f 66 20 74 68 65 20 22 6c 65 76 65  nts of the "leve
14930 6c 22 20 61 6e 64 20 22 69 64 78 22 20 66 69 65  l" and "idx" fie
14940 6c 64 73 20 64 65 66 69 6e 65 20 74 68 65 0a 20  lds define the. 
14950 20 20 20 72 65 6c 61 74 69 76 65 20 61 67 65 20     relative age 
14960 6f 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20 62  of the segment b
14970 2d 74 72 65 65 2e 20 54 68 65 20 73 6d 61 6c 6c  -tree. The small
14980 65 72 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f  er the value sto
14990 72 65 64 20 69 6e 20 74 68 65 0a 20 20 20 20 22  red in the.    "
149a0 6c 65 76 65 6c 22 20 66 69 65 6c 64 2c 20 74 68  level" field, th
149b0 65 20 6d 6f 72 65 20 72 65 63 65 6e 74 6c 79 20  e more recently 
149c0 74 68 65 20 73 65 67 6d 65 6e 74 20 62 2d 74 72  the segment b-tr
149d0 65 65 20 77 61 73 20 63 72 65 61 74 65 64 2e 20  ee was created. 
149e0 49 66 20 74 77 6f 0a 20 20 20 20 73 65 67 6d 65  If two.    segme
149f0 6e 74 20 62 2d 74 72 65 65 73 20 61 72 65 20 6f  nt b-trees are o
14a00 66 20 74 68 65 20 73 61 6d 65 20 22 6c 65 76 65  f the same "leve
14a10 6c 22 2c 20 74 68 65 20 73 65 67 6d 65 6e 74 20  l", the segment 
14a20 77 69 74 68 20 74 68 65 20 6c 61 72 67 65 72 0a  with the larger.
14a30 20 20 20 20 76 61 6c 75 65 20 73 74 6f 72 65 64      value stored
14a40 20 69 6e 20 74 68 65 20 22 69 64 78 22 20 63 6f   in the "idx" co
14a50 6c 75 6d 6e 20 69 73 20 6d 6f 72 65 20 72 65 63  lumn is more rec
14a60 65 6e 74 2e 20 54 68 65 20 50 52 49 4d 41 52 59  ent. The PRIMARY
14a70 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 0a   KEY constraint.
14a80 20 20 20 20 6f 6e 20 74 68 65 20 25 5f 73 65 67      on the %_seg
14a90 64 69 72 20 74 61 62 6c 65 20 70 72 65 76 65 6e  dir table preven
14aa0 74 73 20 61 6e 79 20 74 77 6f 20 73 65 67 6d 65  ts any two segme
14ab0 6e 74 73 20 66 72 6f 6d 20 68 61 76 69 6e 67 20  nts from having 
14ac0 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 0a 20  the same value. 
14ad0 20 20 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20     for both the 
14ae0 22 6c 65 76 65 6c 22 20 61 6e 64 20 22 69 64 78  "level" and "idx
14af0 22 20 66 69 65 6c 64 73 2e 0a 20 20 3c 74 72 3e  " fields..  <tr>
14b00 3c 74 64 3e 69 64 78 20 20 20 20 20 20 20 20 20  <td>idx         
14b10 20 20 20 20 20 3c 74 64 3e 20 53 65 65 20 61 62       <td> See ab
14b20 6f 76 65 2e 0a 20 20 3c 74 72 3e 3c 74 64 3e 73  ove..  <tr><td>s
14b30 74 61 72 74 5f 62 6c 6f 63 6b 20 20 20 20 20 20  tart_block      
14b40 3c 74 64 3e 0a 20 20 20 20 54 68 65 20 62 6c 6f  <td>.    The blo
14b50 63 6b 69 64 20 74 68 61 74 20 63 6f 72 72 65 73  ckid that corres
14b60 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 6e 6f 64  ponds to the nod
14b70 65 20 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c  e with the small
14b80 65 73 74 20 62 6c 6f 63 6b 69 64 20 74 68 61 74  est blockid that
14b90 20 0a 20 20 20 20 62 65 6c 6f 6e 67 73 20 74 6f   .    belongs to
14ba0 20 74 68 69 73 20 73 65 67 6d 65 6e 74 20 62 2d   this segment b-
14bb0 74 72 65 65 2e 20 4f 72 20 7a 65 72 6f 20 69 66  tree. Or zero if
14bc0 20 74 68 65 20 65 6e 74 69 72 65 20 73 65 67 6d   the entire segm
14bd0 65 6e 74 20 62 2d 74 72 65 65 0a 20 20 20 20 66  ent b-tree.    f
14be0 69 74 73 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20  its on the root 
14bf0 6e 6f 64 65 2e 20 49 66 20 69 74 20 65 78 69 73  node. If it exis
14c00 74 73 2c 20 74 68 69 73 20 6e 6f 64 65 20 69 73  ts, this node is
14c10 20 61 6c 77 61 79 73 20 61 20 6c 65 61 66 20 6e   always a leaf n
14c20 6f 64 65 2e 0a 20 20 3c 74 72 3e 3c 74 64 3e 6c  ode..  <tr><td>l
14c30 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 20  eaves_end_block 
14c40 3c 74 64 3e 0a 20 20 20 20 54 68 65 20 62 6c 6f  <td>.    The blo
14c50 63 6b 69 64 20 74 68 61 74 20 63 6f 72 72 65 73  ckid that corres
14c60 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 6c 65 61  ponds to the lea
14c70 66 20 6e 6f 64 65 20 77 69 74 68 20 74 68 65 20  f node with the 
14c80 6c 61 72 67 65 73 74 20 62 6c 6f 63 6b 69 64 20  largest blockid 
14c90 0a 20 20 20 20 74 68 61 74 20 62 65 6c 6f 6e 67  .    that belong
14ca0 73 20 74 6f 20 74 68 69 73 20 73 65 67 6d 65 6e  s to this segmen
14cb0 74 20 62 2d 74 72 65 65 2e 20 4f 72 20 7a 65 72  t b-tree. Or zer
14cc0 6f 20 69 66 20 74 68 65 20 65 6e 74 69 72 65 20  o if the entire 
14cd0 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 0a 20  segment b-tree. 
14ce0 20 20 20 66 69 74 73 20 6f 6e 20 74 68 65 20 72     fits on the r
14cf0 6f 6f 74 20 6e 6f 64 65 2e 0a 20 20 3c 74 72 3e  oot node..  <tr>
14d00 3c 74 64 3e 65 6e 64 5f 62 6c 6f 63 6b 20 3c 74  <td>end_block <t
14d10 64 3e 0a 20 20 20 20 54 68 65 20 62 6c 6f 63 6b  d>.    The block
14d20 69 64 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f  id that correspo
14d30 6e 64 73 20 74 6f 20 74 68 65 20 69 6e 74 65 72  nds to the inter
14d40 69 6f 72 20 6e 6f 64 65 20 77 69 74 68 20 74 68  ior node with th
14d50 65 20 6c 61 72 67 65 73 74 20 0a 20 20 20 20 62  e largest .    b
14d60 6c 6f 63 6b 69 64 20 74 68 61 74 20 62 65 6c 6f  lockid that belo
14d70 6e 67 73 20 74 6f 20 74 68 69 73 20 73 65 67 6d  ngs to this segm
14d80 65 6e 74 20 62 2d 74 72 65 65 2e 20 20 4f 72 20  ent b-tree.  Or 
14d90 7a 65 72 6f 20 69 66 20 74 68 65 20 65 6e 74 69  zero if the enti
14da0 72 65 20 73 65 67 6d 65 6e 74 0a 20 20 20 20 62  re segment.    b
14db0 2d 74 72 65 65 20 66 69 74 73 20 6f 6e 20 74 68  -tree fits on th
14dc0 65 20 72 6f 6f 74 20 6e 6f 64 65 2e 20 49 66 20  e root node. If 
14dd0 69 74 20 65 78 69 73 74 73 2c 20 74 68 69 73 20  it exists, this 
14de0 6e 6f 64 65 20 69 73 20 61 6c 77 61 79 73 20 61  node is always a
14df0 6e 0a 20 20 20 20 69 6e 74 65 72 69 6f 72 20 6e  n.    interior n
14e00 6f 64 65 2e 0a 20 20 3c 74 72 3e 3c 74 64 3e 72  ode..  <tr><td>r
14e10 6f 6f 74 20 20 20 20 20 20 20 20 20 20 20 20 20  oot             
14e20 3c 74 64 3e 0a 20 20 20 20 42 6c 6f 62 20 63 6f  <td>.    Blob co
14e30 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 72 6f 6f  ntaining the roo
14e40 74 20 6e 6f 64 65 20 6f 66 20 74 68 65 20 73 65  t node of the se
14e50 67 6d 65 6e 74 20 62 2d 74 72 65 65 2e 0a 3c 2f  gment b-tree..</
14e60 74 61 62 6c 65 3e 0a 0a 3c 70 3e 0a 20 20 41 70  table>..<p>.  Ap
14e70 61 72 74 20 66 72 6f 6d 20 74 68 65 20 72 6f 6f  art from the roo
14e80 74 20 6e 6f 64 65 2c 20 74 68 65 20 6e 6f 64 65  t node, the node
14e90 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20 61  s that make up a
14ea0 20 73 69 6e 67 6c 65 20 73 65 67 6d 65 6e 74 20   single segment 
14eb0 62 2d 74 72 65 65 20 61 72 65 0a 20 20 61 6c 77  b-tree are.  alw
14ec0 61 79 73 20 73 74 6f 72 65 64 20 75 73 69 6e 67  ays stored using
14ed0 20 61 20 63 6f 6e 74 69 67 75 6f 75 73 20 73 65   a contiguous se
14ee0 71 75 65 6e 63 65 20 6f 66 20 62 6c 6f 63 6b 69  quence of blocki
14ef0 64 73 2e 20 46 75 72 74 68 65 72 6d 6f 72 65 2c  ds. Furthermore,
14f00 20 74 68 65 0a 20 20 6e 6f 64 65 73 20 74 68 61   the.  nodes tha
14f10 74 20 6d 61 6b 65 20 75 70 20 61 20 73 69 6e 67  t make up a sing
14f20 6c 65 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  le level of the 
14f30 62 2d 74 72 65 65 20 61 72 65 20 74 68 65 6d 73  b-tree are thems
14f40 65 6c 76 65 73 20 73 74 6f 72 65 64 20 61 73 0a  elves stored as.
14f50 20 20 61 20 63 6f 6e 74 69 67 75 6f 75 73 20 62    a contiguous b
14f60 6c 6f 63 6b 2c 20 69 6e 20 62 2d 74 72 65 65 20  lock, in b-tree 
14f70 6f 72 64 65 72 2e 20 54 68 65 20 63 6f 6e 74 69  order. The conti
14f80 67 75 6f 75 73 20 73 65 71 75 65 6e 63 65 20 6f  guous sequence o
14f90 66 20 62 6c 6f 63 6b 69 64 73 0a 20 20 75 73 65  f blockids.  use
14fa0 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 62  d to store the b
14fb0 2d 74 72 65 65 20 6c 65 61 76 65 73 20 61 72 65  -tree leaves are
14fc0 20 61 6c 6c 6f 63 61 74 65 64 20 73 74 61 72 74   allocated start
14fd0 69 6e 67 20 77 69 74 68 20 74 68 65 20 62 6c 6f  ing with the blo
14fe0 63 6b 69 64 0a 20 20 76 61 6c 75 65 20 73 74 6f  ckid.  value sto
14ff0 72 65 64 20 69 6e 20 74 68 65 20 22 73 74 61 72  red in the "star
15000 74 5f 62 6c 6f 63 6b 22 20 63 6f 6c 75 6d 6e 20  t_block" column 
15010 6f 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  of the correspon
15020 64 69 6e 67 20 25 5f 73 65 67 64 69 72 20 72 6f  ding %_segdir ro
15030 77 2c 0a 20 20 61 6e 64 20 66 69 6e 69 73 68 69  w,.  and finishi
15040 6e 67 20 61 74 20 74 68 65 20 62 6c 6f 63 6b 69  ng at the blocki
15050 64 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  d value stored i
15060 6e 20 74 68 65 20 22 6c 65 61 76 65 73 5f 65 6e  n the "leaves_en
15070 64 5f 62 6c 6f 63 6b 22 0a 20 20 66 69 65 6c 64  d_block".  field
15080 20 6f 66 20 74 68 65 20 73 61 6d 65 20 72 6f 77   of the same row
15090 2e 20 49 74 20 69 73 20 74 68 65 72 65 66 6f 72  . It is therefor
150a0 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 69 74  e possible to it
150b0 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 61 6c  erate through al
150c0 6c 20 74 68 65 0a 20 20 6c 65 61 76 65 73 20 6f  l the.  leaves o
150d0 66 20 61 20 73 65 67 6d 65 6e 74 20 62 2d 74 72  f a segment b-tr
150e0 65 65 2c 20 69 6e 20 6b 65 79 20 6f 72 64 65 72  ee, in key order
150f0 2c 20 62 79 20 74 72 61 76 65 72 73 69 6e 67 20  , by traversing 
15100 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 0a  the %_segments .
15110 20 20 74 61 62 6c 65 20 69 6e 20 62 6c 6f 63 6b    table in block
15120 69 64 20 6f 72 64 65 72 20 66 72 6f 6d 20 22 73  id order from "s
15130 74 61 72 74 5f 62 6c 6f 63 6b 22 20 74 6f 20 22  tart_block" to "
15140 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b  leaves_end_block
15150 22 2e 20 20 0a 0a 3c 68 33 3e 53 65 67 6d 65 6e  ".  ..<h3>Segmen
15160 74 20 42 2d 54 72 65 65 20 4c 65 61 66 20 4e 6f  t B-Tree Leaf No
15170 64 65 73 3c 2f 68 33 3e 0a 0a 3c 70 3e 0a 20 20  des</h3>..<p>.  
15180 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 69  The following di
15190 61 67 72 61 6d 20 64 65 70 69 63 74 73 20 74 68  agram depicts th
151a0 65 20 66 6f 72 6d 61 74 20 6f 66 20 61 20 73 65  e format of a se
151b0 67 6d 65 6e 74 20 62 2d 74 72 65 65 20 6c 65 61  gment b-tree lea
151c0 66 20 6e 6f 64 65 2e 0a 0a 3c 63 65 6e 74 65 72  f node...<center
151d0 3e 0a 20 20 3c 69 6d 67 20 73 72 63 3d 69 6d 61  >.  <img src=ima
151e0 67 65 73 2f 66 74 73 33 5f 6c 65 61 66 5f 6e 6f  ges/fts3_leaf_no
151f0 64 65 2e 70 6e 67 3e 0a 20 20 3c 70 3e 20 53 65  de.png>.  <p> Se
15200 67 6d 65 6e 74 20 42 2d 54 72 65 65 20 4c 65 61  gment B-Tree Lea
15210 66 20 4e 6f 64 65 20 46 6f 72 6d 61 74 0a 3c 2f  f Node Format.</
15220 63 65 6e 74 65 72 3e 0a 0a 3c 70 3e 0a 20 20 54  center>..<p>.  T
15230 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 73 74  he first term st
15240 6f 72 65 64 20 6f 6e 20 65 61 63 68 20 6e 6f 64  ored on each nod
15250 65 20 28 22 54 65 72 6d 20 31 22 20 69 6e 20 74  e ("Term 1" in t
15260 68 65 20 66 69 67 75 72 65 20 61 62 6f 76 65 29  he figure above)
15270 20 69 73 0a 20 20 73 74 6f 72 65 64 20 76 65 72   is.  stored ver
15280 62 61 74 69 6d 2e 20 45 61 63 68 20 73 75 62 73  batim. Each subs
15290 65 71 75 65 6e 74 20 74 65 72 6d 20 69 73 20 70  equent term is p
152a0 72 65 66 69 78 2d 63 6f 6d 70 72 65 73 73 65 64  refix-compressed
152b0 20 77 69 74 68 20 72 65 73 70 65 63 74 0a 20 20   with respect.  
152c0 74 6f 20 69 74 73 20 70 72 65 64 65 63 65 73 73  to its predecess
152d0 6f 72 2e 20 54 65 72 6d 73 20 61 72 65 20 73 74  or. Terms are st
152e0 6f 72 65 64 20 77 69 74 68 69 6e 20 61 20 70 61  ored within a pa
152f0 67 65 20 69 6e 20 73 6f 72 74 65 64 20 28 6d 65  ge in sorted (me
15300 6d 63 6d 70 29 0a 20 20 6f 72 64 65 72 2e 0a 0a  mcmp).  order...
15310 3c 68 33 3e 53 65 67 6d 65 6e 74 20 42 2d 54 72  <h3>Segment B-Tr
15320 65 65 20 49 6e 74 65 72 69 6f 72 20 4e 6f 64 65  ee Interior Node
15330 73 3c 2f 68 33 3e 0a 0a 3c 70 3e 0a 20 20 54 68  s</h3>..<p>.  Th
15340 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 69 61 67  e following diag
15350 72 61 6d 20 64 65 70 69 63 74 73 20 74 68 65 20  ram depicts the 
15360 66 6f 72 6d 61 74 20 6f 66 20 61 20 73 65 67 6d  format of a segm
15370 65 6e 74 20 62 2d 74 72 65 65 20 69 6e 74 65 72  ent b-tree inter
15380 69 6f 72 20 0a 20 20 28 6e 6f 6e 2d 6c 65 61 66  ior .  (non-leaf
15390 29 20 6e 6f 64 65 2e 0a 0a 3c 63 65 6e 74 65 72  ) node...<center
153a0 3e 0a 20 20 3c 69 6d 67 20 73 72 63 3d 69 6d 61  >.  <img src=ima
153b0 67 65 73 2f 66 74 73 33 5f 69 6e 74 65 72 69 6f  ges/fts3_interio
153c0 72 5f 6e 6f 64 65 2e 70 6e 67 3e 0a 20 20 3c 70  r_node.png>.  <p
153d0 3e 20 53 65 67 6d 65 6e 74 20 42 2d 54 72 65 65  > Segment B-Tree
153e0 20 49 6e 74 65 72 69 6f 72 20 4e 6f 64 65 20 46   Interior Node F
153f0 6f 72 6d 61 74 0a 3c 2f 63 65 6e 74 65 72 3e 0a  ormat.</center>.
15400 0a 0a 3c 68 32 3e 44 6f 63 6c 69 73 74 20 46 6f  ..<h2>Doclist Fo
15410 72 6d 61 74 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a 20  rmat</h2>..<p>. 
15420 20 41 20 64 6f 63 6c 69 73 74 20 63 6f 6e 73 69   A doclist consi
15430 73 74 73 20 6f 66 20 61 6e 20 61 72 72 61 79 20  sts of an array 
15440 6f 66 20 36 34 2d 62 69 74 20 73 69 67 6e 65 64  of 64-bit signed
15450 20 69 6e 74 65 67 65 72 73 2c 20 73 65 72 69 61   integers, seria
15460 6c 69 7a 65 64 20 75 73 69 6e 67 0a 20 20 74 68  lized using.  th
15470 65 20 46 54 53 20 76 61 72 69 6e 74 20 66 6f 72  e FTS varint for
15480 6d 61 74 2e 20 45 61 63 68 20 64 6f 63 6c 69 73  mat. Each doclis
15490 74 20 65 6e 74 72 79 20 69 73 20 6d 61 64 65 20  t entry is made 
154a0 75 70 20 6f 66 20 61 20 73 65 72 69 65 73 20 6f  up of a series o
154b0 66 20 74 77 6f 20 0a 20 20 6f 72 20 6d 6f 72 65  f two .  or more
154c0 20 69 6e 74 65 67 65 72 73 2c 20 61 73 20 66 6f   integers, as fo
154d0 6c 6c 6f 77 73 3a 0a 0a 3c 6f 6c 3e 0a 20 20 3c  llows:..<ol>.  <
154e0 6c 69 3e 20 54 68 65 20 64 6f 63 69 64 20 76 61  li> The docid va
154f0 6c 75 65 2e 20 54 68 65 20 66 69 72 73 74 20 65  lue. The first e
15500 6e 74 72 79 20 69 6e 20 61 20 64 6f 63 6c 69 73  ntry in a doclis
15510 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c  t contains the l
15520 69 74 65 72 61 6c 20 64 6f 63 69 64 0a 20 20 20  iteral docid.   
15530 20 20 20 20 76 61 6c 75 65 2e 20 54 68 65 20 66      value. The f
15540 69 72 73 74 20 66 69 65 6c 64 20 6f 66 20 65 61  irst field of ea
15550 63 68 20 73 75 62 73 65 71 75 65 6e 74 20 64 6f  ch subsequent do
15560 63 6c 69 73 74 20 65 6e 74 72 79 20 63 6f 6e 74  clist entry cont
15570 61 69 6e 73 20 74 68 65 20 0a 20 20 20 20 20 20  ains the .      
15580 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
15590 65 65 6e 20 74 68 65 20 6e 65 77 20 64 6f 63 69  een the new doci
155a0 64 20 61 6e 64 20 74 68 65 20 70 72 65 76 69 6f  d and the previo
155b0 75 73 20 6f 6e 65 20 28 61 6c 77 61 79 73 20 61  us one (always a
155c0 20 70 6f 73 69 74 69 76 65 20 0a 20 20 20 20 20   positive .     
155d0 20 20 6e 75 6d 62 65 72 29 2e 0a 20 20 3c 6c 69    number)..  <li
155e0 3e 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 74  > Zero or more t
155f0 65 72 6d 2d 6f 66 66 73 65 74 20 6c 69 73 74 73  erm-offset lists
15600 2e 20 41 20 74 65 72 6d 2d 6f 66 66 73 65 74 20  . A term-offset 
15610 6c 69 73 74 20 69 73 20 70 72 65 73 65 6e 74 20  list is present 
15620 66 6f 72 20 65 61 63 68 0a 20 20 20 20 20 20 20  for each.       
15630 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 46 54  column of the FT
15640 53 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  S virtual table 
15650 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
15660 65 20 74 65 72 6d 2e 20 41 20 74 65 72 6d 2d 6f  e term. A term-o
15670 66 66 73 65 74 0a 20 20 20 20 20 20 20 6c 69 73  ffset.       lis
15680 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68  t consists of th
15690 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20  e following:.   
156a0 20 20 3c 6f 6c 3e 0a 20 20 20 20 20 20 20 3c 6c    <ol>.       <l
156b0 69 3e 20 43 6f 6e 73 74 61 6e 74 20 76 61 6c 75  i> Constant valu
156c0 65 20 31 2e 20 54 68 69 73 20 66 69 65 6c 64 20  e 1. This field 
156d0 69 73 20 6f 6d 69 74 74 65 64 20 66 6f 72 20 61  is omitted for a
156e0 6e 79 20 74 65 72 6d 2d 6f 66 66 73 65 74 20 6c  ny term-offset l
156f0 69 73 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  ist.            
15700 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
15710 63 6f 6c 75 6d 6e 20 30 2e 0a 20 20 20 20 20 20  column 0..      
15720 20 3c 6c 69 3e 20 54 68 65 20 63 6f 6c 75 6d 6e   <li> The column
15730 20 6e 75 6d 62 65 72 20 28 31 20 66 6f 72 20 74   number (1 for t
15740 68 65 20 73 65 63 6f 6e 64 20 6c 65 66 74 6d 6f  he second leftmo
15750 73 74 20 63 6f 6c 75 6d 6e 2c 20 65 74 63 2e 29  st column, etc.)
15760 2e 20 54 68 69 73 0a 20 20 20 20 20 20 20 20 20  . This.         
15770 20 20 20 66 69 65 6c 64 20 69 73 20 6f 6d 69 74     field is omit
15780 74 65 64 20 66 6f 72 20 61 6e 79 20 74 65 72 6d  ted for any term
15790 2d 6f 66 66 73 65 74 20 6c 69 73 74 20 61 73 73  -offset list ass
157a0 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 6f 6c  ociated with col
157b0 75 6d 6e 20 30 2e 0a 20 20 20 20 20 20 20 3c 6c  umn 0..       <l
157c0 69 3e 20 41 20 6c 69 73 74 20 6f 66 20 74 65 72  i> A list of ter
157d0 6d 2d 6f 66 66 73 65 74 73 2c 20 73 6f 72 74 65  m-offsets, sorte
157e0 64 20 66 72 6f 6d 20 73 6d 61 6c 6c 65 73 74 20  d from smallest 
157f0 74 6f 20 6c 61 72 67 65 73 74 2e 20 49 6e 73 74  to largest. Inst
15800 65 61 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  ead.            
15810 6f 66 20 73 74 6f 72 69 6e 67 20 74 68 65 20 74  of storing the t
15820 65 72 6d 2d 6f 66 66 73 65 74 20 76 61 6c 75 65  erm-offset value
15830 20 6c 69 74 65 72 61 6c 6c 79 2c 20 65 61 63 68   literally, each
15840 20 69 6e 74 65 67 65 72 20 73 74 6f 72 65 64 20   integer stored 
15850 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20  .            is 
15860 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  the difference b
15870 65 74 77 65 65 6e 20 74 68 65 20 63 75 72 72 65  etween the curre
15880 6e 74 20 74 65 72 6d 2d 6f 66 66 73 65 74 20 61  nt term-offset a
15890 6e 64 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  nd the previous 
158a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 6e 65  .            one
158b0 20 28 6f 72 20 7a 65 72 6f 20 69 66 20 74 68 65   (or zero if the
158c0 20 63 75 72 72 65 6e 74 20 74 65 72 6d 2d 6f 66   current term-of
158d0 66 73 65 74 20 69 73 20 74 68 65 20 66 69 72 73  fset is the firs
158e0 74 29 2c 20 70 6c 75 73 20 32 2e 0a 20 20 20 20  t), plus 2..    
158f0 20 3c 2f 6f 6c 3e 0a 20 20 3c 6c 69 3e 20 43 6f   </ol>.  <li> Co
15900 6e 73 74 61 6e 74 20 76 61 6c 75 65 20 30 2e 0a  nstant value 0..
15910 3c 2f 6f 6c 3e 0a 0a 3c 63 65 6e 74 65 72 3e 0a  </ol>..<center>.
15920 20 20 3c 69 6d 67 20 73 72 63 3d 69 6d 61 67 65    <img src=image
15930 73 2f 66 74 73 33 5f 64 6f 63 6c 69 73 74 32 2e  s/fts3_doclist2.
15940 70 6e 67 3e 0a 20 20 3c 70 3e 20 46 54 53 33 20  png>.  <p> FTS3 
15950 44 6f 63 6c 69 73 74 20 46 6f 72 6d 61 74 0a 3c  Doclist Format.<
15960 2f 63 65 6e 74 65 72 3e 0a 0a 3c 63 65 6e 74 65  /center>..<cente
15970 72 3e 0a 20 20 3c 69 6d 67 20 73 72 63 3d 69 6d  r>.  <img src=im
15980 61 67 65 73 2f 66 74 73 33 5f 64 6f 63 6c 69 73  ages/fts3_doclis
15990 74 2e 70 6e 67 3e 0a 20 20 3c 70 3e 20 46 54 53  t.png>.  <p> FTS
159a0 20 44 6f 63 6c 69 73 74 20 45 6e 74 72 79 20 46   Doclist Entry F
159b0 6f 72 6d 61 74 0a 3c 2f 63 65 6e 74 65 72 3e 0a  ormat.</center>.
159c0 0a 3c 70 3e 0a 20 20 46 6f 72 20 64 6f 63 6c 69  .<p>.  For docli
159d0 73 74 73 20 66 6f 72 20 77 68 69 63 68 20 74 68  sts for which th
159e0 65 20 74 65 72 6d 20 61 70 70 65 61 72 73 20 69  e term appears i
159f0 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  n more than one 
15a00 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 46 54  column of the FT
15a10 53 0a 20 20 76 69 72 74 75 61 6c 20 74 61 62 6c  S.  virtual tabl
15a20 65 2c 20 74 65 72 6d 2d 6f 66 66 73 65 74 20 6c  e, term-offset l
15a30 69 73 74 73 20 77 69 74 68 69 6e 20 74 68 65 20  ists within the 
15a40 64 6f 63 6c 69 73 74 20 61 72 65 20 73 74 6f 72  doclist are stor
15a50 65 64 20 69 6e 20 63 6f 6c 75 6d 6e 20 0a 20 20  ed in column .  
15a60 6e 75 6d 62 65 72 20 6f 72 64 65 72 2e 20 54 68  number order. Th
15a70 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  is ensures that 
15a80 74 68 65 20 74 65 72 6d 2d 6f 66 66 73 65 74 20  the term-offset 
15a90 6c 69 73 74 20 61 73 73 6f 63 69 61 74 65 64 20  list associated 
15aa0 77 69 74 68 20 0a 20 20 63 6f 6c 75 6d 6e 20 30  with .  column 0
15ab0 20 28 69 66 20 61 6e 79 29 20 69 73 20 61 6c 77   (if any) is alw
15ac0 61 79 73 20 66 69 72 73 74 2c 20 61 6c 6c 6f 77  ays first, allow
15ad0 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 74 77  ing the first tw
15ae0 6f 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 0a  o fields of the.
15af0 20 20 74 65 72 6d 2d 6f 66 66 73 65 74 20 6c 69    term-offset li
15b00 73 74 20 74 6f 20 62 65 20 6f 6d 69 74 74 65 64  st to be omitted
15b10 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 0a   in this case...
15b20 3c 68 31 20 69 64 3d 61 70 70 65 6e 64 69 78 5f  <h1 id=appendix_
15b30 61 20 6e 6f 6e 75 6d 62 65 72 20 74 61 67 73 3d  a nonumber tags=
15b40 22 73 65 61 72 63 68 20 61 70 70 6c 69 63 61 74  "search applicat
15b50 69 6f 6e 20 74 69 70 73 22 3e 0a 20 20 41 70 70  ion tips">.  App
15b60 65 6e 64 69 78 20 41 3a 20 53 65 61 72 63 68 20  endix A: Search 
15b70 41 70 70 6c 69 63 61 74 69 6f 6e 20 54 69 70 73  Application Tips
15b80 0a 3c 2f 68 31 3e 0a 0a 3c 70 3e 0a 20 20 46 54  .</h1>..<p>.  FT
15b90 53 20 69 73 20 70 72 69 6d 61 72 69 6c 79 20 64  S is primarily d
15ba0 65 73 69 67 6e 65 64 20 74 6f 20 73 75 70 70 6f  esigned to suppo
15bb0 72 74 20 42 6f 6f 6c 65 61 6e 20 66 75 6c 6c 2d  rt Boolean full-
15bc0 74 65 78 74 20 71 75 65 72 69 65 73 20 2d 20 71  text queries - q
15bd0 75 65 72 69 65 73 0a 20 20 74 6f 20 66 69 6e 64  ueries.  to find
15be0 20 74 68 65 20 73 65 74 20 6f 66 20 64 6f 63 75   the set of docu
15bf0 6d 65 6e 74 73 20 74 68 61 74 20 6d 61 74 63 68  ments that match
15c00 20 61 20 73 70 65 63 69 66 69 65 64 20 63 72 69   a specified cri
15c10 74 65 72 69 61 2e 20 48 6f 77 65 76 65 72 2c 20  teria. However, 
15c20 6d 61 6e 79 20 0a 20 20 28 6d 6f 73 74 3f 29 20  many .  (most?) 
15c30 73 65 61 72 63 68 20 61 70 70 6c 69 63 61 74 69  search applicati
15c40 6f 6e 73 20 72 65 71 75 69 72 65 20 74 68 61 74  ons require that
15c50 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 6f 6d   results are som
15c60 65 68 6f 77 20 72 61 6e 6b 65 64 20 69 6e 20 6f  ehow ranked in o
15c70 72 64 65 72 0a 20 20 6f 66 20 22 72 65 6c 65 76  rder.  of "relev
15c80 61 6e 63 65 22 2c 20 77 68 65 72 65 20 22 72 65  ance", where "re
15c90 6c 65 76 61 6e 63 65 22 20 69 73 20 64 65 66 69  levance" is defi
15ca0 6e 65 64 20 61 73 20 74 68 65 20 6c 69 6b 65 6c  ned as the likel
15cb0 69 68 6f 6f 64 20 74 68 61 74 20 74 68 65 20 75  ihood that the u
15cc0 73 65 72 0a 20 20 77 68 6f 20 70 65 72 66 6f 72  ser.  who perfor
15cd0 6d 65 64 20 74 68 65 20 73 65 61 72 63 68 20 69  med the search i
15ce0 73 20 69 6e 74 65 72 65 73 74 65 64 20 69 6e 20  s interested in 
15cf0 61 20 73 70 65 63 69 66 69 63 20 65 6c 65 6d 65  a specific eleme
15d00 6e 74 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e  nt of the return
15d10 65 64 0a 20 20 73 65 74 20 6f 66 20 64 6f 63 75  ed.  set of docu
15d20 6d 65 6e 74 73 2e 20 57 68 65 6e 20 75 73 69 6e  ments. When usin
15d30 67 20 61 20 73 65 61 72 63 68 20 65 6e 67 69 6e  g a search engin
15d40 65 20 74 6f 20 66 69 6e 64 20 64 6f 63 75 6d 65  e to find docume
15d50 6e 74 73 20 6f 6e 20 74 68 65 20 77 6f 72 6c 64  nts on the world
15d60 0a 20 20 77 69 64 65 20 77 65 62 2c 20 74 68 65  .  wide web, the
15d70 20 75 73 65 72 20 65 78 70 65 63 74 73 20 74 68   user expects th
15d80 61 74 20 74 68 65 20 6d 6f 73 74 20 75 73 65 66  at the most usef
15d90 75 6c 2c 20 6f 72 20 22 72 65 6c 65 76 61 6e 74  ul, or "relevant
15da0 22 2c 20 64 6f 63 75 6d 65 6e 74 73 20 0a 20 20  ", documents .  
15db0 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
15dc0 20 61 73 20 74 68 65 20 66 69 72 73 74 20 70 61   as the first pa
15dd0 67 65 20 6f 66 20 72 65 73 75 6c 74 73 2c 20 61  ge of results, a
15de0 6e 64 20 74 68 61 74 20 65 61 63 68 20 73 75 62  nd that each sub
15df0 73 65 71 75 65 6e 74 20 70 61 67 65 20 0a 20 20  sequent page .  
15e00 63 6f 6e 74 61 69 6e 73 20 70 72 6f 67 72 65 73  contains progres
15e10 73 69 76 65 6c 79 20 6c 65 73 73 20 72 65 6c 65  sively less rele
15e20 76 61 6e 74 20 72 65 73 75 6c 74 73 2e 20 45 78  vant results. Ex
15e30 61 63 74 6c 79 20 68 6f 77 20 61 20 6d 61 63 68  actly how a mach
15e40 69 6e 65 20 63 61 6e 20 0a 20 20 64 65 74 65 72  ine can .  deter
15e50 6d 69 6e 65 20 64 6f 63 75 6d 65 6e 74 20 72 65  mine document re
15e60 6c 65 76 61 6e 63 65 20 62 61 73 65 64 20 6f 6e  levance based on
15e70 20 61 20 75 73 65 72 73 20 71 75 65 72 79 20 69   a users query i
15e80 73 20 61 20 63 6f 6d 70 6c 69 63 61 74 65 64 20  s a complicated 
15e90 70 72 6f 62 6c 65 6d 0a 20 20 61 6e 64 20 74 68  problem.  and th
15ea0 65 20 73 75 62 6a 65 63 74 20 6f 66 20 6d 75 63  e subject of muc
15eb0 68 20 6f 6e 67 6f 69 6e 67 20 72 65 73 65 61 72  h ongoing resear
15ec0 63 68 2e 0a 0a 3c 70 3e 0a 20 20 4f 6e 65 20 76  ch...<p>.  One v
15ed0 65 72 79 20 73 69 6d 70 6c 65 20 73 63 68 65 6d  ery simple schem
15ee0 65 20 6d 69 67 68 74 20 62 65 20 74 6f 20 63 6f  e might be to co
15ef0 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
15f00 66 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74  f instances of t
15f10 68 65 20 0a 20 20 75 73 65 72 73 20 73 65 61 72  he .  users sear
15f20 63 68 20 74 65 72 6d 73 20 69 6e 20 65 61 63 68  ch terms in each
15f30 20 72 65 73 75 6c 74 20 64 6f 63 75 6d 65 6e 74   result document
15f40 2e 20 54 68 6f 73 65 20 64 6f 63 75 6d 65 6e 74  . Those document
15f50 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 0a 20  s that contain. 
15f60 20 6d 61 6e 79 20 69 6e 73 74 61 6e 63 65 73 20   many instances 
15f70 6f 66 20 74 68 65 20 74 65 72 6d 73 20 61 72 65  of the terms are
15f80 20 63 6f 6e 73 69 64 65 72 65 64 20 6d 6f 72 65   considered more
15f90 20 72 65 6c 65 76 61 6e 74 20 74 68 61 6e 20 74   relevant than t
15fa0 68 6f 73 65 20 77 69 74 68 0a 20 20 61 20 73 6d  hose with.  a sm
15fb0 61 6c 6c 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  all number of in
15fc0 73 74 61 6e 63 65 73 20 6f 66 20 65 61 63 68 20  stances of each 
15fd0 74 65 72 6d 2e 20 49 6e 20 61 6e 20 46 54 53 20  term. In an FTS 
15fe0 61 70 70 6c 69 63 61 74 69 6f 6e 2c 20 74 68 65  application, the
15ff0 20 0a 20 20 6e 75 6d 62 65 72 20 6f 66 20 74 65   .  number of te
16000 72 6d 20 69 6e 73 74 61 6e 63 65 73 20 69 6e 20  rm instances in 
16010 65 61 63 68 20 72 65 73 75 6c 74 20 63 6f 75 6c  each result coul
16020 64 20 62 65 20 64 65 74 65 72 6d 69 6e 65 64 20  d be determined 
16030 62 79 20 63 6f 75 6e 74 69 6e 67 0a 20 20 74 68  by counting.  th
16040 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 74 65  e number of inte
16050 67 65 72 73 20 69 6e 20 74 68 65 20 72 65 74 75  gers in the retu
16060 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  rn value of the 
16070 5b 6f 66 66 73 65 74 73 5d 20 66 75 6e 63 74 69  [offsets] functi
16080 6f 6e 2e 0a 20 20 54 68 65 20 66 6f 6c 6c 6f 77  on..  The follow
16090 69 6e 67 20 65 78 61 6d 70 6c 65 20 73 68 6f 77  ing example show
160a0 73 20 61 20 71 75 65 72 79 20 74 68 61 74 20 63  s a query that c
160b0 6f 75 6c 64 20 62 65 20 75 73 65 64 20 74 6f 20  ould be used to 
160c0 6f 62 74 61 69 6e 20 74 68 65 0a 20 20 74 65 6e  obtain the.  ten
160d0 20 6d 6f 73 74 20 72 65 6c 65 76 61 6e 74 20 72   most relevant r
160e0 65 73 75 6c 74 73 20 66 6f 72 20 61 20 71 75 65  esults for a que
160f0 72 79 20 65 6e 74 65 72 65 64 20 62 79 20 74 68  ry entered by th
16100 65 20 75 73 65 72 3a 0a 0a 3c 63 6f 64 65 62 6c  e user:..<codebl
16110 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d 20 54 68 69  ock>.  <i>-- Thi
16120 73 20 65 78 61 6d 70 6c 65 20 28 61 6e 64 20 61  s example (and a
16130 6c 6c 20 6f 74 68 65 72 73 20 69 6e 20 74 68 69  ll others in thi
16140 73 20 73 65 63 74 69 6f 6e 29 20 61 73 73 75 6d  s section) assum
16150 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  es the following
16160 20 73 63 68 65 6d 61 3c 2f 69 3e 0a 20 20 43 52   schema</i>.  CR
16170 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
16180 4c 45 20 64 6f 63 75 6d 65 6e 74 73 20 55 53 49  LE documents USI
16190 4e 47 20 66 74 73 33 28 74 69 74 6c 65 2c 20 63  NG fts3(title, c
161a0 6f 6e 74 65 6e 74 29 3b 0a 0a 20 20 3c 69 3e 2d  ontent);..  <i>-
161b0 2d 20 41 73 73 75 6d 69 6e 67 20 74 68 65 20 61  - Assuming the a
161c0 70 70 6c 69 63 61 74 69 6f 6e 20 68 61 73 20 73  pplication has s
161d0 75 70 70 6c 69 65 64 20 61 6e 20 53 51 4c 69 74  upplied an SQLit
161e0 65 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 20  e user function 
161f0 6e 61 6d 65 64 20 22 63 6f 75 6e 74 69 6e 74 65  named "countinte
16200 67 65 72 73 22 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  gers"</i>.  <i>-
16210 2d 20 74 68 61 74 20 72 65 74 75 72 6e 73 20 74  - that returns t
16220 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 70 61  he number of spa
16230 63 65 2d 73 65 70 61 72 61 74 65 64 20 69 6e 74  ce-separated int
16240 65 67 65 72 73 20 63 6f 6e 74 61 69 6e 65 64 20  egers contained 
16250 69 6e 20 69 74 73 20 6f 6e 6c 79 20 61 72 67 75  in its only argu
16260 6d 65 6e 74 2c 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  ment,</i>.  <i>-
16270 2d 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  - the following 
16280 71 75 65 72 79 20 63 6f 75 6c 64 20 62 65 20 75  query could be u
16290 73 65 64 20 74 6f 20 72 65 74 75 72 6e 20 74 68  sed to return th
162a0 65 20 74 69 74 6c 65 73 20 6f 66 20 74 68 65 20  e titles of the 
162b0 31 30 20 64 6f 63 75 6d 65 6e 74 73 20 74 68 61  10 documents tha
162c0 74 20 63 6f 6e 74 61 69 6e 3c 2f 69 3e 0a 20 20  t contain</i>.  
162d0 3c 69 3e 2d 2d 20 74 68 65 20 67 72 65 61 74 65  <i>-- the greate
162e0 73 74 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 73  st number of ins
162f0 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 75 73  tances of the us
16300 65 72 73 20 71 75 65 72 79 20 74 65 72 6d 73 2e  ers query terms.
16310 20 48 6f 70 65 66 75 6c 6c 79 2c 20 74 68 65 73   Hopefully, thes
16320 65 20 31 30 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  e 10</i>.  <i>--
16330 20 64 6f 63 75 6d 65 6e 74 73 20 77 69 6c 6c 20   documents will 
16340 62 65 20 74 68 6f 73 65 20 74 68 61 74 20 74 68  be those that th
16350 65 20 75 73 65 72 73 20 63 6f 6e 73 69 64 65 72  e users consider
16360 73 20 6d 6f 72 65 20 6f 72 20 6c 65 73 73 20 74  s more or less t
16370 68 65 20 6d 6f 73 74 20 22 72 65 6c 65 76 61 6e  he most "relevan
16380 74 22 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54  t".</i>.  SELECT
16390 20 74 69 74 6c 65 20 46 52 4f 4d 20 64 6f 63 75   title FROM docu
163a0 6d 65 6e 74 73 20 0a 20 20 20 20 57 48 45 52 45  ments .    WHERE
163b0 20 64 6f 63 75 6d 65 6e 74 73 20 4d 41 54 43 48   documents MATCH
163c0 20 26 6c 74 3b 71 75 65 72 79 26 67 74 3b 0a 20   &lt;query&gt;. 
163d0 20 20 20 4f 52 44 45 52 20 42 59 20 63 6f 75 6e     ORDER BY coun
163e0 74 69 6e 74 65 67 65 72 73 28 6f 66 66 73 65 74  tintegers(offset
163f0 73 28 64 6f 63 75 6d 65 6e 74 73 29 29 20 44 45  s(documents)) DE
16400 53 43 0a 20 20 20 20 4c 49 4d 49 54 20 31 30 20  SC.    LIMIT 10 
16410 4f 46 46 53 45 54 20 30 0a 3c 2f 63 6f 64 65 62  OFFSET 0.</codeb
16420 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65  lock>..<p>.  The
16430 20 71 75 65 72 79 20 61 62 6f 76 65 20 63 6f 75   query above cou
16440 6c 64 20 62 65 20 6d 61 64 65 20 74 6f 20 72 75  ld be made to ru
16450 6e 20 66 61 73 74 65 72 20 62 79 20 75 73 69 6e  n faster by usin
16460 67 20 74 68 65 20 46 54 53 20 5b 6d 61 74 63 68  g the FTS [match
16470 69 6e 66 6f 5d 0a 20 20 66 75 6e 63 74 69 6f 6e  info].  function
16480 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
16490 65 20 6e 75 6d 62 65 72 20 6f 66 20 71 75 65 72  e number of quer
164a0 79 20 74 65 72 6d 20 69 6e 73 74 61 6e 63 65 73  y term instances
164b0 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 20   that appear in 
164c0 65 61 63 68 0a 20 20 72 65 73 75 6c 74 2e 20 54  each.  result. T
164d0 68 65 20 6d 61 74 63 68 69 6e 66 6f 20 66 75 6e  he matchinfo fun
164e0 63 74 69 6f 6e 20 69 73 20 6d 75 63 68 20 6d 6f  ction is much mo
164f0 72 65 20 65 66 66 69 63 69 65 6e 74 20 74 68 61  re efficient tha
16500 6e 20 74 68 65 20 6f 66 66 73 65 74 73 20 0a 20  n the offsets . 
16510 20 66 75 6e 63 74 69 6f 6e 2e 20 46 75 72 74 68   function. Furth
16520 65 72 6d 6f 72 65 2c 20 74 68 65 20 6d 61 74 63  ermore, the matc
16530 68 69 6e 66 6f 20 66 75 6e 63 74 69 6f 6e 20 70  hinfo function p
16540 72 6f 76 69 64 65 73 20 65 78 74 72 61 20 69 6e  rovides extra in
16550 66 6f 72 6d 61 74 69 6f 6e 0a 20 20 72 65 67 61  formation.  rega
16560 72 64 69 6e 67 20 74 68 65 20 6f 76 65 72 61 6c  rding the overal
16570 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6f 63 63 75  l number of occu
16580 72 72 65 6e 63 65 73 20 6f 66 20 65 61 63 68 20  rrences of each 
16590 71 75 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68  query term in th
165a0 65 20 65 6e 74 69 72 65 0a 20 20 64 6f 63 75 6d  e entire.  docum
165b0 65 6e 74 20 73 65 74 20 28 6e 6f 74 20 6a 75 73  ent set (not jus
165c0 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  t the current ro
165d0 77 29 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65  w) and the numbe
165e0 72 20 6f 66 20 64 6f 63 75 6d 65 6e 74 73 20 69  r of documents i
165f0 6e 20 77 68 69 63 68 20 0a 20 20 65 61 63 68 20  n which .  each 
16600 71 75 65 72 79 20 74 65 72 6d 20 61 70 70 65 61  query term appea
16610 72 73 2e 20 54 68 69 73 20 6d 61 79 20 62 65 20  rs. This may be 
16620 75 73 65 64 20 28 66 6f 72 20 65 78 61 6d 70 6c  used (for exampl
16630 65 29 20 74 6f 20 61 74 74 61 63 68 20 61 20 68  e) to attach a h
16640 69 67 68 65 72 0a 20 20 77 65 69 67 68 74 20 74  igher.  weight t
16650 6f 20 6c 65 73 73 20 63 6f 6d 6d 6f 6e 20 74 65  o less common te
16660 72 6d 73 20 77 68 69 63 68 20 6d 61 79 20 69 6e  rms which may in
16670 63 72 65 61 73 65 20 74 68 65 20 6f 76 65 72 61  crease the overa
16680 6c 6c 20 63 6f 6d 70 75 74 65 64 20 72 65 6c 65  ll computed rele
16690 76 61 6e 63 79 20 0a 20 20 6f 66 20 74 68 6f 73  vancy .  of thos
166a0 65 20 72 65 73 75 6c 74 73 20 74 68 65 20 75 73  e results the us
166b0 65 72 20 63 6f 6e 73 69 64 65 72 73 20 6d 6f 72  er considers mor
166c0 65 20 69 6e 74 65 72 65 73 74 69 6e 67 2e 0a 0a  e interesting...
166d0 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69  <codeblock>.  <i
166e0 3e 2d 2d 20 49 66 20 74 68 65 20 61 70 70 6c 69  >-- If the appli
166f0 63 61 74 69 6f 6e 20 73 75 70 70 6c 69 65 73 20  cation supplies 
16700 61 6e 20 53 51 4c 69 74 65 20 75 73 65 72 20 66  an SQLite user f
16710 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 22  unction called "
16720 72 61 6e 6b 22 20 74 68 61 74 3c 2f 69 3e 0a 20  rank" that</i>. 
16730 20 3c 69 3e 2d 2d 20 69 6e 74 65 72 70 72 65 74   <i>-- interpret
16740 73 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 64 61  s the blob of da
16750 74 61 20 72 65 74 75 72 6e 65 64 20 62 79 20 6d  ta returned by m
16760 61 74 63 68 69 6e 66 6f 20 61 6e 64 20 72 65 74  atchinfo and ret
16770 75 72 6e 73 20 61 20 6e 75 6d 65 72 69 63 3c 2f  urns a numeric</
16780 69 3e 0a 20 20 3c 69 3e 2d 2d 20 72 65 6c 65 76  i>.  <i>-- relev
16790 61 6e 63 79 20 62 61 73 65 64 20 6f 6e 20 69 74  ancy based on it
167a0 2c 20 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f  , then the follo
167b0 77 69 6e 67 20 53 51 4c 20 6d 61 79 20 62 65 20  wing SQL may be 
167c0 75 73 65 64 20 74 6f 20 72 65 74 75 72 6e 20 74  used to return t
167d0 68 65 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74  he</i>.  <i>-- t
167e0 69 74 6c 65 73 20 6f 66 20 74 68 65 20 31 30 20  itles of the 10 
167f0 6d 6f 73 74 20 72 65 6c 65 76 61 6e 74 20 64 6f  most relevant do
16800 63 75 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 64  cuments in the d
16810 61 74 61 73 65 74 20 66 6f 72 20 61 20 75 73 65  ataset for a use
16820 72 73 20 71 75 65 72 79 2e 3c 2f 69 3e 0a 20 20  rs query.</i>.  
16830 53 45 4c 45 43 54 20 74 69 74 6c 65 20 46 52 4f  SELECT title FRO
16840 4d 20 64 6f 63 75 6d 65 6e 74 73 20 0a 20 20 20  M documents .   
16850 20 57 48 45 52 45 20 64 6f 63 75 6d 65 6e 74 73   WHERE documents
16860 20 4d 41 54 43 48 20 26 6c 74 3b 71 75 65 72 79   MATCH &lt;query
16870 26 67 74 3b 0a 20 20 20 20 4f 52 44 45 52 20 42  &gt;.    ORDER B
16880 59 20 72 61 6e 6b 28 6d 61 74 63 68 69 6e 66 6f  Y rank(matchinfo
16890 28 64 6f 63 75 6d 65 6e 74 73 29 29 20 44 45 53  (documents)) DES
168a0 43 0a 20 20 20 20 4c 49 4d 49 54 20 31 30 20 4f  C.    LIMIT 10 O
168b0 46 46 53 45 54 20 30 0a 3c 2f 63 6f 64 65 62 6c  FFSET 0.</codebl
168c0 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20  ock>..<p>.  The 
168d0 53 51 4c 20 71 75 65 72 79 20 69 6e 20 74 68 65  SQL query in the
168e0 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 20 75   example above u
168f0 73 65 73 20 6c 65 73 73 20 43 50 55 20 74 68 61  ses less CPU tha
16900 6e 20 74 68 65 20 66 69 72 73 74 20 65 78 61 6d  n the first exam
16910 70 6c 65 0a 20 20 69 6e 20 74 68 69 73 20 73 65  ple.  in this se
16920 63 74 69 6f 6e 2c 20 62 75 74 20 73 74 69 6c 6c  ction, but still
16930 20 68 61 73 20 61 20 6e 6f 6e 2d 6f 62 76 69 6f   has a non-obvio
16940 75 73 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 70  us performance p
16950 72 6f 62 6c 65 6d 2e 20 53 51 4c 69 74 65 0a 20  roblem. SQLite. 
16960 20 73 61 74 69 73 66 69 65 73 20 74 68 69 73 20   satisfies this 
16970 71 75 65 72 79 20 62 79 20 72 65 74 72 69 65 76  query by retriev
16980 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ing the value of
16990 20 74 68 65 20 22 74 69 74 6c 65 22 20 63 6f 6c   the "title" col
169a0 75 6d 6e 20 61 6e 64 0a 20 20 6d 61 74 63 68 69  umn and.  matchi
169b0 6e 66 6f 20 64 61 74 61 20 66 72 6f 6d 20 74 68  nfo data from th
169c0 65 20 46 54 53 20 6d 6f 64 75 6c 65 20 66 6f 72  e FTS module for
169d0 20 65 76 65 72 79 20 72 6f 77 20 6d 61 74 63 68   every row match
169e0 65 64 20 62 79 20 74 68 65 20 75 73 65 72 73 0a  ed by the users.
169f0 20 20 71 75 65 72 79 20 62 65 66 6f 72 65 20 69    query before i
16a00 74 20 73 6f 72 74 73 20 61 6e 64 20 6c 69 6d 69  t sorts and limi
16a10 74 73 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20  ts the results. 
16a20 42 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 77  Because of the w
16a30 61 79 20 53 51 4c 69 74 65 27 73 0a 20 20 76 69  ay SQLite's.  vi
16a40 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6e 74 65  rtual table inte
16a50 72 66 61 63 65 20 77 6f 72 6b 73 2c 20 72 65 74  rface works, ret
16a60 72 69 65 76 69 6e 67 20 74 68 65 20 76 61 6c 75  rieving the valu
16a70 65 20 6f 66 20 74 68 65 20 22 74 69 74 6c 65 22  e of the "title"
16a80 20 63 6f 6c 75 6d 6e 0a 20 20 72 65 71 75 69 72   column.  requir
16a90 65 73 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 65  es loading the e
16aa0 6e 74 69 72 65 20 72 6f 77 20 66 72 6f 6d 20 64  ntire row from d
16ab0 69 73 6b 20 28 69 6e 63 6c 75 64 69 6e 67 20 74  isk (including t
16ac0 68 65 20 22 63 6f 6e 74 65 6e 74 22 20 66 69 65  he "content" fie
16ad0 6c 64 2c 0a 20 20 77 68 69 63 68 20 6d 61 79 20  ld,.  which may 
16ae0 62 65 20 71 75 69 74 65 20 6c 61 72 67 65 29 2e  be quite large).
16af0 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
16b00 20 69 66 20 74 68 65 20 75 73 65 72 73 20 71 75   if the users qu
16b10 65 72 79 20 6d 61 74 63 68 65 73 0a 20 20 73 65  ery matches.  se
16b20 76 65 72 61 6c 20 74 68 6f 75 73 61 6e 64 20 64  veral thousand d
16b30 6f 63 75 6d 65 6e 74 73 2c 20 6d 61 6e 79 20 6d  ocuments, many m
16b40 65 67 61 62 79 74 65 73 20 6f 66 20 22 74 69 74  egabytes of "tit
16b50 6c 65 22 20 61 6e 64 20 22 63 6f 6e 74 65 6e 74  le" and "content
16b60 22 20 64 61 74 61 0a 20 20 6d 61 79 20 62 65 20  " data.  may be 
16b70 6c 6f 61 64 65 64 20 66 72 6f 6d 20 64 69 73 6b  loaded from disk
16b80 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 65 76 65   into memory eve
16b90 6e 20 74 68 6f 75 67 68 20 74 68 65 79 20 77 69  n though they wi
16ba0 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64  ll never be used
16bb0 0a 20 20 66 6f 72 20 61 6e 79 20 70 75 72 70 6f  .  for any purpo
16bc0 73 65 2e 20 0a 0a 3c 70 3e 0a 20 20 54 68 65 20  se. ..<p>.  The 
16bd0 53 51 4c 20 71 75 65 72 79 20 69 6e 20 74 68 65  SQL query in the
16be0 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 61 6d 70   following examp
16bf0 6c 65 20 62 6c 6f 63 6b 20 69 73 20 6f 6e 65 20  le block is one 
16c00 73 6f 6c 75 74 69 6f 6e 20 74 6f 20 74 68 69 73  solution to this
16c10 20 0a 20 20 70 72 6f 62 6c 65 6d 2e 20 49 6e 20   .  problem. In 
16c20 53 51 4c 69 74 65 2c 20 77 68 65 6e 20 61 20 3c  SQLite, when a <
16c30 61 20 68 72 65 66 3d 22 6f 70 74 6f 76 65 72 76  a href="optoverv
16c40 69 65 77 2e 68 74 6d 6c 23 66 6c 61 74 74 65 6e  iew.html#flatten
16c50 69 6e 67 22 3e 73 75 62 2d 71 75 65 72 79 20 0a  ing">sub-query .
16c60 20 20 75 73 65 64 20 69 6e 20 61 20 6a 6f 69 6e    used in a join
16c70 20 63 6f 6e 74 61 69 6e 73 20 61 20 4c 49 4d 49   contains a LIMI
16c80 54 20 63 6c 61 75 73 65 3c 2f 61 3e 2c 20 74 68  T clause</a>, th
16c90 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
16ca0 20 73 75 62 2d 71 75 65 72 79 20 61 72 65 0a 20   sub-query are. 
16cb0 20 63 61 6c 63 75 6c 61 74 65 64 20 61 6e 64 20   calculated and 
16cc0 73 74 6f 72 65 64 20 69 6e 20 74 65 6d 70 6f 72  stored in tempor
16cd0 61 72 79 20 74 61 62 6c 65 20 62 65 66 6f 72 65  ary table before
16ce0 20 74 68 65 20 6d 61 69 6e 20 71 75 65 72 79 20   the main query 
16cf0 69 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20 54  is executed..  T
16d00 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 53  his means that S
16d10 51 4c 69 74 65 20 77 69 6c 6c 20 6c 6f 61 64 20  QLite will load 
16d20 6f 6e 6c 79 20 74 68 65 20 64 6f 63 69 64 20 61  only the docid a
16d30 6e 64 20 6d 61 74 63 68 69 6e 66 6f 20 64 61 74  nd matchinfo dat
16d40 61 20 66 6f 72 20 65 61 63 68 0a 20 20 72 6f 77  a for each.  row
16d50 20 6d 61 74 63 68 69 6e 67 20 74 68 65 20 75 73   matching the us
16d60 65 72 73 20 71 75 65 72 79 20 69 6e 74 6f 20 6d  ers query into m
16d70 65 6d 6f 72 79 2c 20 64 65 74 65 72 6d 69 6e 65  emory, determine
16d80 20 74 68 65 20 64 6f 63 69 64 20 76 61 6c 75 65   the docid value
16d90 73 0a 20 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  s.  correspondin
16da0 67 20 74 6f 20 74 68 65 20 74 65 6e 20 6d 6f 73  g to the ten mos
16db0 74 20 72 65 6c 65 76 61 6e 74 20 64 6f 63 75 6d  t relevant docum
16dc0 65 6e 74 73 2c 20 74 68 65 6e 20 6c 6f 61 64 20  ents, then load 
16dd0 6f 6e 6c 79 20 74 68 65 20 74 69 74 6c 65 0a 20  only the title. 
16de0 20 61 6e 64 20 63 6f 6e 74 65 6e 74 20 69 6e 66   and content inf
16df0 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 6f  ormation for tho
16e00 73 65 20 31 30 20 64 6f 63 75 6d 65 6e 74 73 20  se 10 documents 
16e10 6f 6e 6c 79 2e 20 42 65 63 61 75 73 65 20 62 6f  only. Because bo
16e20 74 68 20 74 68 65 20 6d 61 74 63 68 69 6e 66 6f  th the matchinfo
16e30 0a 20 20 61 6e 64 20 64 6f 63 69 64 20 76 61 6c  .  and docid val
16e40 75 65 73 20 61 72 65 20 67 6c 65 61 6e 65 64 20  ues are gleaned 
16e50 65 6e 74 69 72 65 6c 79 20 66 72 6f 6d 20 74 68  entirely from th
16e60 65 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65  e full-text inde
16e70 78 2c 20 74 68 69 73 20 72 65 73 75 6c 74 73 0a  x, this results.
16e80 20 20 69 6e 20 64 72 61 6d 61 74 69 63 61 6c 6c    in dramaticall
16e90 79 20 6c 65 73 73 20 64 61 74 61 20 62 65 69 6e  y less data bein
16ea0 67 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 74 68  g loaded from th
16eb0 65 20 64 61 74 61 62 61 73 65 20 69 6e 74 6f 20  e database into 
16ec0 6d 65 6d 6f 72 79 2e 0a 0a 3c 63 6f 64 65 62 6c  memory...<codebl
16ed0 6f 63 6b 3e 0a 20 20 53 45 4c 45 43 54 20 74 69  ock>.  SELECT ti
16ee0 74 6c 65 20 46 52 4f 4d 20 64 6f 63 75 6d 65 6e  tle FROM documen
16ef0 74 73 20 4a 4f 49 4e 20 28 20 0a 20 20 20 20 20  ts JOIN ( .     
16f00 20 53 45 4c 45 43 54 20 64 6f 63 69 64 2c 20 72   SELECT docid, r
16f10 61 6e 6b 28 6d 61 74 63 68 69 6e 66 6f 28 64 6f  ank(matchinfo(do
16f20 63 75 6d 65 6e 74 73 29 29 20 41 53 20 72 61 6e  cuments)) AS ran
16f30 6b 20 0a 20 20 20 20 20 20 46 52 4f 4d 20 64 6f  k .      FROM do
16f40 63 75 6d 65 6e 74 73 0a 20 20 20 20 20 20 57 48  cuments.      WH
16f50 45 52 45 20 64 6f 63 75 6d 65 6e 74 73 20 4d 41  ERE documents MA
16f60 54 43 48 20 26 6c 74 3b 71 75 65 72 79 26 67 74  TCH &lt;query&gt
16f70 3b 0a 20 20 20 20 20 20 4f 52 44 45 52 20 42 59  ;.      ORDER BY
16f80 20 72 61 6e 6b 20 44 45 53 43 20 0a 20 20 20 20   rank DESC .    
16f90 20 20 4c 49 4d 49 54 20 31 30 20 4f 46 46 53 45    LIMIT 10 OFFSE
16fa0 54 20 30 0a 20 20 29 20 41 53 20 72 61 6e 6b 74  T 0.  ) AS rankt
16fb0 61 62 6c 65 20 55 53 49 4e 47 28 64 6f 63 69 64  able USING(docid
16fc0 29 0a 20 20 4f 52 44 45 52 20 42 59 20 72 61 6e  ).  ORDER BY ran
16fd0 6b 74 61 62 6c 65 2e 72 61 6e 6b 20 44 45 53 43  ktable.rank DESC
16fe0 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c  .</codeblock>..<
16ff0 70 3e 0a 20 20 54 68 65 20 6e 65 78 74 20 62 6c  p>.  The next bl
17000 6f 63 6b 20 6f 66 20 53 51 4c 20 65 6e 68 61 6e  ock of SQL enhan
17010 63 65 73 20 74 68 65 20 71 75 65 72 79 20 77 69  ces the query wi
17020 74 68 20 73 6f 6c 75 74 69 6f 6e 73 20 74 6f 20  th solutions to 
17030 74 77 6f 20 6f 74 68 65 72 20 70 72 6f 62 6c 65  two other proble
17040 6d 73 0a 20 20 74 68 61 74 20 6d 61 79 20 61 72  ms.  that may ar
17050 69 73 65 20 69 6e 20 64 65 76 65 6c 6f 70 69 6e  ise in developin
17060 67 20 73 65 61 72 63 68 20 61 70 70 6c 69 63 61  g search applica
17070 74 69 6f 6e 73 20 75 73 69 6e 67 20 46 54 53 3a  tions using FTS:
17080 0a 0a 3c 6f 6c 3e 0a 20 20 3c 6c 69 3e 20 3c 70  ..<ol>.  <li> <p
17090 3e 0a 20 20 20 20 20 20 20 54 68 65 20 5b 73 6e  >.       The [sn
170a0 69 70 70 65 74 5d 20 66 75 6e 63 74 69 6f 6e 20  ippet] function 
170b0 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 77  cannot be used w
170c0 69 74 68 20 74 68 65 20 61 62 6f 76 65 20 71 75  ith the above qu
170d0 65 72 79 2e 20 42 65 63 61 75 73 65 0a 20 20 20  ery. Because.   
170e0 20 20 20 20 74 68 65 20 6f 75 74 65 72 20 71 75      the outer qu
170f0 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63  ery does not inc
17100 6c 75 64 65 20 61 20 22 57 48 45 52 45 20 2e 2e  lude a "WHERE ..
17110 2e 20 4d 41 54 43 48 22 20 63 6c 61 75 73 65 2c  . MATCH" clause,
17120 20 74 68 65 20 73 6e 69 70 70 65 74 20 0a 20 20   the snippet .  
17130 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 20 6d 61       function ma
17140 79 20 6e 6f 74 20 62 65 20 75 73 65 64 20 77 69  y not be used wi
17150 74 68 20 69 74 2e 20 4f 6e 65 20 73 6f 6c 75 74  th it. One solut
17160 69 6f 6e 20 69 73 20 74 6f 20 64 75 70 6c 69 63  ion is to duplic
17170 61 74 65 20 74 68 65 20 57 48 45 52 45 0a 20 20  ate the WHERE.  
17180 20 20 20 20 20 63 6c 61 75 73 65 20 75 73 65 64       clause used
17190 20 62 79 20 74 68 65 20 73 75 62 2d 71 75 65 72   by the sub-quer
171a0 79 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  y in the outer q
171b0 75 65 72 79 2e 20 54 68 65 20 6f 76 65 72 68 65  uery. The overhe
171c0 61 64 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  ad associated.  
171d0 20 20 20 20 20 77 69 74 68 20 74 68 69 73 20 69       with this i
171e0 73 20 75 73 75 61 6c 6c 79 20 6e 65 67 6c 69 67  s usually neglig
171f0 69 62 6c 65 2e 0a 20 20 3c 6c 69 3e 20 3c 70 3e  ible..  <li> <p>
17200 0a 20 20 20 20 20 20 20 54 68 65 20 72 65 6c 65  .       The rele
17210 76 61 6e 63 79 20 6f 66 20 61 20 64 6f 63 75 6d  vancy of a docum
17220 65 6e 74 20 6d 61 79 20 64 65 70 65 6e 64 20 6f  ent may depend o
17230 6e 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65  n something othe
17240 72 20 74 68 61 6e 20 6a 75 73 74 0a 20 20 20 20  r than just.    
17250 20 20 20 74 68 65 20 64 61 74 61 20 61 76 61 69     the data avai
17260 6c 61 62 6c 65 20 69 6e 20 74 68 65 20 72 65 74  lable in the ret
17270 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 6d 61 74  urn value of mat
17280 63 68 69 6e 66 6f 2e 20 46 6f 72 20 65 78 61 6d  chinfo. For exam
17290 70 6c 65 0a 20 20 20 20 20 20 20 65 61 63 68 20  ple.       each 
172a0 64 6f 63 75 6d 65 6e 74 20 69 6e 20 74 68 65 20  document in the 
172b0 64 61 74 61 62 61 73 65 20 6d 61 79 20 62 65 20  database may be 
172c0 61 73 73 69 67 6e 65 64 20 61 20 73 74 61 74 69  assigned a stati
172d0 63 20 77 65 69 67 68 74 20 62 61 73 65 64 0a 20  c weight based. 
172e0 20 20 20 20 20 20 6f 6e 20 66 61 63 74 6f 72 73        on factors
172f0 20 75 6e 72 65 6c 61 74 65 64 20 74 6f 20 69 74   unrelated to it
17300 73 20 63 6f 6e 74 65 6e 74 20 28 6f 72 69 67 69  s content (origi
17310 6e 2c 20 61 75 74 68 6f 72 2c 20 61 67 65 2c 20  n, author, age, 
17320 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 20 6f 66  number.       of
17330 20 72 65 66 65 72 65 6e 63 65 73 20 65 74 63 2e   references etc.
17340 29 2e 20 54 68 65 73 65 20 76 61 6c 75 65 73 20  ). These values 
17350 63 61 6e 20 62 65 20 73 74 6f 72 65 64 20 62 79  can be stored by
17360 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e   the application
17370 0a 20 20 20 20 20 20 20 69 6e 20 61 20 73 65 70  .       in a sep
17380 61 72 61 74 65 20 74 61 62 6c 65 20 74 68 61 74  arate table that
17390 20 63 61 6e 20 62 65 20 6a 6f 69 6e 65 64 20 61   can be joined a
173a0 67 61 69 6e 73 74 20 74 68 65 20 64 6f 63 75 6d  gainst the docum
173b0 65 6e 74 73 20 74 61 62 6c 65 0a 20 20 20 20 20  ents table.     
173c0 20 20 69 6e 20 74 68 65 20 73 75 62 2d 71 75 65    in the sub-que
173d0 72 79 20 73 6f 20 74 68 61 74 20 74 68 65 20 72  ry so that the r
173e0 61 6e 6b 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  ank function may
173f0 20 61 63 63 65 73 73 20 74 68 65 6d 2e 0a 3c 2f   access them..</
17400 6f 6c 3e 0a 0a 3c 70 3e 0a 20 20 54 68 69 73 20  ol>..<p>.  This 
17410 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 71  version of the q
17420 75 65 72 79 20 69 73 20 76 65 72 79 20 73 69 6d  uery is very sim
17430 69 6c 61 72 20 74 6f 20 74 68 61 74 20 75 73 65  ilar to that use
17440 64 20 62 79 20 74 68 65 20 0a 20 20 3c 61 20 68  d by the .  <a h
17450 72 65 66 3d 22 68 74 74 70 3a 2f 2f 77 77 77 2e  ref="http://www.
17460 73 71 6c 69 74 65 2e 6f 72 67 2f 73 65 61 72 63  sqlite.org/searc
17470 68 3f 71 3d 66 74 73 33 22 3e 73 71 6c 69 74 65  h?q=fts3">sqlite
17480 2e 6f 72 67 20 64 6f 63 75 6d 65 6e 74 61 74 69  .org documentati
17490 6f 6e 20 73 65 61 72 63 68 3c 2f 61 3e 20 0a 20  on search</a> . 
174a0 20 61 70 70 6c 69 63 61 74 69 6f 6e 2e 0a 0a 3c   application...<
174b0 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e  codeblock>.  <i>
174c0 2d 2d 20 54 68 69 73 20 74 61 62 6c 65 20 73 74  -- This table st
174d0 6f 72 65 73 20 74 68 65 20 73 74 61 74 69 63 20  ores the static 
174e0 77 65 69 67 68 74 20 61 73 73 69 67 6e 65 64 20  weight assigned 
174f0 74 6f 20 65 61 63 68 20 64 6f 63 75 6d 65 6e 74  to each document
17500 20 69 6e 20 46 54 53 20 74 61 62 6c 65 3c 2f 69   in FTS table</i
17510 3e 0a 20 20 3c 69 3e 2d 2d 20 22 64 6f 63 75 6d  >.  <i>-- "docum
17520 65 6e 74 73 22 2e 20 46 6f 72 20 65 61 63 68 20  ents". For each 
17530 72 6f 77 20 69 6e 20 74 68 65 20 64 6f 63 75 6d  row in the docum
17540 65 6e 74 73 20 74 61 62 6c 65 20 74 68 65 72 65  ents table there
17550 20 69 73 20 61 20 63 6f 72 72 65 73 70 6f 6e 64   is a correspond
17560 69 6e 67 20 72 6f 77 3c 2f 69 3e 0a 20 20 3c 69  ing row</i>.  <i
17570 3e 2d 2d 20 77 69 74 68 20 74 68 65 20 73 61 6d  >-- with the sam
17580 65 20 64 6f 63 69 64 20 76 61 6c 75 65 20 69 6e  e docid value in
17590 20 74 68 69 73 20 74 61 62 6c 65 2e 3c 2f 69 3e   this table.</i>
175a0 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
175b0 64 6f 63 75 6d 65 6e 74 73 5f 64 61 74 61 28 64  documents_data(d
175c0 6f 63 69 64 20 49 4e 54 45 47 45 52 20 50 52 49  ocid INTEGER PRI
175d0 4d 41 52 59 20 4b 45 59 2c 20 77 65 69 67 68 74  MARY KEY, weight
175e0 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68 69 73  );..  <i>-- This
175f0 20 71 75 65 72 79 20 69 73 20 73 69 6d 69 6c 61   query is simila
17600 72 20 74 6f 20 74 68 65 20 6f 6e 65 20 69 6e 20  r to the one in 
17610 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65 2c  the block above,
17620 20 65 78 63 65 70 74 20 74 68 61 74 3a 3c 2f 69   except that:</i
17630 3e 0a 20 20 3c 69 3e 2d 2d 3c 2f 69 3e 0a 20 20  >.  <i>--</i>.  
17640 3c 69 3e 2d 2d 20 20 20 31 2e 20 49 74 20 72 65  <i>--   1. It re
17650 74 75 72 6e 73 20 61 20 22 73 6e 69 70 70 65 74  turns a "snippet
17660 22 20 6f 66 20 74 65 78 74 20 61 6c 6f 6e 67 20  " of text along 
17670 77 69 74 68 20 74 68 65 20 64 6f 63 75 6d 65 6e  with the documen
17680 74 20 74 69 74 6c 65 20 66 6f 72 20 64 69 73 70  t title for disp
17690 6c 61 79 2e 20 53 6f 3c 2f 69 3e 0a 20 20 3c 69  lay. So</i>.  <i
176a0 3e 2d 2d 20 20 20 20 20 20 74 68 61 74 20 74 68  >--      that th
176b0 65 20 73 6e 69 70 70 65 74 20 66 75 6e 63 74 69  e snippet functi
176c0 6f 6e 20 6d 61 79 20 62 65 20 75 73 65 64 2c 20  on may be used, 
176d0 74 68 65 20 22 57 48 45 52 45 20 2e 2e 2e 20 4d  the "WHERE ... M
176e0 41 54 43 48 20 2e 2e 2e 22 20 63 6c 61 75 73 65  ATCH ..." clause
176f0 20 66 72 6f 6d 3c 2f 69 3e 0a 20 20 3c 69 3e 2d   from</i>.  <i>-
17700 2d 20 20 20 20 20 20 74 68 65 20 73 75 62 2d 71  -      the sub-q
17710 75 65 72 79 20 69 73 20 64 75 70 6c 69 63 61 74  uery is duplicat
17720 65 64 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  ed in the outer 
17730 71 75 65 72 79 2e 3c 2f 69 3e 0a 20 20 3c 69 3e  query.</i>.  <i>
17740 2d 2d 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20  --</i>.  <i>--  
17750 20 32 2e 20 54 68 65 20 73 75 62 2d 71 75 65 72   2. The sub-quer
17760 79 20 6a 6f 69 6e 73 20 74 68 65 20 64 6f 63 75  y joins the docu
17770 6d 65 6e 74 73 20 74 61 62 6c 65 20 77 69 74 68  ments table with
17780 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 5f 64 61   the document_da
17790 74 61 20 74 61 62 6c 65 2c 20 73 6f 20 74 68 61  ta table, so tha
177a0 74 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20  t</i>.  <i>--   
177b0 20 20 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f     implementatio
177c0 6e 20 6f 66 20 74 68 65 20 72 61 6e 6b 20 66 75  n of the rank fu
177d0 6e 63 74 69 6f 6e 20 68 61 73 20 61 63 63 65 73  nction has acces
177e0 73 20 74 6f 20 74 68 65 20 73 74 61 74 69 63 20  s to the static 
177f0 77 65 69 67 68 74 20 61 73 73 69 67 6e 65 64 3c  weight assigned<
17800 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20 20 20  /i>.  <i>--     
17810 20 74 6f 20 65 61 63 68 20 64 6f 63 75 6d 65 6e   to each documen
17820 74 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20  t.</i>.  SELECT 
17830 74 69 74 6c 65 2c 20 73 6e 69 70 70 65 74 28 64  title, snippet(d
17840 6f 63 75 6d 65 6e 74 73 29 20 46 52 4f 4d 20 64  ocuments) FROM d
17850 6f 63 75 6d 65 6e 74 73 20 4a 4f 49 4e 20 28 20  ocuments JOIN ( 
17860 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 64 6f  .      SELECT do
17870 63 69 64 2c 20 72 61 6e 6b 28 6d 61 74 63 68 69  cid, rank(matchi
17880 6e 66 6f 28 64 6f 63 75 6d 65 6e 74 73 29 2c 20  nfo(documents), 
17890 64 6f 63 75 6d 65 6e 74 73 5f 64 61 74 61 2e 77  documents_data.w
178a0 65 69 67 68 74 29 20 41 53 20 72 61 6e 6b 0a 20  eight) AS rank. 
178b0 20 20 20 20 20 46 52 4f 4d 20 64 6f 63 75 6d 65       FROM docume
178c0 6e 74 73 20 4a 4f 49 4e 20 64 6f 63 75 6d 65 6e  nts JOIN documen
178d0 74 73 5f 64 61 74 61 20 55 53 49 4e 47 28 64 6f  ts_data USING(do
178e0 63 69 64 29 0a 20 20 20 20 20 20 57 48 45 52 45  cid).      WHERE
178f0 20 64 6f 63 75 6d 65 6e 74 73 20 4d 41 54 43 48   documents MATCH
17900 20 26 6c 74 3b 71 75 65 72 79 26 67 74 3b 0a 20   &lt;query&gt;. 
17910 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 72 61       ORDER BY ra
17920 6e 6b 20 44 45 53 43 20 0a 20 20 20 20 20 20 4c  nk DESC .      L
17930 49 4d 49 54 20 31 30 20 4f 46 46 53 45 54 20 30  IMIT 10 OFFSET 0
17940 0a 20 20 29 20 41 53 20 72 61 6e 6b 74 61 62 6c  .  ) AS ranktabl
17950 65 20 55 53 49 4e 47 28 64 6f 63 69 64 29 0a 20  e USING(docid). 
17960 20 57 48 45 52 45 20 64 6f 63 75 6d 65 6e 74 73   WHERE documents
17970 20 4d 41 54 43 48 20 26 6c 74 3b 71 75 65 72 79   MATCH &lt;query
17980 26 67 74 3b 0a 20 20 4f 52 44 45 52 20 42 59 20  &gt;.  ORDER BY 
17990 72 61 6e 6b 74 61 62 6c 65 2e 72 61 6e 6b 20 44  ranktable.rank D
179a0 45 53 43 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e  ESC.</codeblock>
179b0 0a 0a 3c 70 3e 0a 20 20 41 6c 6c 20 74 68 65 20  ..<p>.  All the 
179c0 65 78 61 6d 70 6c 65 20 71 75 65 72 69 65 73 20  example queries 
179d0 61 62 6f 76 65 20 72 65 74 75 72 6e 20 74 68 65  above return the
179e0 20 74 65 6e 20 6d 6f 73 74 20 72 65 6c 65 76 61   ten most releva
179f0 6e 74 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  nt query results
17a00 2e 0a 20 20 42 79 20 6d 6f 64 69 66 79 69 6e 67  ..  By modifying
17a10 20 74 68 65 20 76 61 6c 75 65 73 20 75 73 65 64   the values used
17a20 20 77 69 74 68 20 74 68 65 20 4f 46 46 53 45 54   with the OFFSET
17a30 20 61 6e 64 20 4c 49 4d 49 54 20 63 6c 61 75 73   and LIMIT claus
17a40 65 73 2c 20 61 20 71 75 65 72 79 20 0a 20 20 74  es, a query .  t
17a50 6f 20 72 65 74 75 72 6e 20 28 73 61 79 29 20 74  o return (say) t
17a60 68 65 20 6e 65 78 74 20 74 65 6e 20 6d 6f 73 74  he next ten most
17a70 20 72 65 6c 65 76 61 6e 74 20 72 65 73 75 6c 74   relevant result
17a80 73 20 69 73 20 65 61 73 79 20 74 6f 20 63 6f 6e  s is easy to con
17a90 73 74 72 75 63 74 2e 20 0a 20 20 54 68 69 73 20  struct. .  This 
17aa0 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f 20 6f  may be used to o
17ab0 62 74 61 69 6e 20 74 68 65 20 64 61 74 61 20 72  btain the data r
17ac0 65 71 75 69 72 65 64 20 66 6f 72 20 61 20 73 65  equired for a se
17ad0 61 72 63 68 20 61 70 70 6c 69 63 61 74 69 6f 6e  arch application
17ae0 73 20 73 65 63 6f 6e 64 0a 20 20 61 6e 64 20 73  s second.  and s
17af0 75 62 73 65 71 75 65 6e 74 20 70 61 67 65 73 20  ubsequent pages 
17b00 6f 66 20 72 65 73 75 6c 74 73 2e 0a 0a 3c 70 3e  of results...<p>
17b10 0a 20 20 54 68 65 20 6e 65 78 74 20 62 6c 6f 63  .  The next bloc
17b20 6b 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 65 78  k contains an ex
17b30 61 6d 70 6c 65 20 72 61 6e 6b 20 66 75 6e 63 74  ample rank funct
17b40 69 6f 6e 20 74 68 61 74 20 75 73 65 73 20 6d 61  ion that uses ma
17b50 74 63 68 69 6e 66 6f 20 64 61 74 61 20 0a 20 20  tchinfo data .  
17b60 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 20 43  implemented in C
17b70 2e 20 49 6e 73 74 65 61 64 20 6f 66 20 61 20 73  . Instead of a s
17b80 69 6e 67 6c 65 20 77 65 69 67 68 74 2c 20 69 74  ingle weight, it
17b90 20 61 6c 6c 6f 77 73 20 61 20 77 65 69 67 68 74   allows a weight
17ba0 20 74 6f 20 62 65 20 0a 20 20 65 78 74 65 72 6e   to be .  extern
17bb0 61 6c 6c 79 20 61 73 73 69 67 6e 65 64 20 74 6f  ally assigned to
17bc0 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20   each column of 
17bd0 65 61 63 68 20 64 6f 63 75 6d 65 6e 74 2e 20 49  each document. I
17be0 74 20 6d 61 79 20 62 65 20 72 65 67 69 73 74 65  t may be registe
17bf0 72 65 64 0a 20 20 77 69 74 68 20 53 51 4c 69 74  red.  with SQLit
17c00 65 20 6c 69 6b 65 20 61 6e 79 20 6f 74 68 65 72  e like any other
17c10 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 20 75   user function u
17c20 73 69 6e 67 20 5b 73 71 6c 69 74 65 33 5f 63 72  sing [sqlite3_cr
17c30 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5d 2e 0a  eate_function]..
17c40 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 3c 69 3e  .<codeblock>.<i>
17c50 2f 2a 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 53 51 4c  /*</i>.<i>** SQL
17c60 69 74 65 20 75 73 65 72 20 64 65 66 69 6e 65 64  ite user defined
17c70 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 75 73 65   function to use
17c80 20 77 69 74 68 20 6d 61 74 63 68 69 6e 66 6f 28   with matchinfo(
17c90 29 20 74 6f 20 63 61 6c 63 75 6c 61 74 65 20 74  ) to calculate t
17ca0 68 65 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 72 65 6c  he</i>.<i>** rel
17cb0 65 76 61 6e 63 79 20 6f 66 20 61 6e 20 46 54 53  evancy of an FTS
17cc0 20 6d 61 74 63 68 2e 20 54 68 65 20 76 61 6c 75   match. The valu
17cd0 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68  e returned is th
17ce0 65 20 72 65 6c 65 76 61 6e 63 79 20 73 63 6f 72  e relevancy scor
17cf0 65 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 28 61 20 72  e</i>.<i>** (a r
17d00 65 61 6c 20 76 61 6c 75 65 20 67 72 65 61 74 65  eal value greate
17d10 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
17d20 74 6f 20 7a 65 72 6f 29 2e 20 41 20 6c 61 72 67  to zero). A larg
17d30 65 72 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74  er value indicat
17d40 65 73 20 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 61 20  es </i>.<i>** a 
17d50 6d 6f 72 65 20 72 65 6c 65 76 61 6e 74 20 64 6f  more relevant do
17d60 63 75 6d 65 6e 74 2e 3c 2f 69 3e 0a 3c 69 3e 2a  cument.</i>.<i>*
17d70 2a 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 54 68 65 20  *</i>.<i>** The 
17d80 6f 76 65 72 61 6c 6c 20 72 65 6c 65 76 61 6e 63  overall relevanc
17d90 79 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68  y returned is th
17da0 65 20 73 75 6d 20 6f 66 20 74 68 65 20 72 65 6c  e sum of the rel
17db0 65 76 61 6e 63 69 65 73 20 6f 66 20 65 61 63 68  evancies of each
17dc0 20 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 63 6f 6c 75   </i>.<i>** colu
17dd0 6d 6e 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  mn value in the 
17de0 46 54 53 20 74 61 62 6c 65 2e 20 54 68 65 20 72  FTS table. The r
17df0 65 6c 65 76 61 6e 63 79 20 6f 66 20 61 20 63 6f  elevancy of a co
17e00 6c 75 6d 6e 20 76 61 6c 75 65 20 69 73 20 74 68  lumn value is th
17e10 65 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 73 75 6d 20  e</i>.<i>** sum 
17e20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
17e30 20 66 6f 72 20 65 61 63 68 20 72 65 70 6f 72 74   for each report
17e40 61 62 6c 65 20 70 68 72 61 73 65 20 69 6e 20 74  able phrase in t
17e50 68 65 20 46 54 53 20 71 75 65 72 79 3a 3c 2f 69  he FTS query:</i
17e60 3e 0a 3c 69 3e 2a 2a 3c 2f 69 3e 0a 3c 69 3e 2a  >.<i>**</i>.<i>*
17e70 2a 20 20 20 28 26 6c 74 3b 68 69 74 20 63 6f 75  *   (&lt;hit cou
17e80 6e 74 26 67 74 3b 20 2f 20 26 6c 74 3b 67 6c 6f  nt&gt; / &lt;glo
17e90 62 61 6c 20 68 69 74 20 63 6f 75 6e 74 26 67 74  bal hit count&gt
17ea0 29 20 2a 20 26 6c 74 3b 63 6f 6c 75 6d 6e 20 77  ) * &lt;column w
17eb0 65 69 67 68 74 26 67 74 3b 3c 2f 69 3e 0a 3c 69  eight&gt;</i>.<i
17ec0 3e 2a 2a 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 77 68  >**</i>.<i>** wh
17ed0 65 72 65 20 26 6c 74 3b 68 69 74 20 63 6f 75 6e  ere &lt;hit coun
17ee0 74 26 67 74 3b 20 69 73 20 74 68 65 20 6e 75 6d  t&gt; is the num
17ef0 62 65 72 20 6f 66 20 69 6e 73 74 61 6e 63 65 73  ber of instances
17f00 20 6f 66 20 74 68 65 20 70 68 72 61 73 65 20 69   of the phrase i
17f10 6e 20 74 68 65 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20  n the</i>.<i>** 
17f20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 6f 66 20  column value of 
17f30 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
17f40 61 6e 64 20 26 6c 74 3b 67 6c 6f 62 61 6c 20 68  and &lt;global h
17f50 69 74 20 63 6f 75 6e 74 26 67 74 3b 20 69 73 20  it count&gt; is 
17f60 74 68 65 20 6e 75 6d 62 65 72 3c 2f 69 3e 0a 3c  the number</i>.<
17f70 69 3e 2a 2a 20 6f 66 20 69 6e 73 74 61 6e 63 65  i>** of instance
17f80 73 20 6f 66 20 74 68 65 20 70 68 72 61 73 65 20  s of the phrase 
17f90 69 6e 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75  in the same colu
17fa0 6d 6e 20 6f 66 20 61 6c 6c 20 72 6f 77 73 20 69  mn of all rows i
17fb0 6e 20 74 68 65 20 46 54 53 3c 2f 69 3e 0a 3c 69  n the FTS</i>.<i
17fc0 3e 2a 2a 20 74 61 62 6c 65 2e 20 54 68 65 20 26  >** table. The &
17fd0 6c 74 3b 63 6f 6c 75 6d 6e 20 77 65 69 67 68 74  lt;column weight
17fe0 26 67 74 3b 20 69 73 20 61 20 77 65 69 67 68 74  &gt; is a weight
17ff0 69 6e 67 20 66 61 63 74 6f 72 20 61 73 73 69 67  ing factor assig
18000 6e 65 64 20 74 6f 20 65 61 63 68 3c 2f 69 3e 0a  ned to each</i>.
18010 3c 69 3e 2a 2a 20 63 6f 6c 75 6d 6e 20 62 79 20  <i>** column by 
18020 74 68 65 20 63 61 6c 6c 65 72 20 28 73 65 65 20  the caller (see 
18030 62 65 6c 6f 77 29 2e 3c 2f 69 3e 0a 3c 69 3e 2a  below).</i>.<i>*
18040 2a 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 54 68 65 20  *</i>.<i>** The 
18050 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  first argument t
18060 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
18070 6d 75 73 74 20 62 65 20 74 68 65 20 72 65 74 75  must be the retu
18080 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  rn value of the 
18090 46 54 53 20 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 6d  FTS </i>.<i>** m
180a0 61 74 63 68 69 6e 66 6f 28 29 20 66 75 6e 63 74  atchinfo() funct
180b0 69 6f 6e 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20 74  ion. Following t
180c0 68 69 73 20 6d 75 73 74 20 62 65 20 6f 6e 65 20  his must be one 
180d0 61 72 67 75 6d 65 6e 74 20 66 6f 72 20 65 61 63  argument for eac
180e0 68 20 63 6f 6c 75 6d 6e 20 3c 2f 69 3e 0a 3c 69  h column </i>.<i
180f0 3e 2a 2a 20 6f 66 20 74 68 65 20 46 54 53 20 74  >** of the FTS t
18100 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  able containing 
18110 61 20 6e 75 6d 65 72 69 63 20 77 65 69 67 68 74  a numeric weight
18120 20 66 61 63 74 6f 72 20 66 6f 72 20 74 68 65 20   factor for the 
18130 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 3c 2f  corresponding </
18140 69 3e 0a 3c 69 3e 2a 2a 20 63 6f 6c 75 6d 6e 2e  i>.<i>** column.
18150 20 45 78 61 6d 70 6c 65 3a 3c 2f 69 3e 0a 3c 69   Example:</i>.<i
18160 3e 2a 2a 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 20 20  >**</i>.<i>**   
18170 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c    CREATE VIRTUAL
18180 20 54 41 42 4c 45 20 64 6f 63 75 6d 65 6e 74 73   TABLE documents
18190 20 55 53 49 4e 47 20 66 74 73 33 28 74 69 74 6c   USING fts3(titl
181a0 65 2c 20 63 6f 6e 74 65 6e 74 29 3c 2f 69 3e 0a  e, content)</i>.
181b0 3c 69 3e 2a 2a 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20  <i>**</i>.<i>** 
181c0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75  The following qu
181d0 65 72 79 20 72 65 74 75 72 6e 73 20 74 68 65 20  ery returns the 
181e0 64 6f 63 69 64 73 20 6f 66 20 64 6f 63 75 6d 65  docids of docume
181f0 6e 74 73 20 74 68 61 74 20 6d 61 74 63 68 20 74  nts that match t
18200 68 65 20 66 75 6c 6c 2d 74 65 78 74 3c 2f 69 3e  he full-text</i>
18210 0a 3c 69 3e 2a 2a 20 71 75 65 72 79 20 26 6c 74  .<i>** query &lt
18220 3b 71 75 65 72 79 26 67 74 3b 20 73 6f 72 74 65  ;query&gt; sorte
18230 64 20 66 72 6f 6d 20 6d 6f 73 74 20 74 6f 20 6c  d from most to l
18240 65 61 73 74 20 72 65 6c 65 76 61 6e 74 2e 20 57  east relevant. W
18250 68 65 6e 20 63 61 6c 63 75 6c 61 74 69 6e 67 3c  hen calculating<
18260 2f 69 3e 0a 3c 69 3e 2a 2a 20 72 65 6c 65 76 61  /i>.<i>** releva
18270 6e 63 65 2c 20 71 75 65 72 79 20 74 65 72 6d 20  nce, query term 
18280 69 6e 73 74 61 6e 63 65 73 20 69 6e 20 74 68 65  instances in the
18290 20 27 74 69 74 6c 65 27 20 63 6f 6c 75 6d 6e 20   'title' column 
182a0 61 72 65 20 67 69 76 65 6e 20 74 77 69 63 65 20  are given twice 
182b0 74 68 65 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 77 65  the</i>.<i>** we
182c0 69 67 68 74 69 6e 67 20 6f 66 20 74 68 6f 73 65  ighting of those
182d0 20 69 6e 20 74 68 65 20 27 63 6f 6e 74 65 6e 74   in the 'content
182e0 27 20 63 6f 6c 75 6d 6e 2e 3c 2f 69 3e 0a 3c 69  ' column.</i>.<i
182f0 3e 2a 2a 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 20 20  >**</i>.<i>**   
18300 20 20 53 45 4c 45 43 54 20 64 6f 63 69 64 20 46    SELECT docid F
18310 52 4f 4d 20 64 6f 63 75 6d 65 6e 74 73 20 3c 2f  ROM documents </
18320 69 3e 0a 3c 69 3e 2a 2a 20 20 20 20 20 57 48 45  i>.<i>**     WHE
18330 52 45 20 64 6f 63 75 6d 65 6e 74 73 20 4d 41 54  RE documents MAT
18340 43 48 20 26 6c 74 3b 71 75 65 72 79 26 67 74 3b  CH &lt;query&gt;
18350 20 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 20 20 20 20   </i>.<i>**     
18360 4f 52 44 45 52 20 42 59 20 72 61 6e 6b 28 6d 61  ORDER BY rank(ma
18370 74 63 68 69 6e 66 6f 28 64 6f 63 75 6d 65 6e 74  tchinfo(document
18380 73 29 2c 20 31 2e 30 2c 20 30 2e 35 29 20 44 45  s), 1.0, 0.5) DE
18390 53 43 3c 2f 69 3e 0a 3c 69 3e 2a 2f 3c 2f 69 3e  SC</i>.<i>*/</i>
183a0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 61 6e  .static void ran
183b0 6b 66 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  kfunc(sqlite3_co
183c0 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 69 6e 74  ntext *pCtx, int
183d0 20 6e 56 61 6c 2c 20 73 71 6c 69 74 65 33 5f 76   nVal, sqlite3_v
183e0 61 6c 75 65 20 2a 2a 61 70 56 61 6c 29 7b 0a 20  alue **apVal){. 
183f0 20 69 6e 74 20 2a 61 4d 61 74 63 68 69 6e 66 6f   int *aMatchinfo
18400 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18410 20 3c 69 3e 2f 2a 20 52 65 74 75 72 6e 20 76 61   <i>/* Return va
18420 6c 75 65 20 6f 66 20 6d 61 74 63 68 69 6e 66 6f  lue of matchinfo
18430 28 29 20 2a 2f 3c 2f 69 3e 0a 20 20 69 6e 74 20  () */</i>.  int 
18440 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  nCol;           
18450 20 20 20 20 20 20 20 20 20 20 20 20 3c 69 3e 2f              <i>/
18460 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
18470 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  mns in the table
18480 20 2a 2f 3c 2f 69 3e 0a 20 20 69 6e 74 20 6e 50   */</i>.  int nP
18490 68 72 61 73 65 3b 20 20 20 20 20 20 20 20 20 20  hrase;          
184a0 20 20 20 20 20 20 20 20 20 20 3c 69 3e 2f 2a 20            <i>/* 
184b0 4e 75 6d 62 65 72 20 6f 66 20 70 68 72 61 73 65  Number of phrase
184c0 73 20 69 6e 20 74 68 65 20 71 75 65 72 79 20 2a  s in the query *
184d0 2f 3c 2f 69 3e 0a 20 20 69 6e 74 20 69 50 68 72  /</i>.  int iPhr
184e0 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
184f0 20 20 20 20 20 20 20 20 3c 69 3e 2f 2a 20 43 75          <i>/* Cu
18500 72 72 65 6e 74 20 70 68 72 61 73 65 20 2a 2f 3c  rrent phrase */<
18510 2f 69 3e 0a 20 20 64 6f 75 62 6c 65 20 73 63 6f  /i>.  double sco
18520 72 65 20 3d 20 30 2e 30 3b 20 20 20 20 20 20 20  re = 0.0;       
18530 20 20 20 20 20 20 3c 69 3e 2f 2a 20 56 61 6c 75        <i>/* Valu
18540 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 3c 2f  e to return */</
18550 69 3e 0a 0a 20 20 61 73 73 65 72 74 28 20 73 69  i>..  assert( si
18560 7a 65 6f 66 28 69 6e 74 29 3d 3d 34 20 29 3b 0a  zeof(int)==4 );.
18570 0a 3c 69 3e 20 20 2f 2a 20 43 68 65 63 6b 20 74  .<i>  /* Check t
18580 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hat the number o
18590 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73  f arguments pass
185a0 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ed to this funct
185b0 69 6f 6e 20 69 73 20 63 6f 72 72 65 63 74 2e 3c  ion is correct.<
185c0 2f 69 3e 0a 3c 69 3e 20 20 2a 2a 20 49 66 20 6e  /i>.<i>  ** If n
185d0 6f 74 2c 20 6a 75 6d 70 20 74 6f 20 77 72 6f 6e  ot, jump to wron
185e0 67 5f 6e 75 6d 62 65 72 5f 61 72 67 73 2e 20 53  g_number_args. S
185f0 65 74 20 61 4d 61 74 63 68 69 6e 66 6f 20 74 6f  et aMatchinfo to
18600 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 61 72   point to the ar
18610 72 61 79 3c 2f 69 3e 0a 3c 69 3e 20 20 2a 2a 20  ray</i>.<i>  ** 
18620 6f 66 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65  of unsigned inte
18630 67 65 72 20 76 61 6c 75 65 73 20 72 65 74 75 72  ger values retur
18640 6e 65 64 20 62 79 20 46 54 53 20 66 75 6e 63 74  ned by FTS funct
18650 69 6f 6e 20 6d 61 74 63 68 69 6e 66 6f 2e 20 53  ion matchinfo. S
18660 65 74 3c 2f 69 3e 0a 3c 69 3e 20 20 2a 2a 20 6e  et</i>.<i>  ** n
18670 50 68 72 61 73 65 20 74 6f 20 63 6f 6e 74 61 69  Phrase to contai
18680 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
18690 72 65 70 6f 72 74 61 62 6c 65 20 70 68 72 61 73  reportable phras
186a0 65 73 20 69 6e 20 74 68 65 20 75 73 65 72 73 20  es in the users 
186b0 66 75 6c 6c 2d 74 65 78 74 3c 2f 69 3e 0a 3c 69  full-text</i>.<i
186c0 3e 20 20 2a 2a 20 71 75 65 72 79 2c 20 61 6e 64  >  ** query, and
186d0 20 6e 43 6f 6c 20 74 6f 20 74 68 65 20 6e 75 6d   nCol to the num
186e0 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
186f0 6e 20 74 68 65 20 74 61 62 6c 65 2e 3c 2f 69 3e  n the table.</i>
18700 0a 3c 69 3e 20 20 2a 2f 3c 2f 69 3e 0a 20 20 69  .<i>  */</i>.  i
18710 66 28 20 6e 56 61 6c 26 6c 74 3b 31 20 29 20 67  f( nVal&lt;1 ) g
18720 6f 74 6f 20 77 72 6f 6e 67 5f 6e 75 6d 62 65 72  oto wrong_number
18730 5f 61 72 67 73 3b 0a 20 20 61 4d 61 74 63 68 69  _args;.  aMatchi
18740 6e 66 6f 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  nfo = (unsigned 
18750 69 6e 74 20 2a 29 73 71 6c 69 74 65 33 5f 76 61  int *)sqlite3_va
18760 6c 75 65 5f 62 6c 6f 62 28 61 70 56 61 6c 26 23  lue_blob(apVal&#
18770 78 35 42 3b 30 26 23 78 35 44 3b 29 3b 0a 20 20  x5B;0&#x5D;);.  
18780 6e 50 68 72 61 73 65 20 3d 20 61 4d 61 74 63 68  nPhrase = aMatch
18790 69 6e 66 6f 26 23 78 35 42 3b 30 26 23 78 35 44  info&#x5B;0&#x5D
187a0 3b 3b 0a 20 20 6e 43 6f 6c 20 3d 20 61 4d 61 74  ;;.  nCol = aMat
187b0 63 68 69 6e 66 6f 26 23 78 35 42 3b 31 26 23 78  chinfo&#x5B;1&#x
187c0 35 44 3b 3b 0a 20 20 69 66 28 20 6e 56 61 6c 21  5D;;.  if( nVal!
187d0 3d 28 31 2b 6e 43 6f 6c 29 20 29 20 67 6f 74 6f  =(1+nCol) ) goto
187e0 20 77 72 6f 6e 67 5f 6e 75 6d 62 65 72 5f 61 72   wrong_number_ar
187f0 67 73 3b 0a 0a 3c 69 3e 20 20 2f 2a 20 49 74 65  gs;..<i>  /* Ite
18800 72 61 74 65 20 74 68 72 6f 75 67 68 20 65 61 63  rate through eac
18810 68 20 70 68 72 61 73 65 20 69 6e 20 74 68 65 20  h phrase in the 
18820 75 73 65 72 73 20 71 75 65 72 79 2e 20 2a 2f 3c  users query. */<
18830 2f 69 3e 0a 20 20 66 6f 72 28 69 50 68 72 61 73  /i>.  for(iPhras
18840 65 3d 30 3b 20 69 50 68 72 61 73 65 26 6c 74 3b  e=0; iPhrase&lt;
18850 6e 50 68 72 61 73 65 3b 20 69 50 68 72 61 73 65  nPhrase; iPhrase
18860 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f  ++){.    int iCo
18870 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
18880 20 20 20 20 20 20 20 3c 69 3e 2f 2a 20 43 75 72         <i>/* Cur
18890 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 2a 2f 3c 2f  rent column */</
188a0 69 3e 0a 0a 3c 69 3e 20 20 20 20 2f 2a 20 4e 6f  i>..<i>    /* No
188b0 77 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  w iterate throug
188c0 68 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 69 6e  h each column in
188d0 20 74 68 65 20 75 73 65 72 73 20 71 75 65 72 79   the users query
188e0 2e 20 46 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  . For each colum
188f0 6e 2c 3c 2f 69 3e 0a 3c 69 3e 20 20 20 20 2a 2a  n,</i>.<i>    **
18900 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72   increment the r
18910 65 6c 65 76 61 6e 63 79 20 73 63 6f 72 65 20 62  elevancy score b
18920 79 3a 3c 2f 69 3e 0a 3c 69 3e 20 20 20 20 2a 2a  y:</i>.<i>    **
18930 3c 2f 69 3e 0a 3c 69 3e 20 20 20 20 2a 2a 20 20  </i>.<i>    **  
18940 20 28 26 6c 74 3b 68 69 74 20 63 6f 75 6e 74 26   (&lt;hit count&
18950 67 74 3b 20 2f 20 26 6c 74 3b 67 6c 6f 62 61 6c  gt; / &lt;global
18960 20 68 69 74 20 63 6f 75 6e 74 26 67 74 29 20 2a   hit count&gt) *
18970 20 26 6c 74 3b 63 6f 6c 75 6d 6e 20 77 65 69 67   &lt;column weig
18980 68 74 26 67 74 3b 3c 2f 69 3e 0a 3c 69 3e 20 20  ht&gt;</i>.<i>  
18990 20 20 2a 2a 3c 2f 69 3e 0a 3c 69 3e 20 20 20 20    **</i>.<i>    
189a0 2a 2a 20 61 50 68 72 61 73 65 69 6e 66 6f 26 23  ** aPhraseinfo&#
189b0 78 35 42 3b 26 23 78 35 44 3b 20 70 6f 69 6e 74  x5B;&#x5D; point
189c0 73 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  s to the start o
189d0 66 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 70  f the data for p
189e0 68 72 61 73 65 20 69 50 68 72 61 73 65 2e 20 53  hrase iPhrase. S
189f0 6f 3c 2f 69 3e 0a 3c 69 3e 20 20 20 20 2a 2a 20  o</i>.<i>    ** 
18a00 74 68 65 20 68 69 74 20 63 6f 75 6e 74 20 61 6e  the hit count an
18a10 64 20 67 6c 6f 62 61 6c 20 68 69 74 20 63 6f 75  d global hit cou
18a20 6e 74 73 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  nts for each col
18a30 75 6d 6e 20 61 72 65 20 66 6f 75 6e 64 20 69 6e  umn are found in
18a40 20 3c 2f 69 3e 0a 3c 69 3e 20 20 20 20 2a 2a 20   </i>.<i>    ** 
18a50 61 50 68 72 61 73 65 69 6e 66 6f 26 23 78 35 42  aPhraseinfo&#x5B
18a60 3b 69 43 6f 6c 2a 33 26 23 78 35 44 3b 20 61 6e  ;iCol*3&#x5D; an
18a70 64 20 61 50 68 72 61 73 65 69 6e 66 6f 26 23 78  d aPhraseinfo&#x
18a80 35 42 3b 69 43 6f 6c 2a 33 2b 31 26 23 78 35 44  5B;iCol*3+1&#x5D
18a90 3b 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  ;, respectively.
18aa0 3c 2f 69 3e 0a 3c 69 3e 20 20 20 20 2a 2f 3c 2f  </i>.<i>    */</
18ab0 69 3e 0a 20 20 20 20 69 6e 74 20 2a 61 50 68 72  i>.    int *aPhr
18ac0 61 73 65 69 6e 66 6f 20 3d 20 26 61 4d 61 74 63  aseinfo = &aMatc
18ad0 68 69 6e 66 6f 26 23 78 35 42 3b 32 20 2b 20 69  hinfo&#x5B;2 + i
18ae0 50 68 72 61 73 65 2a 6e 43 6f 6c 2a 33 26 23 78  Phrase*nCol*3&#x
18af0 35 44 3b 3b 0a 20 20 20 20 66 6f 72 28 69 43 6f  5D;;.    for(iCo
18b00 6c 3d 30 3b 20 69 43 6f 6c 26 6c 74 3b 6e 43 6f  l=0; iCol&lt;nCo
18b10 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  l; iCol++){.    
18b20 20 20 69 6e 74 20 6e 48 69 74 43 6f 75 6e 74 20    int nHitCount 
18b30 3d 20 61 50 68 72 61 73 65 69 6e 66 6f 26 23 78  = aPhraseinfo&#x
18b40 35 42 3b 33 2a 69 43 6f 6c 26 23 78 35 44 3b 3b  5B;3*iCol&#x5D;;
18b50 0a 20 20 20 20 20 20 69 6e 74 20 6e 47 6c 6f 62  .      int nGlob
18b60 61 6c 48 69 74 43 6f 75 6e 74 20 3d 20 61 50 68  alHitCount = aPh
18b70 72 61 73 65 69 6e 66 6f 26 23 78 35 42 3b 33 2a  raseinfo&#x5B;3*
18b80 69 43 6f 6c 2b 31 26 23 78 35 44 3b 3b 0a 20 20  iCol+1&#x5D;;.  
18b90 20 20 20 20 64 6f 75 62 6c 65 20 77 65 69 67 68      double weigh
18ba0 74 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  t = sqlite3_valu
18bb0 65 5f 64 6f 75 62 6c 65 28 61 70 56 61 6c 26 23  e_double(apVal&#
18bc0 78 35 42 3b 69 43 6f 6c 2b 31 26 23 78 35 44 3b  x5B;iCol+1&#x5D;
18bd0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 48 69  );.      if( nHi
18be0 74 43 6f 75 6e 74 3e 30 20 29 7b 0a 20 20 20 20  tCount>0 ){.    
18bf0 20 20 20 20 73 63 6f 72 65 20 2b 3d 20 28 28 64      score += ((d
18c00 6f 75 62 6c 65 29 6e 48 69 74 43 6f 75 6e 74 20  ouble)nHitCount 
18c10 2f 20 28 64 6f 75 62 6c 65 29 6e 47 6c 6f 62 61  / (double)nGloba
18c20 6c 48 69 74 43 6f 75 6e 74 29 20 2a 20 77 65 69  lHitCount) * wei
18c30 67 68 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ght;.      }.   
18c40 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65   }.  }..  sqlite
18c50 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28  3_result_double(
18c60 70 43 74 78 2c 20 73 63 6f 72 65 29 3b 0a 20 20  pCtx, score);.  
18c70 72 65 74 75 72 6e 3b 0a 0a 3c 69 3e 20 20 2f 2a  return;..<i>  /*
18c80 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 68   Jump here if th
18c90 65 20 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f  e wrong number o
18ca0 66 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20  f arguments are 
18cb0 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
18cc0 75 6e 63 74 69 6f 6e 20 2a 2f 3c 2f 69 3e 0a 77  unction */</i>.w
18cd0 72 6f 6e 67 5f 6e 75 6d 62 65 72 5f 61 72 67 73  rong_number_args
18ce0 3a 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  :.  sqlite3_resu
18cf0 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 22  lt_error(pCtx, "
18d00 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20  wrong number of 
18d10 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e  arguments to fun
18d20 63 74 69 6f 6e 20 72 61 6e 6b 28 29 22 2c 20 2d  ction rank()", -
18d30 31 29 3b 0a 7d 0a 3c 2f 63 6f 64 65 62 6c 6f 63  1);.}.</codebloc
18d40 6b 3e 0a                                         k>.