Documentation Source Text

Hex Artifact Content
Login

Artifact 7efc438f82896f0dbf604fd348c73858bffdc41b:


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 0a 0a 20 20 3c 74 72 3e  ailable...  <tr>
2790: 3c 74 64 3e 63 6f 6d 70 72 65 73 73 3c 74 64 3e  <td>compress<td>
27a0: 0a 20 20 20 20 54 68 69 73 20 6f 70 74 69 6f 6e  .    This option
27b0: 20 69 73 20 75 73 65 64 20 74 6f 20 73 70 65 63   is used to spec
27c0: 69 66 79 20 74 68 65 20 63 6f 6d 70 72 65 73 73  ify the compress
27d0: 20 66 75 6e 63 74 69 6f 6e 2e 20 49 74 20 69 73   function. It is
27e0: 20 61 6e 20 65 72 72 6f 72 20 74 6f 0a 20 20 20   an error to.   
27f0: 20 73 70 65 63 69 66 79 20 61 20 63 6f 6d 70 72   specify a compr
2800: 65 73 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  ess function wit
2810: 68 6f 75 74 20 61 6c 73 6f 20 73 70 65 63 69 66  hout also specif
2820: 79 69 6e 67 20 61 6e 20 75 6e 63 6f 6d 70 72 65  ying an uncompre
2830: 73 73 0a 20 20 20 20 66 75 6e 63 74 69 6f 6e 2e  ss.    function.
2840: 0a 20 20 20 20 0a 20 20 3c 74 72 3e 3c 74 64 3e  .    .  <tr><td>
2850: 75 6e 63 6f 6d 70 72 65 73 73 3c 74 64 3e 0a 20  uncompress<td>. 
2860: 20 20 20 54 68 69 73 20 6f 70 74 69 6f 6e 20 69     This option i
2870: 73 20 75 73 65 64 20 74 6f 20 73 70 65 63 69 66  s used to specif
2880: 79 20 74 68 65 20 75 6e 63 6f 6d 70 72 65 73 73  y the uncompress
2890: 20 66 75 6e 63 74 69 6f 6e 2e 20 49 74 20 69 73   function. It is
28a0: 20 61 6e 20 65 72 72 6f 72 20 74 6f 0a 20 20 20   an error to.   
28b0: 20 73 70 65 63 69 66 79 20 61 6e 20 75 6e 63 6f   specify an unco
28c0: 6d 70 72 65 73 73 20 66 75 6e 63 74 69 6f 6e 20  mpress function 
28d0: 77 69 74 68 6f 75 74 20 61 6c 73 6f 20 73 70 65  without also spe
28e0: 63 69 66 79 69 6e 67 20 61 20 63 6f 6d 70 72 65  cifying a compre
28f0: 73 73 0a 20 20 20 20 66 75 6e 63 74 69 6f 6e 2e  ss.    function.
2900: 0a 3c 2f 74 61 62 6c 65 3e 0a 0a 3c 74 63 6c 3e  .</table>..<tcl>
2910: 68 64 5f 66 72 61 67 6d 65 6e 74 20 2a 66 74 73  hd_fragment *fts
2920: 34 63 6f 6d 70 72 65 73 73 69 6f 6e 20 7b 63 6f  4compression {co
2930: 6d 70 72 65 73 73 65 64 20 46 54 53 34 20 63 6f  mpressed FTS4 co
2940: 6e 74 65 6e 74 7d 3c 2f 74 63 6c 3e 0a 3c 70 3e  ntent}</tcl>.<p>
2950: 0a 20 20 54 68 65 20 63 6f 6d 70 72 65 73 73 20  .  The compress 
2960: 61 6e 64 20 75 6e 63 6f 6d 70 72 65 73 73 20 6f  and uncompress o
2970: 70 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 46 54 53  ptions allow FTS
2980: 34 20 63 6f 6e 74 65 6e 74 20 74 6f 20 62 65 20  4 content to be 
2990: 73 74 6f 72 65 64 20 69 6e 0a 20 20 74 68 65 20  stored in.  the 
29a0: 64 61 74 61 62 61 73 65 20 69 6e 20 61 20 63 6f  database in a co
29b0: 6d 70 72 65 73 73 65 64 20 66 6f 72 6d 2e 20 42  mpressed form. B
29c0: 6f 74 68 20 6f 70 74 69 6f 6e 73 20 73 68 6f 75  oth options shou
29d0: 6c 64 20 62 65 20 73 65 74 20 74 6f 20 74 68 65  ld be set to the
29e0: 20 6e 61 6d 65 0a 20 20 6f 66 20 61 6e 20 53 51   name.  of an SQ
29f0: 4c 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f  L scalar functio
2a00: 6e 20 72 65 67 69 73 74 65 72 65 64 20 75 73 69  n registered usi
2a10: 6e 67 20 5b 73 71 6c 69 74 65 33 5f 63 72 65 61  ng [sqlite3_crea
2a20: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 5d 0a 20  te_function()]. 
2a30: 20 74 68 61 74 20 61 63 63 65 70 74 73 20 61 20   that accepts a 
2a40: 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 2e  single argument.
2a50: 20 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 63 6f 6d   ..<p>.  The com
2a60: 70 72 65 73 73 20 66 75 6e 63 74 69 6f 6e 20 73  press function s
2a70: 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 61 20 63  hould return a c
2a80: 6f 6d 70 72 65 73 73 65 64 20 76 65 72 73 69 6f  ompressed versio
2a90: 6e 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 0a  n of the value .
2aa0: 20 20 70 61 73 73 65 64 20 74 6f 20 69 74 20 61    passed to it a
2ab0: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 45  s an argument. E
2ac0: 61 63 68 20 74 69 6d 65 20 64 61 74 61 20 69 73  ach time data is
2ad0: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
2ae0: 46 54 53 34 20 74 61 62 6c 65 2c 20 0a 20 20 65  FTS4 table, .  e
2af0: 61 63 68 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  ach column value
2b00: 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 74 68   is passed to th
2b10: 65 20 63 6f 6d 70 72 65 73 73 20 66 75 6e 63 74  e compress funct
2b20: 69 6f 6e 20 61 6e 64 20 74 68 65 20 72 65 73 75  ion and the resu
2b30: 6c 74 20 76 61 6c 75 65 20 0a 20 20 73 74 6f 72  lt value .  stor
2b40: 65 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ed in the databa
2b50: 73 65 2e 20 54 68 65 20 63 6f 6d 70 72 65 73 73  se. The compress
2b60: 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65   function may re
2b70: 74 75 72 6e 20 61 6e 79 20 74 79 70 65 20 6f 66  turn any type of
2b80: 20 53 51 4c 69 74 65 20 0a 20 20 76 61 6c 75 65   SQLite .  value
2b90: 20 28 62 6c 6f 62 2c 20 74 65 78 74 2c 20 72 65   (blob, text, re
2ba0: 61 6c 2c 20 69 6e 74 65 67 65 72 20 6f 72 20 6e  al, integer or n
2bb0: 75 6c 6c 29 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65  ull)...<p>.  The
2bc0: 20 75 6e 63 6f 6d 70 72 65 73 73 20 66 75 6e 63   uncompress func
2bd0: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 75 6e 63 6f  tion should unco
2be0: 6d 70 72 65 73 73 20 64 61 74 61 20 70 72 65 76  mpress data prev
2bf0: 69 6f 75 73 6c 79 20 63 6f 6d 70 72 65 73 73 65  iously compresse
2c00: 64 20 62 79 0a 20 20 74 68 65 20 63 6f 6d 70 72  d by.  the compr
2c10: 65 73 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 6e  ess function. In
2c20: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 66 6f   other words, fo
2c30: 72 20 61 6c 6c 20 53 51 4c 69 74 65 20 76 61 6c  r all SQLite val
2c40: 75 65 73 20 58 2c 20 69 74 20 73 68 6f 75 6c 64  ues X, it should
2c50: 0a 20 20 62 65 20 74 72 75 65 20 74 68 61 74 20  .  be true that 
2c60: 75 6e 63 6f 6d 70 72 65 73 73 28 63 6f 6d 70 72  uncompress(compr
2c70: 65 73 73 28 58 29 29 20 65 71 75 61 6c 73 20 58  ess(X)) equals X
2c80: 2e 20 57 68 65 6e 20 64 61 74 61 20 74 68 61 74  . When data that
2c90: 20 68 61 73 20 62 65 65 6e 0a 20 20 63 6f 6d 70   has been.  comp
2ca0: 72 65 73 73 65 64 20 62 79 20 74 68 65 20 63 6f  ressed by the co
2cb0: 6d 70 72 65 73 73 20 66 75 6e 63 74 69 6f 6e 20  mpress function 
2cc0: 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  is read from the
2cd0: 20 64 61 74 61 62 61 73 65 20 62 79 20 46 54 53   database by FTS
2ce0: 34 2c 20 69 74 0a 20 20 69 73 20 70 61 73 73 65  4, it.  is passe
2cf0: 64 20 74 6f 20 74 68 65 20 75 6e 63 6f 6d 70 72  d to the uncompr
2d00: 65 73 73 20 66 75 6e 63 74 69 6f 6e 20 62 65 66  ess function bef
2d10: 6f 72 65 20 69 74 20 69 73 20 75 73 65 64 2e 0a  ore it is used..
2d20: 0a 3c 70 3e 0a 20 20 49 66 20 74 68 65 20 73 70  .<p>.  If the sp
2d30: 65 63 69 66 69 65 64 20 63 6f 6d 70 72 65 73 73  ecified compress
2d40: 20 6f 72 20 75 6e 63 6f 6d 70 72 65 73 73 20 66   or uncompress f
2d50: 75 6e 63 74 69 6f 6e 73 20 64 6f 20 6e 6f 74 20  unctions do not 
2d60: 65 78 69 73 74 2c 20 74 68 65 20 74 61 62 6c 65  exist, the table
2d70: 0a 20 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20  .  may still be 
2d80: 63 72 65 61 74 65 64 2e 20 41 6e 20 65 72 72 6f  created. An erro
2d90: 72 20 69 73 20 6e 6f 74 20 72 65 74 75 72 6e 65  r is not returne
2da0: 64 20 75 6e 74 69 6c 20 74 68 65 20 46 54 53 34  d until the FTS4
2db0: 20 74 61 62 6c 65 20 69 73 0a 20 20 72 65 61 64   table is.  read
2dc0: 20 28 69 66 20 74 68 65 20 75 6e 63 6f 6d 70 72   (if the uncompr
2dd0: 65 73 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  ess function doe
2de0: 73 20 6e 6f 74 20 65 78 69 73 74 29 20 6f 72 20  s not exist) or 
2df0: 77 72 69 74 74 65 6e 20 28 69 66 20 69 74 20 69  written (if it i
2e00: 73 20 74 68 65 20 0a 20 20 63 6f 6d 70 72 65 73  s the .  compres
2e10: 73 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  s function that 
2e20: 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 29 2e  does not exist).
2e30: 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20  ..<codeblock>.  
2e40: 3c 69 3e 2d 2d 20 43 72 65 61 74 65 20 61 6e 20  <i>-- Create an 
2e50: 46 54 53 34 20 74 61 62 6c 65 20 74 68 61 74 20  FTS4 table that 
2e60: 73 74 6f 72 65 73 20 64 61 74 61 20 69 6e 20 63  stores data in c
2e70: 6f 6d 70 72 65 73 73 65 64 20 66 6f 72 6d 2e 20  ompressed form. 
2e80: 54 68 69 73 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  This</i>.  <i>--
2e90: 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68   assumes that th
2ea0: 65 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f  e scalar functio
2eb0: 6e 73 20 7a 69 70 28 29 20 61 6e 64 20 75 6e 7a  ns zip() and unz
2ec0: 69 70 28 29 20 68 61 76 65 20 62 65 65 6e 20 28  ip() have been (
2ed0: 6f 72 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 77  or</i>.  <i>-- w
2ee0: 69 6c 6c 20 62 65 29 20 61 64 64 65 64 20 74 6f  ill be) added to
2ef0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
2f00: 6e 64 6c 65 2e 3c 2f 69 3e 0a 20 20 43 52 45 41  ndle.</i>.  CREA
2f10: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
2f20: 20 70 61 70 65 72 73 20 55 53 49 4e 47 20 66 74   papers USING ft
2f30: 73 34 28 61 75 74 68 6f 72 2c 20 64 6f 63 75 6d  s4(author, docum
2f40: 65 6e 74 2c 20 63 6f 6d 70 72 65 73 73 3d 7a 69  ent, compress=zi
2f50: 70 2c 20 75 6e 63 6f 6d 70 72 65 73 73 3d 75 6e  p, uncompress=un
2f60: 7a 69 70 29 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63  zip);.</codebloc
2f70: 6b 3e 0a 0a 3c 70 3e 0a 20 20 57 68 65 6e 20 75  k>..<p>.  When u
2f80: 73 69 6e 67 20 46 54 53 34 2c 20 73 70 65 63 69  sing FTS4, speci
2f90: 66 79 69 6e 67 20 61 20 63 6f 6c 75 6d 6e 20 6e  fying a column n
2fa0: 61 6d 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ame that contain
2fb0: 73 20 61 6e 20 22 3d 22 20 63 68 61 72 61 63 74  s an "=" charact
2fc0: 65 72 0a 20 20 61 6e 64 20 69 73 20 6e 6f 74 20  er.  and is not 
2fd0: 65 69 74 68 65 72 20 61 20 22 74 6f 6b 65 6e 69  either a "tokeni
2fe0: 7a 65 3d 2a 22 20 73 70 65 63 69 66 69 63 61 74  ze=*" specificat
2ff0: 69 6f 6e 20 6f 72 20 61 20 72 65 63 6f 67 6e 69  ion or a recogni
3000: 7a 65 64 20 46 54 53 34 20 6f 70 74 69 6f 6e 0a  zed FTS4 option.
3010: 20 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 57    is an error. W
3020: 69 74 68 20 46 54 53 33 2c 20 74 68 65 20 66 69  ith FTS3, the fi
3030: 72 73 74 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65  rst token in the
3040: 20 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20 64 69   unrecognized di
3050: 72 65 63 74 69 76 65 20 69 73 20 0a 20 20 69 6e  rective is .  in
3060: 74 65 72 70 72 65 74 65 64 20 61 73 20 61 20 63  terpreted as a c
3070: 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 20 53 69 6d 69  olumn name. Simi
3080: 6c 61 72 6c 79 2c 20 73 70 65 63 69 66 79 69 6e  larly, specifyin
3090: 67 20 6d 75 6c 74 69 70 6c 65 20 22 74 6f 6b 65  g multiple "toke
30a0: 6e 69 7a 65 3d 2a 22 0a 20 20 64 69 72 65 63 74  nize=*".  direct
30b0: 69 76 65 73 20 69 6e 20 61 20 73 69 6e 67 6c 65  ives in a single
30c0: 20 74 61 62 6c 65 20 64 65 63 6c 61 72 61 74 69   table declarati
30d0: 6f 6e 20 69 73 20 61 6e 20 65 72 72 6f 72 20 77  on is an error w
30e0: 68 65 6e 20 75 73 69 6e 67 20 46 54 53 34 2c 20  hen using FTS4, 
30f0: 77 68 65 72 65 61 73 0a 20 20 74 68 65 20 73 65  whereas.  the se
3100: 63 6f 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75  cond and subsequ
3110: 65 6e 74 20 22 74 6f 6b 65 6e 69 7a 65 3d 2a 22  ent "tokenize=*"
3120: 20 64 69 72 65 63 74 69 76 65 73 20 61 72 65 20   directives are 
3130: 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 63  interpreted as c
3140: 6f 6c 75 6d 6e 0a 20 20 6e 61 6d 65 73 20 62 79  olumn.  names by
3150: 20 46 54 53 33 2e 20 46 6f 72 20 65 78 61 6d 70   FTS3. For examp
3160: 6c 65 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e  le:..<codeblock>
3170: 0a 20 20 3c 69 3e 2d 2d 20 41 6e 20 65 72 72 6f  .  <i>-- An erro
3180: 72 2e 20 46 54 53 34 20 64 6f 65 73 20 6e 6f 74  r. FTS4 does not
3190: 20 72 65 63 6f 67 6e 69 7a 65 20 74 68 65 20 64   recognize the d
31a0: 69 72 65 63 74 69 76 65 20 22 78 79 7a 3d 61 62  irective "xyz=ab
31b0: 63 22 2e 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45  c".</i>.  CREATE
31c0: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 70   VIRTUAL TABLE p
31d0: 61 70 65 72 73 20 55 53 49 4e 47 20 66 74 73 34  apers USING fts4
31e0: 28 61 75 74 68 6f 72 2c 20 64 6f 63 75 6d 65 6e  (author, documen
31f0: 74 2c 20 78 79 7a 3d 61 62 63 29 3b 0a 0a 20 20  t, xyz=abc);..  
3200: 3c 69 3e 2d 2d 20 43 72 65 61 74 65 20 61 6e 20  <i>-- Create an 
3210: 46 54 53 33 20 74 61 62 6c 65 20 77 69 74 68 20  FTS3 table with 
3220: 74 68 72 65 65 20 63 6f 6c 75 6d 6e 73 20 2d 20  three columns - 
3230: 22 61 75 74 68 6f 72 22 2c 20 22 64 6f 63 75 6d  "author", "docum
3240: 65 6e 74 22 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  ent"</i>.  <i>--
3250: 20 61 6e 64 20 22 78 79 7a 22 2e 3c 2f 69 3e 0a   and "xyz".</i>.
3260: 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c    CREATE VIRTUAL
3270: 20 54 41 42 4c 45 20 70 61 70 65 72 73 20 55 53   TABLE papers US
3280: 49 4e 47 20 66 74 73 33 28 61 75 74 68 6f 72 2c  ING fts3(author,
3290: 20 64 6f 63 75 6d 65 6e 74 2c 20 78 79 7a 3d 61   document, xyz=a
32a0: 62 63 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 41 6e  bc);..  <i>-- An
32b0: 20 65 72 72 6f 72 2e 20 46 54 53 34 20 64 6f 65   error. FTS4 doe
32c0: 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 6d 75 6c 74  s not allow mult
32d0: 69 70 6c 65 20 74 6f 6b 65 6e 69 7a 65 3d 2a 20  iple tokenize=* 
32e0: 64 69 72 65 63 74 69 76 65 73 3c 2f 69 3e 0a 20  directives</i>. 
32f0: 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
3300: 54 41 42 4c 45 20 70 61 70 65 72 73 20 55 53 49  TABLE papers USI
3310: 4e 47 20 66 74 73 34 28 74 6f 6b 65 6e 69 7a 65  NG fts4(tokenize
3320: 3d 70 6f 72 74 65 72 2c 20 74 6f 6b 65 6e 69 7a  =porter, tokeniz
3330: 65 3d 73 69 6d 70 6c 65 29 3b 0a 0a 20 20 3c 69  e=simple);..  <i
3340: 3e 2d 2d 20 43 72 65 61 74 65 20 61 6e 20 46 54  >-- Create an FT
3350: 53 33 20 74 61 62 6c 65 20 77 69 74 68 20 61 20  S3 table with a 
3360: 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6e 61  single column na
3370: 6d 65 64 20 22 74 6f 6b 65 6e 69 7a 65 22 2e 20  med "tokenize". 
3380: 54 68 65 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20  The</i>.  <i>-- 
3390: 74 61 62 6c 65 20 75 73 65 73 20 74 68 65 20 22  table uses the "
33a0: 70 6f 72 74 65 72 22 20 74 6f 6b 65 6e 69 7a 65  porter" tokenize
33b0: 72 2e 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45 20  r.</i>.  CREATE 
33c0: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 70 61  VIRTUAL TABLE pa
33d0: 70 65 72 73 20 55 53 49 4e 47 20 66 74 73 33 28  pers USING fts3(
33e0: 74 6f 6b 65 6e 69 7a 65 3d 70 6f 72 74 65 72 2c  tokenize=porter,
33f0: 20 74 6f 6b 65 6e 69 7a 65 3d 73 69 6d 70 6c 65   tokenize=simple
3400: 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 41 6e 20 65  );..  <i>-- An e
3410: 72 72 6f 72 2e 20 43 61 6e 6e 6f 74 20 63 72 65  rror. Cannot cre
3420: 61 74 65 20 61 20 74 61 62 6c 65 20 77 69 74 68  ate a table with
3430: 20 74 77 6f 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d   two columns nam
3440: 65 64 20 22 74 6f 6b 65 6e 69 7a 65 22 2e 3c 2f  ed "tokenize".</
3450: 69 3e 0a 20 20 43 52 45 41 54 45 20 56 49 52 54  i>.  CREATE VIRT
3460: 55 41 4c 20 54 41 42 4c 45 20 70 61 70 65 72 73  UAL TABLE papers
3470: 20 55 53 49 4e 47 20 66 74 73 33 28 74 6f 6b 65   USING fts3(toke
3480: 6e 69 7a 65 3d 70 6f 72 74 65 72 2c 20 74 6f 6b  nize=porter, tok
3490: 65 6e 69 7a 65 3d 73 69 6d 70 6c 65 2c 20 74 6f  enize=simple, to
34a0: 6b 65 6e 69 7a 65 3d 69 63 75 29 3b 0a 3c 2f 63  kenize=icu);.</c
34b0: 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 68 32 3e 50  odeblock>..<h2>P
34c0: 6f 70 75 6c 61 74 69 6e 67 20 46 54 53 20 54 61  opulating FTS Ta
34d0: 62 6c 65 73 3c 2f 68 32 3e 0a 0a 20 20 3c 70 3e  bles</h2>..  <p>
34e0: 0a 20 20 20 20 46 54 53 20 74 61 62 6c 65 73 20  .    FTS tables 
34f0: 61 72 65 20 70 6f 70 75 6c 61 74 65 64 20 75 73  are populated us
3500: 69 6e 67 20 5b 49 4e 53 45 52 54 5d 2c 20 5b 55  ing [INSERT], [U
3510: 50 44 41 54 45 5d 20 61 6e 64 20 5b 44 45 4c 45  PDATE] and [DELE
3520: 54 45 5d 0a 20 20 20 20 73 74 61 74 65 6d 65 6e  TE].    statemen
3530: 74 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 77  ts in the same w
3540: 61 79 20 61 73 20 6f 72 64 69 6e 61 72 79 20 53  ay as ordinary S
3550: 51 4c 69 74 65 20 74 61 62 6c 65 73 20 61 72 65  QLite tables are
3560: 2e 0a 0a 20 20 3c 70 3e 0a 20 20 20 20 41 73 20  ...  <p>.    As 
3570: 77 65 6c 6c 20 61 73 20 74 68 65 20 63 6f 6c 75  well as the colu
3580: 6d 6e 73 20 6e 61 6d 65 64 20 62 79 20 74 68 65  mns named by the
3590: 20 75 73 65 72 20 28 6f 72 20 74 68 65 20 22 63   user (or the "c
35a0: 6f 6e 74 65 6e 74 22 20 63 6f 6c 75 6d 6e 20 69  ontent" column i
35b0: 66 20 6e 6f 0a 20 20 20 20 6d 6f 64 75 6c 65 20  f no.    module 
35c0: 61 72 67 75 6d 65 6e 74 73 20 77 65 72 65 20 73  arguments were s
35d0: 70 65 63 69 66 69 65 64 20 61 73 20 70 61 72 74  pecified as part
35e0: 20 6f 66 20 74 68 65 20 5b 43 52 45 41 54 45 20   of the [CREATE 
35f0: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 5d 20 0a  VIRTUAL TABLE] .
3600: 20 20 20 20 73 74 61 74 65 6d 65 6e 74 29 2c 20      statement), 
3610: 65 61 63 68 20 46 54 53 20 74 61 62 6c 65 20 68  each FTS table h
3620: 61 73 20 61 20 22 72 6f 77 69 64 22 20 63 6f 6c  as a "rowid" col
3630: 75 6d 6e 2e 20 54 68 65 20 72 6f 77 69 64 20 6f  umn. The rowid o
3640: 66 20 61 6e 20 46 54 53 0a 20 20 20 20 74 61 62  f an FTS.    tab
3650: 6c 65 20 62 65 68 61 76 65 73 20 69 6e 20 74 68  le behaves in th
3660: 65 20 73 61 6d 65 20 77 61 79 20 61 73 20 74 68  e same way as th
3670: 65 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 20 6f  e rowid column o
3680: 66 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 53 51  f an ordinary SQ
3690: 4c 69 74 65 20 0a 20 20 20 20 74 61 62 6c 65 2c  Lite .    table,
36a0: 20 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65   except that the
36b0: 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69   values stored i
36c0: 6e 20 74 68 65 20 72 6f 77 69 64 20 63 6f 6c 75  n the rowid colu
36d0: 6d 6e 20 6f 66 20 61 6e 20 46 54 53 20 74 61 62  mn of an FTS tab
36e0: 6c 65 20 0a 20 20 20 20 72 65 6d 61 69 6e 20 75  le .    remain u
36f0: 6e 63 68 61 6e 67 65 64 20 69 66 20 74 68 65 20  nchanged if the 
3700: 64 61 74 61 62 61 73 65 20 69 73 20 72 65 62 75  database is rebu
3710: 69 6c 74 20 75 73 69 6e 67 20 74 68 65 20 5b 56  ilt using the [V
3720: 41 43 55 55 4d 5d 20 63 6f 6d 6d 61 6e 64 2e 20  ACUUM] command. 
3730: 0a 20 20 20 20 46 6f 72 20 46 54 53 20 74 61 62  .    For FTS tab
3740: 6c 65 73 2c 20 22 64 6f 63 69 64 22 20 69 73 20  les, "docid" is 
3750: 61 6c 6c 6f 77 65 64 20 61 73 20 61 6e 20 61 6c  allowed as an al
3760: 69 61 73 20 61 6c 6f 6e 67 20 77 69 74 68 20 74  ias along with t
3770: 68 65 20 75 73 75 61 6c 20 22 72 6f 77 69 64 22  he usual "rowid"
3780: 2c 0a 20 20 20 20 22 6f 69 64 22 20 61 6e 64 20  ,.    "oid" and 
3790: 22 5f 6f 69 64 5f 22 20 69 64 65 6e 74 69 66 69  "_oid_" identifi
37a0: 65 72 73 2e 20 41 74 74 65 6d 70 74 69 6e 67 20  ers. Attempting 
37b0: 74 6f 20 69 6e 73 65 72 74 20 6f 72 20 75 70 64  to insert or upd
37c0: 61 74 65 20 61 20 72 6f 77 20 77 69 74 68 20 61  ate a row with a
37d0: 20 0a 20 20 20 20 64 6f 63 69 64 20 76 61 6c 75   .    docid valu
37e0: 65 20 74 68 61 74 20 61 6c 72 65 61 64 79 20 65  e that already e
37f0: 78 69 73 74 73 20 69 6e 20 74 68 65 20 74 61 62  xists in the tab
3800: 6c 65 20 69 73 20 61 6e 20 65 72 72 6f 72 2c 20  le is an error, 
3810: 6a 75 73 74 20 61 73 20 69 74 20 77 6f 75 6c 64  just as it would
3820: 20 0a 20 20 20 20 62 65 20 77 69 74 68 20 61 6e   .    be with an
3830: 20 6f 72 64 69 6e 61 72 79 20 53 51 4c 69 74 65   ordinary SQLite
3840: 20 74 61 62 6c 65 2e 0a 0a 20 20 3c 70 3e 0a 20   table...  <p>. 
3850: 20 20 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20     There is one 
3860: 6f 74 68 65 72 20 73 75 62 74 6c 65 20 64 69 66  other subtle dif
3870: 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
3880: 22 64 6f 63 69 64 22 20 61 6e 64 20 74 68 65 20  "docid" and the 
3890: 6e 6f 72 6d 61 6c 20 53 51 4c 69 74 65 0a 20 20  normal SQLite.  
38a0: 20 20 61 6c 69 61 73 65 73 20 66 6f 72 20 74 68    aliases for th
38b0: 65 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 2e 20  e rowid column. 
38c0: 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 6e 20  Normally, if an 
38d0: 49 4e 53 45 52 54 20 6f 72 20 55 50 44 41 54 45  INSERT or UPDATE
38e0: 20 73 74 61 74 65 6d 65 6e 74 20 0a 20 20 20 20   statement .    
38f0: 61 73 73 69 67 6e 73 20 64 69 73 63 72 65 74 65  assigns discrete
3900: 20 76 61 6c 75 65 73 20 74 6f 20 74 77 6f 20 6f   values to two o
3910: 72 20 6d 6f 72 65 20 61 6c 69 61 73 65 73 20 6f  r more aliases o
3920: 66 20 74 68 65 20 72 6f 77 69 64 20 63 6f 6c 75  f the rowid colu
3930: 6d 6e 2c 20 53 51 4c 69 74 65 20 0a 20 20 20 20  mn, SQLite .    
3940: 77 72 69 74 65 73 20 74 68 65 20 72 69 67 68 74  writes the right
3950: 6d 6f 73 74 20 6f 66 20 73 75 63 68 20 76 61 6c  most of such val
3960: 75 65 73 20 73 70 65 63 69 66 69 65 64 20 69 6e  ues specified in
3970: 20 74 68 65 20 49 4e 53 45 52 54 20 6f 72 20 55   the INSERT or U
3980: 50 44 41 54 45 0a 20 20 20 20 73 74 61 74 65 6d  PDATE.    statem
3990: 65 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  ent to the datab
39a0: 61 73 65 2e 20 48 6f 77 65 76 65 72 2c 20 61 73  ase. However, as
39b0: 73 69 67 6e 69 6e 67 20 61 20 6e 6f 6e 2d 4e 55  signing a non-NU
39c0: 4c 4c 20 76 61 6c 75 65 20 74 6f 20 62 6f 74 68  LL value to both
39d0: 0a 20 20 20 20 74 68 65 20 22 64 6f 63 69 64 22  .    the "docid"
39e0: 20 61 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65   and one or more
39f0: 20 6f 66 20 74 68 65 20 53 51 4c 69 74 65 20 72   of the SQLite r
3a00: 6f 77 69 64 20 61 6c 69 61 73 65 73 20 77 68 65  owid aliases whe
3a10: 6e 20 69 6e 73 65 72 74 69 6e 67 20 6f 72 0a 20  n inserting or. 
3a20: 20 20 20 75 70 64 61 74 69 6e 67 20 61 6e 20 46     updating an F
3a30: 54 53 20 74 61 62 6c 65 20 69 73 20 63 6f 6e 73  TS table is cons
3a40: 69 64 65 72 65 64 20 61 6e 20 65 72 72 6f 72 2e  idered an error.
3a50: 20 53 65 65 20 62 65 6c 6f 77 20 66 6f 72 20 61   See below for a
3a60: 6e 20 65 78 61 6d 70 6c 65 2e 0a 0a 3c 63 6f 64  n example...<cod
3a70: 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d 20  eblock>.  <i>-- 
3a80: 43 72 65 61 74 65 20 61 6e 20 46 54 53 20 74 61  Create an FTS ta
3a90: 62 6c 65 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45  ble</i>.  CREATE
3aa0: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 70   VIRTUAL TABLE p
3ab0: 61 67 65 73 20 55 53 49 4e 47 20 66 74 73 34 28  ages USING fts4(
3ac0: 74 69 74 6c 65 2c 20 62 6f 64 79 29 3b 0a 0a 20  title, body);.. 
3ad0: 20 3c 69 3e 2d 2d 20 49 6e 73 65 72 74 20 61 20   <i>-- Insert a 
3ae0: 72 6f 77 20 77 69 74 68 20 61 20 73 70 65 63 69  row with a speci
3af0: 66 69 63 20 64 6f 63 69 64 20 76 61 6c 75 65 2e  fic docid value.
3b00: 3c 2f 69 3e 0a 20 20 49 4e 53 45 52 54 20 49 4e  </i>.  INSERT IN
3b10: 54 4f 20 70 61 67 65 73 28 64 6f 63 69 64 2c 20  TO pages(docid, 
3b20: 74 69 74 6c 65 2c 20 62 6f 64 79 29 20 56 41 4c  title, body) VAL
3b30: 55 45 53 28 35 33 2c 20 27 48 6f 6d 65 20 50 61  UES(53, 'Home Pa
3b40: 67 65 27 2c 20 27 53 51 4c 69 74 65 20 69 73 20  ge', 'SQLite is 
3b50: 61 20 73 6f 66 74 77 61 72 65 2e 2e 2e 27 29 3b  a software...');
3b60: 0a 0a 20 20 3c 69 3e 2d 2d 20 49 6e 73 65 72 74  ..  <i>-- Insert
3b70: 20 61 20 72 6f 77 20 61 6e 64 20 61 6c 6c 6f 77   a row and allow
3b80: 20 46 54 53 20 74 6f 20 61 73 73 69 67 6e 20 61   FTS to assign a
3b90: 20 64 6f 63 69 64 20 76 61 6c 75 65 20 75 73 69   docid value usi
3ba0: 6e 67 20 74 68 65 20 73 61 6d 65 20 61 6c 67 6f  ng the same algo
3bb0: 72 69 74 68 6d 20 61 73 3c 2f 69 3e 0a 20 20 3c  rithm as</i>.  <
3bc0: 69 3e 2d 2d 20 53 51 4c 69 74 65 20 75 73 65 73  i>-- SQLite uses
3bd0: 20 66 6f 72 20 6f 72 64 69 6e 61 72 79 20 74 61   for ordinary ta
3be0: 62 6c 65 73 2e 20 49 6e 20 74 68 69 73 20 63 61  bles. In this ca
3bf0: 73 65 20 74 68 65 20 6e 65 77 20 64 6f 63 69 64  se the new docid
3c00: 20 77 69 6c 6c 20 62 65 20 35 34 2c 3c 2f 69 3e   will be 54,</i>
3c10: 0a 20 20 3c 69 3e 2d 2d 20 6f 6e 65 20 67 72 65  .  <i>-- one gre
3c20: 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61  ater than the la
3c30: 72 67 65 73 74 20 64 6f 63 69 64 20 63 75 72 72  rgest docid curr
3c40: 65 6e 74 6c 79 20 70 72 65 73 65 6e 74 20 69 6e  ently present in
3c50: 20 74 68 65 20 74 61 62 6c 65 2e 3c 2f 69 3e 0a   the table.</i>.
3c60: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61    INSERT INTO pa
3c70: 67 65 73 28 74 69 74 6c 65 2c 20 62 6f 64 79 29  ges(title, body)
3c80: 20 56 41 4c 55 45 53 28 27 44 6f 77 6e 6c 6f 61   VALUES('Downloa
3c90: 64 27 2c 20 27 41 6c 6c 20 53 51 4c 69 74 65 20  d', 'All SQLite 
3ca0: 73 6f 75 72 63 65 20 63 6f 64 65 2e 2e 2e 27 29  source code...')
3cb0: 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 43 68 61 6e 67  ;..  <i>-- Chang
3cc0: 65 20 74 68 65 20 74 69 74 6c 65 20 6f 66 20 74  e the title of t
3cd0: 68 65 20 72 6f 77 20 6a 75 73 74 20 69 6e 73 65  he row just inse
3ce0: 72 74 65 64 2e 3c 2f 69 3e 0a 20 20 55 50 44 41  rted.</i>.  UPDA
3cf0: 54 45 20 70 61 67 65 73 20 53 45 54 20 74 69 74  TE pages SET tit
3d00: 6c 65 20 3d 20 27 44 6f 77 6e 6c 6f 61 64 20 53  le = 'Download S
3d10: 51 4c 69 74 65 27 20 57 48 45 52 45 20 72 6f 77  QLite' WHERE row
3d20: 69 64 20 3d 20 35 34 3b 0a 0a 20 20 3c 69 3e 2d  id = 54;..  <i>-
3d30: 2d 20 44 65 6c 65 74 65 20 74 68 65 20 65 6e 74  - Delete the ent
3d40: 69 72 65 20 74 61 62 6c 65 20 63 6f 6e 74 65 6e  ire table conten
3d50: 74 73 2e 3c 2f 69 3e 0a 20 20 44 45 4c 45 54 45  ts.</i>.  DELETE
3d60: 20 46 52 4f 4d 20 70 61 67 65 73 3b 0a 0a 20 20   FROM pages;..  
3d70: 3c 69 3e 2d 2d 20 54 68 65 20 66 6f 6c 6c 6f 77  <i>-- The follow
3d80: 69 6e 67 20 69 73 20 61 6e 20 65 72 72 6f 72 2e  ing is an error.
3d90: 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   It is not possi
3da0: 62 6c 65 20 74 6f 20 61 73 73 69 67 6e 20 6e 6f  ble to assign no
3db0: 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 73 20 74 6f  n-NULL values to
3dc0: 20 62 6f 74 68 3c 2f 69 3e 0a 20 20 3c 69 3e 2d   both</i>.  <i>-
3dd0: 2d 20 74 68 65 20 72 6f 77 69 64 20 61 6e 64 20  - the rowid and 
3de0: 64 6f 63 69 64 20 63 6f 6c 75 6d 6e 73 20 6f 66  docid columns of
3df0: 20 61 6e 20 46 54 53 20 74 61 62 6c 65 2e 3c 2f   an FTS table.</
3e00: 69 3e 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  i>.  INSERT INTO
3e10: 20 70 61 67 65 73 28 72 6f 77 69 64 2c 20 64 6f   pages(rowid, do
3e20: 63 69 64 2c 20 74 69 74 6c 65 2c 20 62 6f 64 79  cid, title, body
3e30: 29 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 27  ) VALUES(1, 2, '
3e40: 41 20 74 69 74 6c 65 27 2c 20 27 41 20 64 6f 63  A title', 'A doc
3e50: 75 6d 65 6e 74 20 62 6f 64 79 27 29 3b 0a 3c 2f  ument body');.</
3e60: 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 20 20 3c 70  codeblock>..  <p
3e70: 3e 0a 20 20 20 20 54 6f 20 73 75 70 70 6f 72 74  >.    To support
3e80: 20 66 75 6c 6c 2d 74 65 78 74 20 71 75 65 72 69   full-text queri
3e90: 65 73 2c 20 46 54 53 20 6d 61 69 6e 74 61 69 6e  es, FTS maintain
3ea0: 73 20 61 6e 20 69 6e 76 65 72 74 65 64 20 69 6e  s an inverted in
3eb0: 64 65 78 20 74 68 61 74 20 6d 61 70 73 0a 20 20  dex that maps.  
3ec0: 20 20 66 72 6f 6d 20 65 61 63 68 20 75 6e 69 71    from each uniq
3ed0: 75 65 20 74 65 72 6d 20 6f 72 20 77 6f 72 64 20  ue term or word 
3ee0: 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e 20  that appears in 
3ef0: 74 68 65 20 64 61 74 61 73 65 74 20 74 6f 20 74  the dataset to t
3f00: 68 65 20 6c 6f 63 61 74 69 6f 6e 73 0a 20 20 20  he locations.   
3f10: 20 69 6e 20 77 68 69 63 68 20 69 74 20 61 70 70   in which it app
3f20: 65 61 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  ears within the 
3f30: 74 61 62 6c 65 20 63 6f 6e 74 65 6e 74 73 2e 20  table contents. 
3f40: 46 6f 72 20 74 68 65 20 63 75 72 69 6f 75 73 2c  For the curious,
3f50: 20 61 20 0a 20 20 20 20 63 6f 6d 70 6c 65 74 65   a .    complete
3f60: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   description of 
3f70: 74 68 65 20 5b 73 65 67 6d 65 6e 74 20 62 74 72  the [segment btr
3f80: 65 65 7c 64 61 74 61 20 73 74 72 75 63 74 75 72  ee|data structur
3f90: 65 5d 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  e] used to store
3fa0: 0a 20 20 20 20 74 68 69 73 20 69 6e 64 65 78 20  .    this index 
3fb0: 77 69 74 68 69 6e 20 74 68 65 20 64 61 74 61 62  within the datab
3fc0: 61 73 65 20 66 69 6c 65 20 61 70 70 65 61 72 73  ase file appears
3fd0: 20 62 65 6c 6f 77 2e 20 41 20 66 65 61 74 75 72   below. A featur
3fe0: 65 20 6f 66 0a 20 20 20 20 74 68 69 73 20 64 61  e of.    this da
3ff0: 74 61 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ta structure is 
4000: 74 68 61 74 20 61 74 20 61 6e 79 20 74 69 6d 65  that at any time
4010: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 61   the database ma
4020: 79 20 63 6f 6e 74 61 69 6e 20 6e 6f 74 0a 20 20  y contain not.  
4030: 20 20 6f 6e 65 20 69 6e 64 65 78 20 62 2d 74 72    one index b-tr
4040: 65 65 2c 20 62 75 74 20 73 65 76 65 72 61 6c 20  ee, but several 
4050: 64 69 66 66 65 72 65 6e 74 20 62 2d 74 72 65 65  different b-tree
4060: 73 20 74 68 61 74 20 61 72 65 20 69 6e 63 72 65  s that are incre
4070: 6d 65 6e 74 61 6c 6c 79 0a 20 20 20 20 6d 65 72  mentally.    mer
4080: 67 65 64 20 61 73 20 72 6f 77 73 20 61 72 65 20  ged as rows are 
4090: 69 6e 73 65 72 74 65 64 2c 20 75 70 64 61 74 65  inserted, update
40a0: 64 20 61 6e 64 20 64 65 6c 65 74 65 64 2e 20 54  d and deleted. T
40b0: 68 69 73 20 74 65 63 68 6e 69 71 75 65 20 69 6d  his technique im
40c0: 70 72 6f 76 65 73 20 0a 20 20 20 20 70 65 72 66  proves .    perf
40d0: 6f 72 6d 61 6e 63 65 20 77 68 65 6e 20 77 72 69  ormance when wri
40e0: 74 69 6e 67 20 74 6f 20 61 6e 20 46 54 53 20 74  ting to an FTS t
40f0: 61 62 6c 65 2c 20 62 75 74 20 63 61 75 73 65 73  able, but causes
4100: 20 73 6f 6d 65 20 6f 76 65 72 68 65 61 64 20 66   some overhead f
4110: 6f 72 0a 20 20 20 20 66 75 6c 6c 2d 74 65 78 74  or.    full-text
4120: 20 71 75 65 72 69 65 73 20 74 68 61 74 20 75 73   queries that us
4130: 65 20 74 68 65 20 69 6e 64 65 78 2e 20 45 78 65  e the index. Exe
4140: 63 75 74 69 6e 67 20 61 6e 20 53 51 4c 20 73 74  cuting an SQL st
4150: 61 74 65 6d 65 6e 74 20 6f 66 20 74 68 65 0a 20  atement of the. 
4160: 20 20 20 66 6f 72 6d 20 22 49 4e 53 45 52 54 20     form "INSERT 
4170: 49 4e 54 4f 20 26 6c 74 3b 66 74 73 2d 74 61 62  INTO &lt;fts-tab
4180: 6c 65 26 67 74 3b 28 26 6c 74 3b 66 74 73 2d 74  le&gt;(&lt;fts-t
4190: 61 62 6c 65 26 67 74 3b 29 20 56 41 4c 55 45 53  able&gt;) VALUES
41a0: 28 27 6f 70 74 69 6d 69 7a 65 27 29 22 0a 20 20  ('optimize')".  
41b0: 20 20 63 61 75 73 65 73 20 46 54 53 20 74 6f 20    causes FTS to 
41c0: 6d 65 72 67 65 20 61 6c 6c 20 65 78 69 73 74 69  merge all existi
41d0: 6e 67 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73  ng index b-trees
41e0: 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 6c   into a single l
41f0: 61 72 67 65 0a 20 20 20 20 62 2d 74 72 65 65 20  arge.    b-tree 
4200: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65  containing the e
4210: 6e 74 69 72 65 20 69 6e 64 65 78 2e 20 54 68 69  ntire index. Thi
4220: 73 20 63 61 6e 20 62 65 20 61 6e 20 65 78 70 65  s can be an expe
4230: 6e 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e 2c  nsive operation,
4240: 0a 20 20 20 20 62 75 74 20 6d 61 79 20 73 70 65  .    but may spe
4250: 65 64 20 75 70 20 66 75 74 75 72 65 20 71 75 65  ed up future que
4260: 72 69 65 73 2e 20 0a 0a 20 20 3c 70 3e 0a 20 20  ries. ..  <p>.  
4270: 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74    For example, t
4280: 6f 20 6f 70 74 69 6d 69 7a 65 20 74 68 65 20 66  o optimize the f
4290: 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 20 66  ull-text index f
42a0: 6f 72 20 61 6e 20 46 54 53 20 74 61 62 6c 65 20  or an FTS table 
42b0: 6e 61 6d 65 64 0a 20 20 20 20 22 64 6f 63 73 22  named.    "docs"
42c0: 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20  :..<codeblock>. 
42d0: 20 3c 69 3e 2d 2d 20 4f 70 74 69 6d 69 7a 65 20   <i>-- Optimize 
42e0: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 72  the internal str
42f0: 75 63 74 75 72 65 20 6f 66 20 46 54 53 20 74 61  ucture of FTS ta
4300: 62 6c 65 20 22 64 6f 63 73 22 2e 3c 2f 69 3e 0a  ble "docs".</i>.
4310: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64 6f    INSERT INTO do
4320: 63 73 28 64 6f 63 73 29 20 56 41 4c 55 45 53 28  cs(docs) VALUES(
4330: 27 6f 70 74 69 6d 69 7a 65 27 29 3b 0a 3c 2f 63  'optimize');.</c
4340: 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 20 20 3c 70 3e  odeblock>..  <p>
4350: 0a 20 20 20 20 54 68 65 20 73 74 61 74 65 6d 65  .    The stateme
4360: 6e 74 20 61 62 6f 76 65 20 6d 61 79 20 61 70 70  nt above may app
4370: 65 61 72 20 73 79 6e 74 61 63 74 69 63 61 6c 6c  ear syntacticall
4380: 79 20 69 6e 63 6f 72 72 65 63 74 20 74 6f 20 73  y incorrect to s
4390: 6f 6d 65 2e 20 52 65 66 65 72 20 74 6f 0a 20 20  ome. Refer to.  
43a0: 20 20 74 68 65 20 73 65 63 74 69 6f 6e 20 64 65    the section de
43b0: 73 63 72 69 62 69 6e 67 20 74 68 65 20 5b 73 69  scribing the [si
43c0: 6d 70 6c 65 20 66 74 73 20 71 75 65 72 69 65 73  mple fts queries
43d0: 5d 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61  ] for an explana
43e0: 74 69 6f 6e 2e 0a 0a 20 20 3c 70 3e 0a 20 20 20  tion...  <p>.   
43f0: 20 54 68 65 72 65 20 69 73 20 61 6e 6f 74 68 65   There is anothe
4400: 72 2c 20 64 65 70 72 65 63 61 74 65 64 2c 20 6d  r, deprecated, m
4410: 65 74 68 6f 64 20 66 6f 72 20 69 6e 76 6f 6b 69  ethod for invoki
4420: 6e 67 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 20  ng the optimize 
4430: 0a 20 20 20 20 6f 70 65 72 61 74 69 6f 6e 20 75  .    operation u
4440: 73 69 6e 67 20 61 20 53 45 4c 45 43 54 20 73 74  sing a SELECT st
4450: 61 74 65 6d 65 6e 74 2e 20 4e 65 77 20 63 6f 64  atement. New cod
4460: 65 20 73 68 6f 75 6c 64 20 75 73 65 20 73 74 61  e should use sta
4470: 74 65 6d 65 6e 74 73 0a 20 20 20 20 73 69 6d 69  tements.    simi
4480: 6c 61 72 20 74 6f 20 74 68 65 20 49 4e 53 45 52  lar to the INSER
4490: 54 20 61 62 6f 76 65 20 74 6f 20 6f 70 74 69 6d  T above to optim
44a0: 69 7a 65 20 46 54 53 20 73 74 72 75 63 74 75 72  ize FTS structur
44b0: 65 73 2e 0a 0a 3c 68 32 20 74 61 67 73 3d 22 73  es...<h2 tags="s
44c0: 69 6d 70 6c 65 20 66 74 73 20 71 75 65 72 69 65  imple fts querie
44d0: 73 22 3e 53 69 6d 70 6c 65 20 46 54 53 20 51 75  s">Simple FTS Qu
44e0: 65 72 69 65 73 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a  eries</h2>..<p>.
44f0: 20 20 41 73 20 66 6f 72 20 61 6c 6c 20 6f 74 68    As for all oth
4500: 65 72 20 53 51 4c 69 74 65 20 74 61 62 6c 65 73  er SQLite tables
4510: 2c 20 76 69 72 74 75 61 6c 20 6f 72 20 6f 74 68  , virtual or oth
4520: 65 72 77 69 73 65 2c 20 64 61 74 61 20 69 73 20  erwise, data is 
4530: 72 65 74 72 69 65 76 65 64 0a 20 20 66 72 6f 6d  retrieved.  from
4540: 20 46 54 53 20 74 61 62 6c 65 73 20 75 73 69 6e   FTS tables usin
4550: 67 20 61 20 5b 53 45 4c 45 43 54 5d 20 73 74 61  g a [SELECT] sta
4560: 74 65 6d 65 6e 74 2e 0a 0a 3c 70 3e 0a 20 20 46  tement...<p>.  F
4570: 54 53 20 74 61 62 6c 65 73 20 63 61 6e 20 62 65  TS tables can be
4580: 20 71 75 65 72 69 65 64 20 65 66 66 69 63 69 65   queried efficie
4590: 6e 74 6c 79 20 75 73 69 6e 67 20 53 45 4c 45 43  ntly using SELEC
45a0: 54 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 66 20  T statements of 
45b0: 74 77 6f 0a 20 20 64 69 66 66 65 72 65 6e 74 20  two.  different 
45c0: 66 6f 72 6d 73 3a 0a 0a 3c 75 6c 3e 0a 20 20 3c  forms:..<ul>.  <
45d0: 6c 69 3e 3c 70 3e 0a 20 20 20 20 3c 62 3e 51 75  li><p>.    <b>Qu
45e0: 65 72 79 20 62 79 20 72 6f 77 69 64 3c 2f 62 3e  ery by rowid</b>
45f0: 2e 20 49 66 20 74 68 65 20 57 48 45 52 45 20 63  . If the WHERE c
4600: 6c 61 75 73 65 20 6f 66 20 74 68 65 20 53 45 4c  lause of the SEL
4610: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  ECT statement.  
4620: 20 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 75 62    contains a sub
4630: 2d 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66  -clause of the f
4640: 6f 72 6d 20 22 72 6f 77 69 64 20 3d 20 3f 22 2c  orm "rowid = ?",
4650: 20 77 68 65 72 65 20 3f 20 69 73 20 61 6e 20 53   where ? is an S
4660: 51 4c 20 65 78 70 72 65 73 73 69 6f 6e 2c 0a 20  QL expression,. 
4670: 20 20 20 46 54 53 20 69 73 20 61 62 6c 65 20 74     FTS is able t
4680: 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 20 72  o retrieve the r
4690: 65 71 75 65 73 74 65 64 20 72 6f 77 20 64 69 72  equested row dir
46a0: 65 63 74 6c 79 20 75 73 69 6e 67 20 74 68 65 20  ectly using the 
46b0: 65 71 75 69 76 61 6c 65 6e 74 20 0a 20 20 20 20  equivalent .    
46c0: 6f 66 20 61 6e 20 53 51 4c 69 74 65 20 5b 49 4e  of an SQLite [IN
46d0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
46e0: 59 5d 20 69 6e 64 65 78 2e 0a 0a 20 20 3c 6c 69  Y] index...  <li
46f0: 3e 3c 70 3e 0a 20 20 20 20 3c 62 3e 46 75 6c 6c  ><p>.    <b>Full
4700: 2d 74 65 78 74 20 71 75 65 72 79 3c 2f 62 3e 2e  -text query</b>.
4710: 20 49 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   If the WHERE cl
4720: 61 75 73 65 20 6f 66 20 74 68 65 20 53 45 4c 45  ause of the SELE
4730: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6e  CT statement con
4740: 74 61 69 6e 73 0a 20 20 20 20 61 20 73 75 62 2d  tains.    a sub-
4750: 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f  clause of the fo
4760: 72 6d 20 22 26 6c 74 3b 63 6f 6c 75 6d 6e 26 67  rm "&lt;column&g
4770: 74 3b 20 4d 41 54 43 48 20 3f 22 2c 20 46 54 53  t; MATCH ?", FTS
4780: 20 69 73 20 61 62 6c 65 20 74 6f 20 75 73 65 20   is able to use 
4790: 0a 20 20 20 20 74 68 65 20 62 75 69 6c 74 2d 69  .    the built-i
47a0: 6e 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65  n full-text inde
47b0: 78 20 74 6f 20 72 65 73 74 72 69 63 74 20 74 68  x to restrict th
47c0: 65 20 73 65 61 72 63 68 20 74 6f 20 74 68 6f 73  e search to thos
47d0: 65 20 64 6f 63 75 6d 65 6e 74 73 20 0a 20 20 20  e documents .   
47e0: 20 74 68 61 74 20 6d 61 74 63 68 20 74 68 65 20   that match the 
47f0: 66 75 6c 6c 2d 74 65 78 74 20 71 75 65 72 79 20  full-text query 
4800: 73 74 72 69 6e 67 20 73 70 65 63 69 66 69 65 64  string specified
4810: 20 61 73 20 74 68 65 20 72 69 67 68 74 2d 68 61   as the right-ha
4820: 6e 64 20 6f 70 65 72 61 6e 64 0a 20 20 20 20 6f  nd operand.    o
4830: 66 20 74 68 65 20 4d 41 54 43 48 20 63 6c 61 75  f the MATCH clau
4840: 73 65 2e 0a 3c 2f 75 6c 3e 0a 0a 3c 70 3e 0a 20  se..</ul>..<p>. 
4850: 20 49 66 20 6e 65 69 74 68 65 72 20 6f 66 20 74   If neither of t
4860: 68 65 73 65 20 74 77 6f 20 71 75 65 72 79 20 73  hese two query s
4870: 74 72 61 74 65 67 69 65 73 20 63 61 6e 20 62 65  trategies can be
4880: 20 75 73 65 64 2c 20 61 6c 6c 0a 20 20 71 75 65   used, all.  que
4890: 72 69 65 73 20 6f 6e 20 46 54 53 20 74 61 62 6c  ries on FTS tabl
48a0: 65 73 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74  es are implement
48b0: 65 64 20 75 73 69 6e 67 20 61 20 6c 69 6e 65 61  ed using a linea
48c0: 72 20 73 63 61 6e 20 6f 66 20 74 68 65 20 65 6e  r scan of the en
48d0: 74 69 72 65 0a 20 20 74 61 62 6c 65 2e 20 49 66  tire.  table. If
48e0: 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6e 74 61   the table conta
48f0: 69 6e 73 20 6c 61 72 67 65 20 61 6d 6f 75 6e 74  ins large amount
4900: 73 20 6f 66 20 64 61 74 61 2c 20 74 68 69 73 20  s of data, this 
4910: 6d 61 79 20 62 65 20 61 6e 20 0a 20 20 69 6d 70  may be an .  imp
4920: 72 61 63 74 69 63 61 6c 20 61 70 70 72 6f 61 63  ractical approac
4930: 68 20 28 74 68 65 20 66 69 72 73 74 20 65 78 61  h (the first exa
4940: 6d 70 6c 65 20 6f 6e 20 74 68 69 73 20 70 61 67  mple on this pag
4950: 65 20 73 68 6f 77 73 20 74 68 61 74 20 61 20 6c  e shows that a l
4960: 69 6e 65 61 72 0a 20 20 73 63 61 6e 20 6f 66 20  inear.  scan of 
4970: 31 2e 35 20 47 42 20 6f 66 20 64 61 74 61 20 74  1.5 GB of data t
4980: 61 6b 65 73 20 61 72 6f 75 6e 64 20 33 30 20 73  akes around 30 s
4990: 65 63 6f 6e 64 73 20 75 73 69 6e 67 20 61 20 6d  econds using a m
49a0: 6f 64 65 72 6e 20 50 43 29 2e 0a 0a 3c 63 6f 64  odern PC)...<cod
49b0: 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d 20  eblock>.  <i>-- 
49c0: 54 68 65 20 65 78 61 6d 70 6c 65 73 20 69 6e 20  The examples in 
49d0: 74 68 69 73 20 62 6c 6f 63 6b 20 61 73 73 75 6d  this block assum
49e0: 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  e the following 
49f0: 46 54 53 20 74 61 62 6c 65 3a 3c 2f 69 3e 0a 20  FTS table:</i>. 
4a00: 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
4a10: 54 41 42 4c 45 20 6d 61 69 6c 20 55 53 49 4e 47  TABLE mail USING
4a20: 20 66 74 73 33 28 73 75 62 6a 65 63 74 2c 20 62   fts3(subject, b
4a30: 6f 64 79 29 3b 0a 0a 20 20 53 45 4c 45 43 54 20  ody);..  SELECT 
4a40: 2a 20 46 52 4f 4d 20 6d 61 69 6c 20 57 48 45 52  * FROM mail WHER
4a50: 45 20 72 6f 77 69 64 20 3d 20 31 35 3b 20 20 20  E rowid = 15;   
4a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 3c 69 3e               <i>
4a70: 2d 2d 20 46 61 73 74 2e 20 52 6f 77 69 64 20 6c  -- Fast. Rowid l
4a80: 6f 6f 6b 75 70 2e 3c 2f 69 3e 0a 20 20 53 45 4c  ookup.</i>.  SEL
4a90: 45 43 54 20 2a 20 46 52 4f 4d 20 6d 61 69 6c 20  ECT * FROM mail 
4aa0: 57 48 45 52 45 20 62 6f 64 79 20 4d 41 54 43 48  WHERE body MATCH
4ab0: 20 27 73 71 6c 69 74 65 27 3b 20 20 20 20 20 20   'sqlite';      
4ac0: 20 3c 69 3e 2d 2d 20 46 61 73 74 2e 20 46 75 6c   <i>-- Fast. Ful
4ad0: 6c 2d 74 65 78 74 20 71 75 65 72 79 2e 3c 2f 69  l-text query.</i
4ae0: 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  >.  SELECT * FRO
4af0: 4d 20 6d 61 69 6c 20 57 48 45 52 45 20 6d 61 69  M mail WHERE mai
4b00: 6c 20 4d 41 54 43 48 20 27 73 65 61 72 63 68 27  l MATCH 'search'
4b10: 3b 20 20 20 20 20 20 20 3c 69 3e 2d 2d 20 46 61  ;       <i>-- Fa
4b20: 73 74 2e 20 46 75 6c 6c 2d 74 65 78 74 20 71 75  st. Full-text qu
4b30: 65 72 79 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43  ery.</i>.  SELEC
4b40: 54 20 2a 20 46 52 4f 4d 20 6d 61 69 6c 20 57 48  T * FROM mail WH
4b50: 45 52 45 20 72 6f 77 69 64 20 42 45 54 57 45 45  ERE rowid BETWEE
4b60: 4e 20 31 35 20 41 4e 44 20 32 30 3b 20 20 20 3c  N 15 AND 20;   <
4b70: 69 3e 2d 2d 20 53 6c 6f 77 2e 20 4c 69 6e 65 61  i>-- Slow. Linea
4b80: 72 20 73 63 61 6e 2e 3c 2f 69 3e 0a 20 20 53 45  r scan.</i>.  SE
4b90: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6d 61 69 6c  LECT * FROM mail
4ba0: 20 57 48 45 52 45 20 73 75 62 6a 65 63 74 20 3d   WHERE subject =
4bb0: 20 27 64 61 74 61 62 61 73 65 27 3b 20 20 20 20   'database';    
4bc0: 20 20 3c 69 3e 2d 2d 20 53 6c 6f 77 2e 20 4c 69    <i>-- Slow. Li
4bd0: 6e 65 61 72 20 73 63 61 6e 2e 3c 2f 69 3e 0a 20  near scan.</i>. 
4be0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6d   SELECT * FROM m
4bf0: 61 69 6c 20 57 48 45 52 45 20 73 75 62 6a 65 63  ail WHERE subjec
4c00: 74 20 4d 41 54 43 48 20 27 64 61 74 61 62 61 73  t MATCH 'databas
4c10: 65 27 3b 20 20 3c 69 3e 2d 2d 20 46 61 73 74 2e  e';  <i>-- Fast.
4c20: 20 46 75 6c 6c 2d 74 65 78 74 20 71 75 65 72 79   Full-text query
4c30: 2e 3c 2f 69 3e 0a 3c 2f 63 6f 64 65 62 6c 6f 63  .</i>.</codebloc
4c40: 6b 3e 0a 0a 3c 70 3e 0a 20 20 49 6e 20 61 6c 6c  k>..<p>.  In all
4c50: 20 6f 66 20 74 68 65 20 66 75 6c 6c 2d 74 65 78   of the full-tex
4c60: 74 20 71 75 65 72 69 65 73 20 61 62 6f 76 65 2c  t queries above,
4c70: 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   the right-hand 
4c80: 6f 70 65 72 61 6e 64 20 6f 66 20 74 68 65 20 4d  operand of the M
4c90: 41 54 43 48 0a 20 20 6f 70 65 72 61 74 6f 72 20  ATCH.  operator 
4ca0: 69 73 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 73  is a string cons
4cb0: 69 73 74 69 6e 67 20 6f 66 20 61 20 73 69 6e 67  isting of a sing
4cc0: 6c 65 20 74 65 72 6d 2e 20 49 6e 20 74 68 69 73  le term. In this
4cd0: 20 63 61 73 65 2c 20 74 68 65 20 4d 41 54 43 48   case, the MATCH
4ce0: 0a 20 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76  .  expression ev
4cf0: 61 6c 75 61 74 65 73 20 74 6f 20 74 72 75 65 20  aluates to true 
4d00: 66 6f 72 20 61 6c 6c 20 64 6f 63 75 6d 65 6e 74  for all document
4d10: 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 6f  s that contain o
4d20: 6e 65 20 6f 72 20 6d 6f 72 65 20 0a 20 20 69 6e  ne or more .  in
4d30: 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 73  stances of the s
4d40: 70 65 63 69 66 69 65 64 20 77 6f 72 64 20 28 22  pecified word ("
4d50: 73 71 6c 69 74 65 22 2c 20 22 73 65 61 72 63 68  sqlite", "search
4d60: 22 20 6f 72 20 22 64 61 74 61 62 61 73 65 22 2c  " or "database",
4d70: 20 64 65 70 65 6e 64 69 6e 67 20 0a 20 20 6f 6e   depending .  on
4d80: 20 77 68 69 63 68 20 65 78 61 6d 70 6c 65 20 79   which example y
4d90: 6f 75 20 6c 6f 6f 6b 20 61 74 29 2e 20 53 70 65  ou look at). Spe
4da0: 63 69 66 79 69 6e 67 20 61 20 73 69 6e 67 6c 65  cifying a single
4db0: 20 74 65 72 6d 20 61 73 20 74 68 65 20 72 69 67   term as the rig
4dc0: 68 74 2d 68 61 6e 64 0a 20 20 6f 70 65 72 61 6e  ht-hand.  operan
4dd0: 64 20 6f 66 20 74 68 65 20 4d 41 54 43 48 20 6f  d of the MATCH o
4de0: 70 65 72 61 74 6f 72 20 72 65 73 75 6c 74 73 20  perator results 
4df0: 69 6e 20 74 68 65 20 73 69 6d 70 6c 65 73 74 20  in the simplest 
4e00: 61 6e 64 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e 20  and most common 
4e10: 74 79 70 65 20 0a 20 20 6f 66 20 66 75 6c 6c 2d  type .  of full-
4e20: 74 65 78 74 20 71 75 65 72 79 20 70 6f 73 73 69  text query possi
4e30: 62 6c 65 2e 20 48 6f 77 65 76 65 72 20 6d 6f 72  ble. However mor
4e40: 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 20 71 75  e complicated qu
4e50: 65 72 69 65 73 20 61 72 65 20 70 6f 73 73 69 62  eries are possib
4e60: 6c 65 2c 0a 20 20 69 6e 63 6c 75 64 69 6e 67 20  le,.  including 
4e70: 70 68 72 61 73 65 20 73 65 61 72 63 68 65 73 2c  phrase searches,
4e80: 20 74 65 72 6d 2d 70 72 65 66 69 78 20 73 65 61   term-prefix sea
4e90: 72 63 68 65 73 20 61 6e 64 20 73 65 61 72 63 68  rches and search
4ea0: 65 73 20 66 6f 72 20 64 6f 63 75 6d 65 6e 74 73  es for documents
4eb0: 20 0a 20 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63   .  containing c
4ec0: 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74  ombinations of t
4ed0: 65 72 6d 73 20 6f 63 63 75 72 69 6e 67 20 77 69  erms occuring wi
4ee0: 74 68 69 6e 20 61 20 64 65 66 69 6e 65 64 20 70  thin a defined p
4ef0: 72 6f 78 69 6d 69 74 79 20 6f 66 20 65 61 63 68  roximity of each
4f00: 0a 20 20 6f 74 68 65 72 2e 20 54 68 65 20 76 61  .  other. The va
4f10: 72 69 6f 75 73 20 77 61 79 73 20 69 6e 20 77 68  rious ways in wh
4f20: 69 63 68 20 74 68 65 20 66 75 6c 6c 2d 74 65 78  ich the full-tex
4f30: 74 20 69 6e 64 65 78 20 6d 61 79 20 62 65 20 71  t index may be q
4f40: 75 65 72 69 65 64 20 61 72 65 0a 20 20 5b 46 54  ueried are.  [FT
4f50: 53 20 4d 41 54 43 48 7c 64 65 73 63 72 69 62 65  S MATCH|describe
4f60: 64 20 62 65 6c 6f 77 5d 2e 0a 0a 3c 70 3e 0a 20  d below]...<p>. 
4f70: 20 4e 6f 72 6d 61 6c 6c 79 2c 20 66 75 6c 6c 2d   Normally, full-
4f80: 74 65 78 74 20 71 75 65 72 69 65 73 20 61 72 65  text queries are
4f90: 20 63 61 73 65 2d 69 6e 73 65 6e 73 69 74 69 76   case-insensitiv
4fa0: 65 2e 20 48 6f 77 65 76 65 72 2c 20 74 68 69 73  e. However, this
4fb0: 20 69 73 0a 20 20 69 73 20 64 65 70 65 6e 64 65   is.  is depende
4fc0: 6e 74 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  nt on the specif
4fd0: 69 63 20 5b 74 6f 6b 65 6e 69 7a 65 72 5d 20 75  ic [tokenizer] u
4fe0: 73 65 64 20 62 79 20 74 68 65 20 46 54 53 20 74  sed by the FTS t
4ff0: 61 62 6c 65 0a 20 20 62 65 69 6e 67 20 71 75 65  able.  being que
5000: 72 69 65 64 2e 20 52 65 66 65 72 20 74 6f 20 74  ried. Refer to t
5010: 68 65 20 73 65 63 74 69 6f 6e 20 6f 6e 20 5b 74  he section on [t
5020: 6f 6b 65 6e 69 7a 65 72 7c 74 6f 6b 65 6e 69 7a  okenizer|tokeniz
5030: 65 72 73 5d 20 66 6f 72 20 64 65 74 61 69 6c 73  ers] for details
5040: 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 70 61 72  ...<p>.  The par
5050: 61 67 72 61 70 68 20 61 62 6f 76 65 20 6e 6f 74  agraph above not
5060: 65 73 20 74 68 61 74 20 61 20 4d 41 54 43 48 20  es that a MATCH 
5070: 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 61 20  operator with a 
5080: 73 69 6d 70 6c 65 20 74 65 72 6d 20 61 73 20 74  simple term as t
5090: 68 65 0a 20 20 72 69 67 68 74 2d 68 61 6e 64 20  he.  right-hand 
50a0: 6f 70 65 72 61 6e 64 20 65 76 61 6c 75 61 74 65  operand evaluate
50b0: 73 20 74 6f 20 74 72 75 65 20 66 6f 72 20 61 6c  s to true for al
50c0: 6c 20 64 6f 63 75 6d 65 6e 74 73 20 74 68 61 74  l documents that
50d0: 20 63 6f 6e 74 61 69 6e 20 74 68 65 0a 20 20 73   contain the.  s
50e0: 70 65 63 69 66 69 65 64 20 74 65 72 6d 2e 20 49  pecified term. I
50f0: 6e 20 74 68 69 73 20 63 6f 6e 74 65 78 74 2c 20  n this context, 
5100: 74 68 65 20 22 64 6f 63 75 6d 65 6e 74 22 20 6d  the "document" m
5110: 61 79 20 72 65 66 65 72 20 74 6f 20 65 69 74 68  ay refer to eith
5120: 65 72 20 74 68 65 20 0a 20 20 64 61 74 61 20 73  er the .  data s
5130: 74 6f 72 65 64 20 69 6e 20 61 20 73 69 6e 67 6c  tored in a singl
5140: 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 72 6f  e column of a ro
5150: 77 20 6f 66 20 61 6e 20 46 54 53 20 74 61 62 6c  w of an FTS tabl
5160: 65 2c 20 6f 72 20 74 6f 20 74 68 65 20 63 6f 6e  e, or to the con
5170: 74 65 6e 74 73 0a 20 20 6f 66 20 61 6c 6c 20 63  tents.  of all c
5180: 6f 6c 75 6d 6e 73 20 69 6e 20 61 20 73 69 6e 67  olumns in a sing
5190: 6c 65 20 72 6f 77 2c 20 64 65 70 65 6e 64 69 6e  le row, dependin
51a0: 67 20 6f 6e 20 74 68 65 20 69 64 65 6e 74 69 66  g on the identif
51b0: 69 65 72 20 75 73 65 64 20 61 73 20 74 68 65 0a  ier used as the.
51c0: 20 20 6c 65 66 74 2d 68 61 6e 64 20 6f 70 65 72    left-hand oper
51d0: 61 6e 64 20 74 6f 20 74 68 65 20 4d 41 54 43 48  and to the MATCH
51e0: 20 6f 70 65 72 61 74 6f 72 2e 20 49 66 20 74 68   operator. If th
51f0: 65 20 69 64 65 6e 74 69 66 69 65 72 20 73 70 65  e identifier spe
5200: 63 69 66 69 65 64 20 61 73 0a 20 20 74 68 65 20  cified as.  the 
5210: 6c 65 66 74 2d 68 61 6e 64 20 6f 70 65 72 61 6e  left-hand operan
5220: 64 20 6f 66 20 74 68 65 20 4d 41 54 43 48 20 6f  d of the MATCH o
5230: 70 65 72 61 74 6f 72 20 69 73 20 61 6e 20 46 54  perator is an FT
5240: 53 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 6e  S table column n
5250: 61 6d 65 2c 0a 20 20 74 68 65 6e 20 74 68 65 20  ame,.  then the 
5260: 64 6f 63 75 6d 65 6e 74 20 74 68 61 74 20 74 68  document that th
5270: 65 20 73 65 61 72 63 68 20 74 65 72 6d 20 6d 75  e search term mu
5280: 73 74 20 62 65 20 63 6f 6e 74 61 69 6e 65 64 20  st be contained 
5290: 69 6e 20 69 73 20 74 68 65 20 76 61 6c 75 65 0a  in is the value.
52a0: 20 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20    stored in the 
52b0: 73 70 65 63 69 66 69 65 64 20 63 6f 6c 75 6d 6e  specified column
52c0: 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68  . However, if th
52d0: 65 20 69 64 65 6e 74 69 66 69 65 72 20 69 73 20  e identifier is 
52e0: 74 68 65 20 6e 61 6d 65 0a 20 20 6f 66 20 74 68  the name.  of th
52f0: 65 20 46 54 53 20 3c 69 3e 74 61 62 6c 65 3c 2f  e FTS <i>table</
5300: 69 3e 20 69 74 73 65 6c 66 2c 20 74 68 65 6e 20  i> itself, then 
5310: 74 68 65 20 4d 41 54 43 48 20 6f 70 65 72 61 74  the MATCH operat
5320: 6f 72 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  or evaluates to 
5330: 74 72 75 65 0a 20 20 66 6f 72 20 65 61 63 68 20  true.  for each 
5340: 72 6f 77 20 6f 66 20 74 68 65 20 46 54 53 20 74  row of the FTS t
5350: 61 62 6c 65 20 66 6f 72 20 77 68 69 63 68 20 61  able for which a
5360: 6e 79 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69  ny column contai
5370: 6e 73 20 74 68 65 20 73 65 61 72 63 68 20 0a 20  ns the search . 
5380: 20 74 65 72 6d 2e 20 54 68 65 20 66 6f 6c 6c 6f   term. The follo
5390: 77 69 6e 67 20 65 78 61 6d 70 6c 65 20 64 65 6d  wing example dem
53a0: 6f 6e 73 74 72 61 74 65 73 20 74 68 69 73 3a 0a  onstrates this:.
53b0: 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c  .<codeblock>.  <
53c0: 69 3e 2d 2d 20 45 78 61 6d 70 6c 65 20 73 63 68  i>-- Example sch
53d0: 65 6d 61 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45  ema</i>.  CREATE
53e0: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 6d   VIRTUAL TABLE m
53f0: 61 69 6c 20 55 53 49 4e 47 20 66 74 73 33 28 73  ail USING fts3(s
5400: 75 62 6a 65 63 74 2c 20 62 6f 64 79 29 3b 0a 0a  ubject, body);..
5410: 20 20 3c 69 3e 2d 2d 20 45 78 61 6d 70 6c 65 20    <i>-- Example 
5420: 74 61 62 6c 65 20 70 6f 70 75 6c 61 74 69 6f 6e  table population
5430: 3c 2f 69 3e 0a 20 20 49 4e 53 45 52 54 20 49 4e  </i>.  INSERT IN
5440: 54 4f 20 6d 61 69 6c 28 64 6f 63 69 64 2c 20 73  TO mail(docid, s
5450: 75 62 6a 65 63 74 2c 20 62 6f 64 79 29 20 56 41  ubject, body) VA
5460: 4c 55 45 53 28 31 2c 20 27 73 6f 66 74 77 61 72  LUES(1, 'softwar
5470: 65 20 66 65 65 64 62 61 63 6b 27 2c 20 27 66 6f  e feedback', 'fo
5480: 75 6e 64 20 69 74 20 74 6f 6f 20 73 6c 6f 77 27  und it too slow'
5490: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
54a0: 20 6d 61 69 6c 28 64 6f 63 69 64 2c 20 73 75 62   mail(docid, sub
54b0: 6a 65 63 74 2c 20 62 6f 64 79 29 20 56 41 4c 55  ject, body) VALU
54c0: 45 53 28 32 2c 20 27 73 6f 66 74 77 61 72 65 20  ES(2, 'software 
54d0: 66 65 65 64 62 61 63 6b 27 2c 20 27 6e 6f 20 66  feedback', 'no f
54e0: 65 65 64 62 61 63 6b 27 29 3b 0a 20 20 49 4e 53  eedback');.  INS
54f0: 45 52 54 20 49 4e 54 4f 20 6d 61 69 6c 28 64 6f  ERT INTO mail(do
5500: 63 69 64 2c 20 73 75 62 6a 65 63 74 2c 20 62 6f  cid, subject, bo
5510: 64 79 29 20 56 41 4c 55 45 53 28 33 2c 20 27 73  dy) VALUES(3, 's
5520: 6c 6f 77 20 6c 75 6e 63 68 20 6f 72 64 65 72 27  low lunch order'
5530: 2c 20 20 27 77 61 73 20 61 20 73 6f 66 74 77 61  ,  'was a softwa
5540: 72 65 20 70 72 6f 62 6c 65 6d 27 29 3b 0a 0a 20  re problem');.. 
5550: 20 3c 69 3e 2d 2d 20 45 78 61 6d 70 6c 65 20 71   <i>-- Example q
5560: 75 65 72 69 65 73 3c 2f 69 3e 0a 20 20 53 45 4c  ueries</i>.  SEL
5570: 45 43 54 20 2a 20 46 52 4f 4d 20 6d 61 69 6c 20  ECT * FROM mail 
5580: 57 48 45 52 45 20 73 75 62 6a 65 63 74 20 4d 41  WHERE subject MA
5590: 54 43 48 20 27 73 6f 66 74 77 61 72 65 27 3b 20  TCH 'software'; 
55a0: 20 20 20 3c 69 3e 2d 2d 20 53 65 6c 65 63 74 73     <i>-- Selects
55b0: 20 72 6f 77 73 20 31 20 61 6e 64 20 32 3c 2f 69   rows 1 and 2</i
55c0: 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  >.  SELECT * FRO
55d0: 4d 20 6d 61 69 6c 20 57 48 45 52 45 20 62 6f 64  M mail WHERE bod
55e0: 79 20 20 20 20 4d 41 54 43 48 20 27 66 65 65 64  y    MATCH 'feed
55f0: 62 61 63 6b 27 3b 20 20 20 20 3c 69 3e 2d 2d 20  back';    <i>-- 
5600: 53 65 6c 65 63 74 73 20 72 6f 77 20 32 3c 2f 69  Selects row 2</i
5610: 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  >.  SELECT * FRO
5620: 4d 20 6d 61 69 6c 20 57 48 45 52 45 20 6d 61 69  M mail WHERE mai
5630: 6c 20 20 20 20 4d 41 54 43 48 20 27 73 6f 66 74  l    MATCH 'soft
5640: 77 61 72 65 27 3b 20 20 20 20 3c 69 3e 2d 2d 20  ware';    <i>-- 
5650: 53 65 6c 65 63 74 73 20 72 6f 77 73 20 31 2c 20  Selects rows 1, 
5660: 32 20 61 6e 64 20 33 3c 2f 69 3e 0a 20 20 53 45  2 and 3</i>.  SE
5670: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6d 61 69 6c  LECT * FROM mail
5680: 20 57 48 45 52 45 20 6d 61 69 6c 20 20 20 20 4d   WHERE mail    M
5690: 41 54 43 48 20 27 73 6c 6f 77 27 3b 20 20 20 20  ATCH 'slow';    
56a0: 20 20 20 20 3c 69 3e 2d 2d 20 53 65 6c 65 63 74      <i>-- Select
56b0: 73 20 72 6f 77 73 20 31 20 61 6e 64 20 33 3c 2f  s rows 1 and 3</
56c0: 69 3e 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a  i>.</codeblock>.
56d0: 20 20 0a 3c 70 3e 0a 20 20 41 74 20 66 69 72 73    .<p>.  At firs
56e0: 74 20 67 6c 61 6e 63 65 2c 20 74 68 65 20 66 69  t glance, the fi
56f0: 6e 61 6c 20 74 77 6f 20 66 75 6c 6c 2d 74 65 78  nal two full-tex
5700: 74 20 71 75 65 72 69 65 73 20 69 6e 20 74 68 65  t queries in the
5710: 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 20 73   example above s
5720: 65 65 6d 0a 20 20 74 6f 20 62 65 20 73 79 6e 74  eem.  to be synt
5730: 61 63 74 69 63 61 6c 6c 79 20 69 6e 63 6f 72 72  actically incorr
5740: 65 63 74 2c 20 61 73 20 74 68 65 72 65 20 69 73  ect, as there is
5750: 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 28 22   a table name ("
5760: 6d 61 69 6c 22 29 20 75 73 65 64 20 61 73 0a 20  mail") used as. 
5770: 20 61 6e 20 53 51 4c 20 65 78 70 72 65 73 73 69   an SQL expressi
5780: 6f 6e 2e 20 54 68 65 20 72 65 61 73 6f 6e 20 74  on. The reason t
5790: 68 69 73 20 69 73 20 61 63 63 65 70 74 61 62 6c  his is acceptabl
57a0: 65 20 69 73 20 74 68 61 74 20 65 61 63 68 20 46  e is that each F
57b0: 54 53 20 74 61 62 6c 65 0a 20 20 61 63 74 75 61  TS table.  actua
57c0: 6c 6c 79 20 68 61 73 20 61 20 5b 73 71 6c 69 74  lly has a [sqlit
57d0: 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 7c  e3_declare_vtab|
57e0: 48 49 44 44 45 4e 5d 20 63 6f 6c 75 6d 6e 20 77  HIDDEN] column w
57f0: 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  ith the same nam
5800: 65 0a 20 20 61 73 20 74 68 65 20 74 61 62 6c 65  e.  as the table
5810: 20 69 74 73 65 6c 66 20 28 69 6e 20 74 68 69 73   itself (in this
5820: 20 63 61 73 65 2c 20 22 6d 61 69 6c 22 29 2e 20   case, "mail"). 
5830: 54 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64  The value stored
5840: 20 69 6e 20 74 68 69 73 0a 20 20 63 6f 6c 75 6d   in this.  colum
5850: 6e 20 69 73 20 6e 6f 74 20 6d 65 61 6e 69 6e 67  n is not meaning
5860: 66 75 6c 20 74 6f 20 74 68 65 20 61 70 70 6c 69  ful to the appli
5870: 63 61 74 69 6f 6e 2c 20 62 75 74 20 63 61 6e 20  cation, but can 
5880: 62 65 20 75 73 65 64 20 61 73 20 74 68 65 20 0a  be used as the .
5890: 20 20 6c 65 66 74 2d 68 61 6e 64 20 6f 70 65 72    left-hand oper
58a0: 61 6e 64 20 74 6f 20 61 20 4d 41 54 43 48 20 6f  and to a MATCH o
58b0: 70 65 72 61 74 6f 72 2e 20 54 68 69 73 20 73 70  perator. This sp
58c0: 65 63 69 61 6c 20 63 6f 6c 75 6d 6e 20 6d 61 79  ecial column may
58d0: 20 61 6c 73 6f 20 62 65 0a 20 20 70 61 73 73 65   also be.  passe
58e0: 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  d as an argument
58f0: 20 74 6f 20 74 68 65 20 5b 73 6e 69 70 70 65 74   to the [snippet
5900: 28 29 7c 46 54 53 20 61 75 78 69 6c 69 61 72 79  ()|FTS auxiliary
5910: 20 66 75 6e 63 74 69 6f 6e 73 5d 2e 0a 0a 3c 70   functions]...<p
5920: 3e 0a 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  >.  The followin
5930: 67 20 65 78 61 6d 70 6c 65 20 69 6c 6c 75 73 74  g example illust
5940: 72 61 74 65 73 20 74 68 65 20 61 62 6f 76 65 2e  rates the above.
5950: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   The expressions
5960: 20 22 64 6f 63 73 22 2c 20 0a 20 20 22 64 6f 63   "docs", .  "doc
5970: 73 2e 64 6f 63 73 22 20 61 6e 64 20 22 6d 61 69  s.docs" and "mai
5980: 6e 2e 64 6f 63 73 2e 64 6f 63 73 22 20 61 6c 6c  n.docs.docs" all
5990: 20 72 65 66 65 72 20 74 6f 20 63 6f 6c 75 6d 6e   refer to column
59a0: 20 22 64 6f 63 73 22 2e 20 48 6f 77 65 76 65 72   "docs". However
59b0: 2c 20 74 68 65 20 0a 20 20 65 78 70 72 65 73 73  , the .  express
59c0: 69 6f 6e 20 22 6d 61 69 6e 2e 64 6f 63 73 22 20  ion "main.docs" 
59d0: 64 6f 65 73 20 6e 6f 74 20 72 65 66 65 72 20 74  does not refer t
59e0: 6f 20 61 6e 79 20 63 6f 6c 75 6d 6e 2e 20 49 74  o any column. It
59f0: 20 63 6f 75 6c 64 20 62 65 20 75 73 65 64 20 74   could be used t
5a00: 6f 20 0a 20 20 72 65 66 65 72 20 74 6f 20 61 20  o .  refer to a 
5a10: 74 61 62 6c 65 2c 20 62 75 74 20 61 20 74 61 62  table, but a tab
5a20: 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61  le name is not a
5a30: 6c 6c 6f 77 65 64 20 69 6e 20 74 68 65 20 63 6f  llowed in the co
5a40: 6e 74 65 78 74 20 69 6e 20 77 68 69 63 68 0a 20  ntext in which. 
5a50: 20 69 74 20 69 73 20 75 73 65 64 20 62 65 6c 6f   it is used belo
5a60: 77 2e 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a  w...<codeblock>.
5a70: 20 20 3c 69 3e 2d 2d 20 45 78 61 6d 70 6c 65 20    <i>-- Example 
5a80: 73 63 68 65 6d 61 3c 2f 69 3e 0a 20 20 43 52 45  schema</i>.  CRE
5a90: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
5aa0: 45 20 64 6f 63 73 20 55 53 49 4e 47 20 66 74 73  E docs USING fts
5ab0: 34 28 63 6f 6e 74 65 6e 74 29 3b 0a 0a 20 20 3c  4(content);..  <
5ac0: 69 3e 2d 2d 20 45 78 61 6d 70 6c 65 20 71 75 65  i>-- Example que
5ad0: 72 69 65 73 3c 2f 69 3e 0a 20 20 53 45 4c 45 43  ries</i>.  SELEC
5ae0: 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48  T * FROM docs WH
5af0: 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27  ERE docs MATCH '
5b00: 73 71 6c 69 74 65 27 3b 20 20 20 20 20 20 20 20  sqlite';        
5b10: 20 20 20 20 20 20 3c 69 3e 2d 2d 20 4f 4b 2e 3c        <i>-- OK.<
5b20: 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  /i>.  SELECT * F
5b30: 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20 64  ROM docs WHERE d
5b40: 6f 63 73 2e 64 6f 63 73 20 4d 41 54 43 48 20 27  ocs.docs MATCH '
5b50: 73 71 6c 69 74 65 27 3b 20 20 20 20 20 20 20 20  sqlite';        
5b60: 20 3c 69 3e 2d 2d 20 4f 4b 2e 3c 2f 69 3e 0a 20   <i>-- OK.</i>. 
5b70: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64   SELECT * FROM d
5b80: 6f 63 73 20 57 48 45 52 45 20 6d 61 69 6e 2e 64  ocs WHERE main.d
5b90: 6f 63 73 2e 64 6f 63 73 20 4d 41 54 43 48 20 27  ocs.docs MATCH '
5ba0: 73 71 6c 69 74 65 27 3b 20 20 20 20 3c 69 3e 2d  sqlite';    <i>-
5bb0: 2d 20 4f 4b 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45  - OK.</i>.  SELE
5bc0: 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57  CT * FROM docs W
5bd0: 48 45 52 45 20 6d 61 69 6e 2e 64 6f 63 73 20 4d  HERE main.docs M
5be0: 41 54 43 48 20 27 73 71 6c 69 74 65 27 3b 20 20  ATCH 'sqlite';  
5bf0: 20 20 20 20 20 20 20 3c 69 3e 2d 2d 20 45 72 72         <i>-- Err
5c00: 6f 72 2e 3c 2f 69 3e 0a 3c 2f 63 6f 64 65 62 6c  or.</i>.</codebl
5c10: 6f 63 6b 3e 0a 20 0a 3c 68 32 3e 53 75 6d 6d 61  ock>. .<h2>Summa
5c20: 72 79 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a 20 20 46  ry</h2>..<p>.  F
5c30: 72 6f 6d 20 74 68 65 20 75 73 65 72 73 20 70 6f  rom the users po
5c40: 69 6e 74 20 6f 66 20 76 69 65 77 2c 20 46 54 53  int of view, FTS
5c50: 20 74 61 62 6c 65 73 20 61 72 65 20 73 69 6d 69   tables are simi
5c60: 6c 61 72 20 74 6f 20 6f 72 64 69 6e 61 72 79 20  lar to ordinary 
5c70: 53 51 4c 69 74 65 0a 20 20 74 61 62 6c 65 73 20  SQLite.  tables 
5c80: 69 6e 20 6d 61 6e 79 20 77 61 79 73 2e 20 44 61  in many ways. Da
5c90: 74 61 20 6d 61 79 20 62 65 20 61 64 64 65 64 20  ta may be added 
5ca0: 74 6f 2c 20 6d 6f 64 69 66 69 65 64 20 77 69 74  to, modified wit
5cb0: 68 69 6e 20 61 6e 64 20 72 65 6d 6f 76 65 64 20  hin and removed 
5cc0: 0a 20 20 66 72 6f 6d 20 46 54 53 20 74 61 62 6c  .  from FTS tabl
5cd0: 65 73 20 75 73 69 6e 67 20 74 68 65 20 49 4e 53  es using the INS
5ce0: 45 52 54 2c 20 55 50 44 41 54 45 20 61 6e 64 20  ERT, UPDATE and 
5cf0: 44 45 4c 45 54 45 20 63 6f 6d 6d 61 6e 64 73 20  DELETE commands 
5d00: 6a 75 73 74 20 61 73 20 0a 20 20 69 74 20 6d 61  just as .  it ma
5d10: 79 20 62 65 20 77 69 74 68 20 6f 72 64 69 6e 61  y be with ordina
5d20: 72 79 20 74 61 62 6c 65 73 2e 20 53 69 6d 69 6c  ry tables. Simil
5d30: 61 72 6c 79 2c 20 74 68 65 20 53 45 4c 45 43 54  arly, the SELECT
5d40: 20 63 6f 6d 6d 61 6e 64 20 6d 61 79 20 62 65 20   command may be 
5d50: 75 73 65 64 20 0a 20 20 74 6f 20 71 75 65 72 79  used .  to query
5d60: 20 64 61 74 61 2e 20 54 68 65 20 66 6f 6c 6c 6f   data. The follo
5d70: 77 69 6e 67 20 6c 69 73 74 20 73 75 6d 6d 61 72  wing list summar
5d80: 69 7a 65 73 20 74 68 65 20 64 69 66 66 65 72 65  izes the differe
5d90: 6e 63 65 73 20 62 65 74 77 65 65 6e 20 46 54 53  nces between FTS
5da0: 0a 20 20 61 6e 64 20 6f 72 64 69 6e 61 72 79 20  .  and ordinary 
5db0: 74 61 62 6c 65 73 3a 0a 0a 3c 6f 6c 3e 0a 20 20  tables:..<ol>.  
5dc0: 3c 6c 69 3e 3c 70 3e 20 0a 20 20 20 20 41 73 20  <li><p> .    As 
5dd0: 77 69 74 68 20 61 6c 6c 20 76 69 72 74 75 61 6c  with all virtual
5de0: 20 74 61 62 6c 65 20 74 79 70 65 73 2c 20 69 74   table types, it
5df0: 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
5e00: 20 74 6f 20 63 72 65 61 74 65 20 69 6e 64 69 63   to create indic
5e10: 65 73 20 6f 72 0a 20 20 20 20 74 72 69 67 67 65  es or.    trigge
5e20: 72 73 20 61 74 74 61 63 68 65 64 20 74 6f 20 46  rs attached to F
5e30: 54 53 20 74 61 62 6c 65 73 2e 20 4e 6f 72 20 69  TS tables. Nor i
5e40: 73 20 69 74 20 70 6f 73 73 69 62 6c 65 20 74 6f  s it possible to
5e50: 20 75 73 65 20 74 68 65 20 41 4c 54 45 52 20 54   use the ALTER T
5e60: 41 42 4c 45 0a 20 20 20 20 63 6f 6d 6d 61 6e 64  ABLE.    command
5e70: 20 74 6f 20 61 64 64 20 65 78 74 72 61 20 63 6f   to add extra co
5e80: 6c 75 6d 6e 73 20 74 6f 20 46 54 53 20 74 61 62  lumns to FTS tab
5e90: 6c 65 73 20 28 61 6c 74 68 6f 75 67 68 20 69 74  les (although it
5ea0: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
5eb0: 75 73 65 0a 20 20 20 20 41 4c 54 45 52 20 54 41  use.    ALTER TA
5ec0: 42 4c 45 20 74 6f 20 72 65 6e 61 6d 65 20 61 6e  BLE to rename an
5ed0: 20 46 54 53 20 74 61 62 6c 65 29 2e 0a 0a 20 20   FTS table)...  
5ee0: 3c 6c 69 3e 3c 70 3e 20 0a 20 20 20 20 44 61 74  <li><p> .    Dat
5ef0: 61 2d 74 79 70 65 73 20 73 70 65 63 69 66 69 65  a-types specifie
5f00: 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
5f10: 20 22 43 52 45 41 54 45 20 56 49 52 54 55 41 4c   "CREATE VIRTUAL
5f20: 20 54 41 42 4c 45 22 20 73 74 61 74 65 6d 65 6e   TABLE" statemen
5f30: 74 0a 20 20 20 20 75 73 65 64 20 74 6f 20 63 72  t.    used to cr
5f40: 65 61 74 65 20 61 6e 20 46 54 53 20 74 61 62 6c  eate an FTS tabl
5f50: 65 20 61 72 65 20 69 67 6e 6f 72 65 64 20 63 6f  e are ignored co
5f60: 6d 70 6c 65 74 65 6c 79 2e 20 49 6e 73 74 65 61  mpletely. Instea
5f70: 64 20 6f 66 20 74 68 65 0a 20 20 20 20 6e 6f 72  d of the.    nor
5f80: 6d 61 6c 20 72 75 6c 65 73 20 66 6f 72 20 61 70  mal rules for ap
5f90: 70 6c 79 69 6e 67 20 74 79 70 65 20 5b 61 66 66  plying type [aff
5fa0: 69 6e 69 74 79 5d 20 74 6f 20 69 6e 73 65 72 74  inity] to insert
5fb0: 65 64 20 76 61 6c 75 65 73 2c 20 61 6c 6c 0a 20  ed values, all. 
5fc0: 20 20 20 76 61 6c 75 65 73 20 69 6e 73 65 72 74     values insert
5fd0: 65 64 20 69 6e 74 6f 20 46 54 53 20 74 61 62 6c  ed into FTS tabl
5fe0: 65 20 63 6f 6c 75 6d 6e 73 20 28 65 78 63 65 70  e columns (excep
5ff0: 74 20 74 68 65 20 73 70 65 63 69 61 6c 20 72 6f  t the special ro
6000: 77 69 64 0a 20 20 20 20 63 6f 6c 75 6d 6e 29 20  wid.    column) 
6010: 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 74 6f  are converted to
6020: 20 74 79 70 65 20 54 45 58 54 20 62 65 66 6f 72   type TEXT befor
6030: 65 20 62 65 69 6e 67 20 73 74 6f 72 65 64 2e 0a  e being stored..
6040: 0a 20 20 3c 6c 69 3e 3c 70 3e 20 0a 20 20 20 20  .  <li><p> .    
6050: 46 54 53 20 74 61 62 6c 65 73 20 70 65 72 6d 69  FTS tables permi
6060: 74 20 74 68 65 20 73 70 65 63 69 61 6c 20 61 6c  t the special al
6070: 69 61 73 20 22 64 6f 63 69 64 22 20 74 6f 20 62  ias "docid" to b
6080: 65 20 75 73 65 64 20 74 6f 20 72 65 66 65 72 20  e used to refer 
6090: 74 6f 20 74 68 65 0a 20 20 20 20 72 6f 77 69 64  to the.    rowid
60a0: 20 63 6f 6c 75 6d 6e 20 73 75 70 70 6f 72 74 65   column supporte
60b0: 64 20 62 79 20 61 6c 6c 20 5b 76 69 72 74 75 61  d by all [virtua
60c0: 6c 20 74 61 62 6c 65 73 5d 2e 0a 0a 20 20 3c 6c  l tables]...  <l
60d0: 69 3e 3c 70 3e 20 0a 20 20 20 20 54 68 65 20 5b  i><p> .    The [
60e0: 46 54 53 20 4d 41 54 43 48 5d 20 6f 70 65 72 61  FTS MATCH] opera
60f0: 74 6f 72 20 69 73 20 73 75 70 70 6f 72 74 65 64  tor is supported
6100: 20 66 6f 72 20 71 75 65 72 69 65 73 20 62 61 73   for queries bas
6110: 65 64 20 6f 6e 20 74 68 65 20 62 75 69 6c 74 2d  ed on the built-
6120: 69 6e 0a 20 20 20 20 66 75 6c 6c 2d 74 65 78 74  in.    full-text
6130: 20 69 6e 64 65 78 2e 20 0a 0a 20 20 3c 6c 69 3e   index. ..  <li>
6140: 3c 70 3e 20 0a 20 20 20 20 54 68 65 20 5b 46 54  <p> .    The [FT
6150: 53 20 61 75 78 69 6c 69 61 72 79 20 66 75 6e 63  S auxiliary func
6160: 74 69 6f 6e 73 5d 2c 20 5b 73 6e 69 70 70 65 74  tions], [snippet
6170: 28 29 5d 2c 20 5b 6f 66 66 73 65 74 73 28 29 5d  ()], [offsets()]
6180: 2c 20 61 6e 64 20 5b 6d 61 74 63 68 69 6e 66 6f  , and [matchinfo
6190: 28 29 5d 20 61 72 65 20 0a 20 20 20 20 61 76 61  ()] are .    ava
61a0: 69 6c 61 62 6c 65 20 74 6f 20 73 75 70 70 6f 72  ilable to suppor
61b0: 74 20 66 75 6c 6c 2d 74 65 78 74 20 71 75 65 72  t full-text quer
61c0: 69 65 73 2e 0a 0a 20 20 3c 6c 69 3e 3c 70 3e 0a  ies...  <li><p>.
61d0: 20 20 20 20 3c 74 63 6c 3e 68 64 5f 66 72 61 67      <tcl>hd_frag
61e0: 6d 65 6e 74 20 68 69 64 64 65 6e 63 6f 6c 20 7b  ment hiddencol {
61f0: 46 54 53 20 68 69 64 64 65 6e 20 63 6f 6c 75 6d  FTS hidden colum
6200: 6e 7d 3c 2f 74 63 6c 3e 0a 20 20 20 20 45 76 65  n}</tcl>.    Eve
6210: 72 79 20 46 54 53 20 74 61 62 6c 65 20 68 61 73  ry FTS table has
6220: 20 61 20 5b 68 69 64 64 65 6e 20 63 6f 6c 75 6d   a [hidden colum
6230: 6e 5d 20 77 69 74 68 20 74 68 65 20 0a 20 20 20  n] with the .   
6240: 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68   same name as th
6250: 65 20 74 61 62 6c 65 20 69 74 73 65 6c 66 2e 20  e table itself. 
6260: 54 68 65 20 76 61 6c 75 65 20 63 6f 6e 74 61 69  The value contai
6270: 6e 65 64 20 69 6e 20 65 61 63 68 20 72 6f 77 20  ned in each row 
6280: 66 6f 72 20 74 68 65 0a 20 20 20 20 68 69 64 64  for the.    hidd
6290: 65 6e 20 63 6f 6c 75 6d 6e 20 69 73 20 61 20 62  en column is a b
62a0: 6c 6f 62 20 74 68 61 74 20 69 73 20 6f 6e 6c 79  lob that is only
62b0: 20 75 73 65 66 75 6c 20 61 73 20 74 68 65 20 6c   useful as the l
62c0: 65 66 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61  eft operand of a
62d0: 0a 20 20 20 20 5b 46 54 53 20 4d 41 54 43 48 7c  .    [FTS MATCH|
62e0: 4d 41 54 43 48 5d 20 6f 70 65 72 61 74 6f 72 2c  MATCH] operator,
62f0: 20 6f 72 20 61 73 20 74 68 65 20 6c 65 66 74 2d   or as the left-
6300: 6d 6f 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  most argument to
6310: 20 6f 6e 65 0a 20 20 20 20 6f 66 20 74 68 65 20   one.    of the 
6320: 5b 46 54 53 20 61 75 78 69 6c 69 61 72 79 20 66  [FTS auxiliary f
6330: 75 6e 63 74 69 6f 6e 73 5d 2e 0a 20 20 20 20 0a  unctions]..    .
6340: 0a 3c 2f 6f 6c 3e 0a 0a 0a 3c 68 31 20 74 61 67  .</ol>...<h1 tag
6350: 73 3d 22 63 6f 6d 70 69 6c 65 20 66 74 73 22 3e  s="compile fts">
6360: 43 6f 6d 70 69 6c 69 6e 67 20 61 6e 64 20 45 6e  Compiling and En
6370: 61 62 6c 69 6e 67 20 46 54 53 33 20 61 6e 64 20  abling FTS3 and 
6380: 46 54 53 34 3c 2f 68 31 3e 0a 0a 3c 70 3e 0a 20  FTS4</h1>..<p>. 
6390: 20 41 6c 74 68 6f 75 67 68 20 46 54 53 33 20 61   Although FTS3 a
63a0: 6e 64 20 46 54 53 34 20 61 72 65 20 69 6e 63 6c  nd FTS4 are incl
63b0: 75 64 65 64 20 77 69 74 68 20 74 68 65 20 53 51  uded with the SQ
63c0: 4c 69 74 65 20 63 6f 72 65 20 73 6f 75 72 63 65  Lite core source
63d0: 20 63 6f 64 65 2c 20 74 68 65 79 20 61 72 65 20   code, they are 
63e0: 6e 6f 74 0a 20 20 65 6e 61 62 6c 65 64 20 62 79  not.  enabled by
63f0: 20 64 65 66 61 75 6c 74 2e 20 54 6f 20 62 75 69   default. To bui
6400: 6c 64 20 53 51 4c 69 74 65 20 77 69 74 68 20 46  ld SQLite with F
6410: 54 53 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79  TS functionality
6420: 20 65 6e 61 62 6c 65 64 2c 20 64 65 66 69 6e 65   enabled, define
6430: 0a 20 20 74 68 65 20 70 72 65 70 72 6f 63 65 73  .  the preproces
6440: 73 6f 72 20 6d 61 63 72 6f 20 5b 53 51 4c 49 54  sor macro [SQLIT
6450: 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 5d 20 77  E_ENABLE_FTS3] w
6460: 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 2e 20 4e  hen compiling. N
6470: 65 77 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 0a  ew applications.
6480: 20 20 73 68 6f 75 6c 64 20 61 6c 73 6f 20 64 65    should also de
6490: 66 69 6e 65 20 74 68 65 20 5b 53 51 4c 49 54 45  fine the [SQLITE
64a0: 5f 45 4e 41 42 4c 45 5f 46 54 53 33 5f 50 41 52  _ENABLE_FTS3_PAR
64b0: 45 4e 54 48 45 53 49 53 5d 20 6d 61 63 72 6f 20  ENTHESIS] macro 
64c0: 74 6f 20 65 6e 61 62 6c 65 20 74 68 65 0a 20 20  to enable the.  
64d0: 5b 65 6e 68 61 6e 63 65 64 20 71 75 65 72 79 20  [enhanced query 
64e0: 73 79 6e 74 61 78 5d 20 28 73 65 65 20 62 65 6c  syntax] (see bel
64f0: 6f 77 29 2e 20 55 73 75 61 6c 6c 79 2c 20 74 68  ow). Usually, th
6500: 69 73 20 69 73 20 64 6f 6e 65 20 62 79 20 61 64  is is done by ad
6510: 64 69 6e 67 20 74 68 65 20 0a 20 20 66 6f 6c 6c  ding the .  foll
6520: 6f 77 69 6e 67 20 74 77 6f 20 73 77 69 74 63 68  owing two switch
6530: 65 73 20 74 6f 20 74 68 65 20 63 6f 6d 70 69 6c  es to the compil
6540: 65 72 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 3a  er command line:
6550: 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20  ..<codeblock>.  
6560: 2d 44 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  -DSQLITE_ENABLE_
6570: 46 54 53 33 0a 20 20 2d 44 53 51 4c 49 54 45 5f  FTS3.  -DSQLITE_
6580: 45 4e 41 42 4c 45 5f 46 54 53 33 5f 50 41 52 45  ENABLE_FTS3_PARE
6590: 4e 54 48 45 53 49 53 0a 3c 2f 63 6f 64 65 62 6c  NTHESIS.</codebl
65a0: 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 4e 6f 74 65  ock>..<p>.  Note
65b0: 20 74 68 61 74 20 65 6e 61 62 6c 69 6e 67 20 46   that enabling F
65c0: 54 53 33 20 61 6c 73 6f 20 6d 61 6b 65 73 20 46  TS3 also makes F
65d0: 54 53 34 20 61 76 61 69 6c 61 62 6c 65 2e 20 20  TS4 available.  
65e0: 54 68 65 72 65 20 69 73 20 6e 6f 74 20 61 20 73  There is not a s
65f0: 65 70 61 72 61 74 65 0a 20 20 53 51 4c 49 54 45  eparate.  SQLITE
6600: 5f 45 4e 41 42 4c 45 5f 46 54 53 34 20 63 6f 6d  _ENABLE_FTS4 com
6610: 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e  pile-time option
6620: 2e 20 20 41 6e 20 62 75 69 6c 64 20 6f 66 20 53  .  An build of S
6630: 51 4c 69 74 65 20 65 69 74 68 65 72 20 73 75 70  QLite either sup
6640: 70 6f 72 74 73 0a 20 20 62 6f 74 68 20 46 54 53  ports.  both FTS
6650: 33 20 61 6e 64 20 46 54 53 34 20 6f 72 20 69 74  3 and FTS4 or it
6660: 20 73 75 70 70 6f 72 74 73 20 6e 65 69 74 68 65   supports neithe
6670: 72 2e 0a 0a 3c 70 3e 0a 20 20 49 66 20 75 73 69  r...<p>.  If usi
6680: 6e 67 20 74 68 65 20 61 6d 61 6c 67 61 6d 61 74  ng the amalgamat
6690: 69 6f 6e 20 61 75 74 6f 63 6f 6e 66 20 62 61 73  ion autoconf bas
66a0: 65 64 20 62 75 69 6c 64 20 73 79 73 74 65 6d 2c  ed build system,
66b0: 20 73 65 74 74 69 6e 67 20 74 68 65 20 43 50 50   setting the CPP
66c0: 46 4c 41 47 53 0a 20 20 65 6e 76 69 72 6f 6e 6d  FLAGS.  environm
66d0: 65 6e 74 20 76 61 72 69 61 62 6c 65 20 77 68 69  ent variable whi
66e0: 6c 65 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 27  le running the '
66f0: 63 6f 6e 66 69 67 75 72 65 27 20 73 63 72 69 70  configure' scrip
6700: 74 20 69 73 20 61 6e 20 65 61 73 79 0a 20 20 77  t is an easy.  w
6710: 61 79 20 74 6f 20 73 65 74 20 74 68 65 73 65 20  ay to set these 
6720: 6d 61 63 72 6f 73 2e 20 46 6f 72 20 65 78 61 6d  macros. For exam
6730: 70 6c 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ple, the followi
6740: 6e 67 20 63 6f 6d 6d 61 6e 64 3a 0a 0a 3c 63 6f  ng command:..<co
6750: 64 65 62 6c 6f 63 6b 3e 0a 20 20 43 50 50 46 4c  deblock>.  CPPFL
6760: 41 47 53 3d 22 2d 44 53 51 4c 49 54 45 5f 45 4e  AGS="-DSQLITE_EN
6770: 41 42 4c 45 5f 46 54 53 33 20 2d 44 53 51 4c 49  ABLE_FTS3 -DSQLI
6780: 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 5f 50  TE_ENABLE_FTS3_P
6790: 41 52 45 4e 54 48 45 53 49 53 22 20 2e 2f 63 6f  ARENTHESIS" ./co
67a0: 6e 66 69 67 75 72 65 20 26 6c 74 3b 63 6f 6e 66  nfigure &lt;conf
67b0: 69 67 75 72 65 20 6f 70 74 69 6f 6e 73 26 67 74  igure options&gt
67c0: 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a  ;.</codeblock>..
67d0: 3c 70 3e 0a 20 20 77 68 65 72 65 20 3c 69 3e 26  <p>.  where <i>&
67e0: 6c 74 3b 63 6f 6e 66 69 67 75 72 65 20 6f 70 74  lt;configure opt
67f0: 69 6f 6e 73 26 67 74 3b 3c 2f 69 3e 20 61 72 65  ions&gt;</i> are
6800: 20 74 68 6f 73 65 20 6f 70 74 69 6f 6e 73 20 6e   those options n
6810: 6f 72 6d 61 6c 6c 79 20 70 61 73 73 65 64 20 74  ormally passed t
6820: 6f 0a 20 20 74 68 65 20 63 6f 6e 66 69 67 75 72  o.  the configur
6830: 65 20 73 63 72 69 70 74 2c 20 69 66 20 61 6e 79  e script, if any
6840: 2e 0a 0a 3c 70 3e 0a 20 20 42 65 63 61 75 73 65  ...<p>.  Because
6850: 20 46 54 53 33 20 61 6e 64 20 46 54 53 34 20 61   FTS3 and FTS4 a
6860: 72 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  re virtual table
6870: 73 2c 20 54 68 65 20 5b 53 51 4c 49 54 45 5f 45  s, The [SQLITE_E
6880: 4e 41 42 4c 45 5f 46 54 53 33 5d 20 63 6f 6d 70  NABLE_FTS3] comp
6890: 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 0a  ile-time option.
68a0: 20 20 69 73 20 69 6e 63 6f 6d 70 61 74 69 62 6c    is incompatibl
68b0: 65 20 77 69 74 68 20 74 68 65 20 5b 53 51 4c 49  e with the [SQLI
68c0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
68d0: 41 42 4c 45 5d 20 6f 70 74 69 6f 6e 2e 0a 0a 3c  ABLE] option...<
68e0: 70 3e 0a 20 20 49 66 20 61 20 62 75 69 6c 64 20  p>.  If a build 
68f0: 6f 66 20 53 51 4c 69 74 65 20 64 6f 65 73 20 6e  of SQLite does n
6900: 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20 46  ot include the F
6910: 54 53 20 6d 6f 64 75 6c 65 73 2c 20 74 68 65 6e  TS modules, then
6920: 20 61 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   any attempt to 
6930: 70 72 65 70 61 72 65 20 61 6e 0a 20 20 53 51 4c  prepare an.  SQL
6940: 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 63 72   statement to cr
6950: 65 61 74 65 20 61 6e 20 46 54 53 33 20 6f 72 20  eate an FTS3 or 
6960: 46 54 53 34 20 74 61 62 6c 65 20 6f 72 20 74 6f  FTS4 table or to
6970: 20 64 72 6f 70 20 6f 72 20 61 63 63 65 73 73 20   drop or access 
6980: 61 6e 20 65 78 69 73 74 69 6e 67 20 0a 20 20 46  an existing .  F
6990: 54 53 20 74 61 62 6c 65 20 69 6e 20 61 6e 79 20  TS table in any 
69a0: 77 61 79 20 77 69 6c 6c 20 66 61 69 6c 2e 20 54  way will fail. T
69b0: 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
69c0: 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62   returned will b
69d0: 65 20 73 69 6d 69 6c 61 72 20 0a 20 20 74 6f 20  e similar .  to 
69e0: 22 6e 6f 20 73 75 63 68 20 6d 6f 64 75 6c 65 3a  "no such module:
69f0: 20 66 74 73 4e 22 20 28 77 68 65 72 65 20 4e 20   ftsN" (where N 
6a00: 69 73 20 65 69 74 68 65 72 20 33 20 6f 72 20 34  is either 3 or 4
6a10: 29 2e 0a 0a 3c 70 3e 0a 20 20 49 66 20 74 68 65  )...<p>.  If the
6a20: 20 43 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68   C version of th
6a30: 65 20 3c 61 20 68 72 65 66 3d 68 74 74 70 3a 2f  e <a href=http:/
6a40: 2f 73 69 74 65 2e 69 63 75 2d 70 72 6f 6a 65 63  /site.icu-projec
6a50: 74 2e 6f 72 67 2f 3e 49 43 55 20 6c 69 62 72 61  t.org/>ICU libra
6a60: 72 79 3c 2f 61 3e 0a 20 20 69 73 20 61 76 61 69  ry</a>.  is avai
6a70: 6c 61 62 6c 65 2c 20 74 68 65 6e 20 46 54 53 20  lable, then FTS 
6a80: 6d 61 79 20 61 6c 73 6f 20 62 65 20 63 6f 6d 70  may also be comp
6a90: 69 6c 65 64 20 77 69 74 68 20 74 68 65 20 53 51  iled with the SQ
6aa0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a  LITE_ENABLE_ICU.
6ab0: 20 20 70 72 65 2d 70 72 6f 63 65 73 73 6f 72 20    pre-processor 
6ac0: 6d 61 63 72 6f 20 64 65 66 69 6e 65 64 2e 20 43  macro defined. C
6ad0: 6f 6d 70 69 6c 69 6e 67 20 77 69 74 68 20 74 68  ompiling with th
6ae0: 69 73 20 6d 61 63 72 6f 20 65 6e 61 62 6c 65 73  is macro enables
6af0: 20 61 6e 20 46 54 53 0a 20 20 5b 74 6f 6b 65 6e   an FTS.  [token
6b00: 69 7a 65 72 5d 20 74 68 61 74 20 75 73 65 73 20  izer] that uses 
6b10: 74 68 65 20 49 43 55 20 6c 69 62 72 61 72 79 20  the ICU library 
6b20: 74 6f 20 73 70 6c 69 74 20 61 20 64 6f 63 75 6d  to split a docum
6b30: 65 6e 74 20 69 6e 74 6f 20 74 65 72 6d 73 0a 20  ent into terms. 
6b40: 20 28 77 6f 72 64 73 29 20 75 73 69 6e 67 20 74   (words) using t
6b50: 68 65 20 63 6f 6e 76 65 6e 74 69 6f 6e 73 20 66  he conventions f
6b60: 6f 72 20 61 20 73 70 65 63 69 66 69 65 64 20 6c  or a specified l
6b70: 61 6e 67 75 61 67 65 20 61 6e 64 20 6c 6f 63 61  anguage and loca
6b80: 6c 65 2e 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e  le...<codeblock>
6b90: 0a 20 20 2d 44 53 51 4c 49 54 45 5f 45 4e 41 42  .  -DSQLITE_ENAB
6ba0: 4c 45 5f 49 43 55 0a 3c 2f 63 6f 64 65 62 6c 6f  LE_ICU.</codeblo
6bb0: 63 6b 3e 0a 20 20 0a 0a 3c 68 31 20 74 61 67 73  ck>.  ..<h1 tags
6bc0: 3d 22 46 54 53 20 4d 41 54 43 48 22 3e 46 75 6c  ="FTS MATCH">Ful
6bd0: 6c 2d 74 65 78 74 20 49 6e 64 65 78 20 51 75 65  l-text Index Que
6be0: 72 69 65 73 3c 2f 68 31 3e 0a 0a 3c 70 3e 0a 20  ries</h1>..<p>. 
6bf0: 20 54 68 65 20 6d 6f 73 74 20 75 73 65 66 75 6c   The most useful
6c00: 20 74 68 69 6e 67 20 61 62 6f 75 74 20 46 54 53   thing about FTS
6c10: 20 74 61 62 6c 65 73 20 69 73 20 74 68 65 20 71   tables is the q
6c20: 75 65 72 69 65 73 20 74 68 61 74 20 6d 61 79 20  ueries that may 
6c30: 62 65 20 0a 20 20 70 65 72 66 6f 72 6d 65 64 20  be .  performed 
6c40: 75 73 69 6e 67 20 74 68 65 20 62 75 69 6c 74 2d  using the built-
6c50: 69 6e 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64  in full-text ind
6c60: 65 78 2e 20 46 75 6c 6c 2d 74 65 78 74 20 71 75  ex. Full-text qu
6c70: 65 72 69 65 73 20 61 72 65 20 0a 20 20 70 65 72  eries are .  per
6c80: 66 6f 72 6d 65 64 20 62 79 20 73 70 65 63 69 66  formed by specif
6c90: 79 69 6e 67 20 61 20 63 6c 61 75 73 65 20 6f 66  ying a clause of
6ca0: 20 74 68 65 20 66 6f 72 6d 20 0a 20 20 22 26 6c   the form .  "&l
6cb0: 74 3b 63 6f 6c 75 6d 6e 26 67 74 3b 20 4d 41 54  t;column&gt; MAT
6cc0: 43 48 20 26 6c 74 3b 66 75 6c 6c 2d 74 65 78 74  CH &lt;full-text
6cd0: 20 71 75 65 72 79 20 65 78 70 72 65 73 73 69 6f   query expressio
6ce0: 6e 26 67 74 3b 22 20 61 73 20 70 61 72 74 20 6f  n&gt;" as part o
6cf0: 66 20 74 68 65 20 57 48 45 52 45 20 0a 20 20 63  f the WHERE .  c
6d00: 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
6d10: 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  T statement that
6d20: 20 72 65 61 64 73 20 64 61 74 61 20 66 72 6f 6d   reads data from
6d30: 20 61 6e 20 46 54 53 20 74 61 62 6c 65 2e 20 0a   an FTS table. .
6d40: 20 20 5b 73 69 6d 70 6c 65 20 66 74 73 20 71 75    [simple fts qu
6d50: 65 72 69 65 73 7c 53 69 6d 70 6c 65 20 46 54 53  eries|Simple FTS
6d60: 20 71 75 65 72 69 65 73 5d 20 74 68 61 74 20 72   queries] that r
6d70: 65 74 75 72 6e 20 61 6c 6c 20 64 6f 63 75 6d 65  eturn all docume
6d80: 6e 74 73 20 74 68 61 74 20 0a 20 20 63 6f 6e 74  nts that .  cont
6d90: 61 69 6e 20 61 20 67 69 76 65 6e 20 74 65 72 6d  ain a given term
6da0: 20 61 72 65 20 64 65 73 63 72 69 62 65 64 20 61   are described a
6db0: 62 6f 76 65 2e 20 49 6e 20 74 68 61 74 20 64 69  bove. In that di
6dc0: 73 63 75 73 73 69 6f 6e 20 74 68 65 20 72 69 67  scussion the rig
6dd0: 68 74 2d 68 61 6e 64 0a 20 20 6f 70 65 72 61 6e  ht-hand.  operan
6de0: 64 20 6f 66 20 74 68 65 20 4d 41 54 43 48 20 6f  d of the MATCH o
6df0: 70 65 72 61 74 6f 72 20 77 61 73 20 61 73 73 75  perator was assu
6e00: 6d 65 64 20 74 6f 20 62 65 20 61 20 73 74 72 69  med to be a stri
6e10: 6e 67 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66  ng consisting of
6e20: 20 61 0a 20 20 73 69 6e 67 6c 65 20 74 65 72 6d   a.  single term
6e30: 2e 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 64  . This section d
6e40: 65 73 63 72 69 62 65 73 20 74 68 65 20 6d 6f 72  escribes the mor
6e50: 65 20 63 6f 6d 70 6c 65 78 20 71 75 65 72 79 20  e complex query 
6e60: 74 79 70 65 73 20 73 75 70 70 6f 72 74 65 64 20  types supported 
6e70: 0a 20 20 62 79 20 46 54 53 20 74 61 62 6c 65 73  .  by FTS tables
6e80: 2c 20 61 6e 64 20 68 6f 77 20 74 68 65 79 20 6d  , and how they m
6e90: 61 79 20 62 65 20 75 74 69 6c 69 7a 65 64 20 62  ay be utilized b
6ea0: 79 20 73 70 65 63 69 66 79 69 6e 67 20 61 20 6d  y specifying a m
6eb0: 6f 72 65 0a 20 20 63 6f 6d 70 6c 65 78 20 71 75  ore.  complex qu
6ec0: 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 61  ery expression a
6ed0: 73 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  s the right-hand
6ee0: 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4d 41   operand of a MA
6ef0: 54 43 48 20 6f 70 65 72 61 74 6f 72 2e 0a 0a 3c  TCH operator...<
6f00: 70 3e 0a 20 20 46 54 53 20 74 61 62 6c 65 73 20  p>.  FTS tables 
6f10: 73 75 70 70 6f 72 74 20 74 68 72 65 65 20 62 61  support three ba
6f20: 73 69 63 20 71 75 65 72 79 20 74 79 70 65 73 3a  sic query types:
6f30: 0a 0a 3c 75 6c 3e 0a 20 20 3c 6c 69 3e 3c 70 3e  ..<ul>.  <li><p>
6f40: 3c 62 3e 54 6f 6b 65 6e 20 6f 72 20 74 6f 6b 65  <b>Token or toke
6f50: 6e 20 70 72 65 66 69 78 20 71 75 65 72 69 65 73  n prefix queries
6f60: 3c 2f 62 3e 2e 20 0a 20 20 20 20 41 6e 20 46 54  </b>. .    An FT
6f70: 53 20 74 61 62 6c 65 20 6d 61 79 20 62 65 20 71  S table may be q
6f80: 75 65 72 69 65 64 20 66 6f 72 20 61 6c 6c 20 64  ueried for all d
6f90: 6f 63 75 6d 65 6e 74 73 20 74 68 61 74 20 63 6f  ocuments that co
6fa0: 6e 74 61 69 6e 20 61 20 73 70 65 63 69 66 69 65  ntain a specifie
6fb0: 64 0a 20 20 20 20 74 65 72 6d 20 28 74 68 65 20  d.    term (the 
6fc0: 5b 73 69 6d 70 6c 65 20 66 74 73 20 71 75 65 72  [simple fts quer
6fd0: 69 65 73 7c 73 69 6d 70 6c 65 20 63 61 73 65 5d  ies|simple case]
6fe0: 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65   described above
6ff0: 29 2c 20 6f 72 20 66 6f 72 0a 20 20 20 20 61 6c  ), or for.    al
7000: 6c 20 64 6f 63 75 6d 65 6e 74 73 20 74 68 61 74  l documents that
7010: 20 63 6f 6e 74 61 69 6e 20 61 20 74 65 72 6d 20   contain a term 
7020: 77 69 74 68 20 61 20 73 70 65 63 69 66 69 65 64  with a specified
7030: 20 70 72 65 66 69 78 2e 20 41 73 20 77 65 20 68   prefix. As we h
7040: 61 76 65 0a 20 20 20 20 73 65 65 6e 2c 20 74 68  ave.    seen, th
7050: 65 20 71 75 65 72 79 20 65 78 70 72 65 73 73 69  e query expressi
7060: 6f 6e 20 66 6f 72 20 61 20 73 70 65 63 69 66 69  on for a specifi
7070: 63 20 74 65 72 6d 20 69 73 20 73 69 6d 70 6c 79  c term is simply
7080: 20 74 68 65 20 74 65 72 6d 20 69 74 73 65 6c 66   the term itself
7090: 2e 0a 20 20 20 20 54 68 65 20 71 75 65 72 79 20  ..    The query 
70a0: 65 78 70 72 65 73 73 69 6f 6e 20 75 73 65 64 20  expression used 
70b0: 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20 61 20  to search for a 
70c0: 74 65 72 6d 20 70 72 65 66 69 78 20 69 73 20 74  term prefix is t
70d0: 68 65 20 70 72 65 66 69 78 0a 20 20 20 20 69 74  he prefix.    it
70e0: 73 65 6c 66 20 77 69 74 68 20 61 20 27 2a 27 20  self with a '*' 
70f0: 63 68 61 72 61 63 74 65 72 20 61 70 70 65 6e 64  character append
7100: 65 64 20 74 6f 20 69 74 2e 20 46 6f 72 20 65 78  ed to it. For ex
7110: 61 6d 70 6c 65 3a 0a 3c 2f 75 6c 3e 0a 0a 3c 63  ample:.</ul>..<c
7120: 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d  odeblock>.  <i>-
7130: 2d 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20  - Virtual table 
7140: 64 65 63 6c 61 72 61 74 69 6f 6e 3c 2f 69 3e 0a  declaration</i>.
7150: 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c    CREATE VIRTUAL
7160: 20 54 41 42 4c 45 20 64 6f 63 73 20 55 53 49 4e   TABLE docs USIN
7170: 47 20 66 74 73 33 28 74 69 74 6c 65 2c 20 62 6f  G fts3(title, bo
7180: 64 79 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 51 75  dy);..  <i>-- Qu
7190: 65 72 79 20 66 6f 72 20 61 6c 6c 20 64 6f 63 75  ery for all docu
71a0: 6d 65 6e 74 73 20 63 6f 6e 74 61 69 6e 69 6e 67  ments containing
71b0: 20 74 68 65 20 74 65 72 6d 20 22 6c 69 6e 75 78   the term "linux
71c0: 22 3a 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20  ":</i>.  SELECT 
71d0: 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52  * FROM docs WHER
71e0: 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27 6c 69  E docs MATCH 'li
71f0: 6e 75 78 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 51  nux';..  <i>-- Q
7200: 75 65 72 79 20 66 6f 72 20 61 6c 6c 20 64 6f 63  uery for all doc
7210: 75 6d 65 6e 74 73 20 63 6f 6e 74 61 69 6e 69 6e  uments containin
7220: 67 20 61 20 74 65 72 6d 20 77 69 74 68 20 74 68  g a term with th
7230: 65 20 70 72 65 66 69 78 20 22 6c 69 6e 22 2e 20  e prefix "lin". 
7240: 54 68 69 73 20 77 69 6c 6c 20 6d 61 74 63 68 3c  This will match<
7250: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 61 6c 6c 20  /i>.  <i>-- all 
7260: 64 6f 63 75 6d 65 6e 74 73 20 74 68 61 74 20 63  documents that c
7270: 6f 6e 74 61 69 6e 20 22 6c 69 6e 75 78 22 2c 20  ontain "linux", 
7280: 62 75 74 20 61 6c 73 6f 20 74 68 6f 73 65 20 74  but also those t
7290: 68 61 74 20 63 6f 6e 74 61 69 6e 20 74 65 72 6d  hat contain term
72a0: 73 20 22 6c 69 6e 65 61 72 22 2c 3c 2f 69 3e 0a  s "linear",</i>.
72b0: 20 20 3c 69 3e 2d 2d 22 6c 69 6e 6b 65 72 22 2c    <i>--"linker",
72c0: 20 22 6c 69 6e 67 75 69 73 74 69 63 22 20 61 6e   "linguistic" an
72d0: 64 20 73 6f 20 6f 6e 2e 3c 2f 69 3e 0a 20 20 53  d so on.</i>.  S
72e0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63  ELECT * FROM doc
72f0: 73 20 57 48 45 52 45 20 64 6f 63 73 20 4d 41 54  s WHERE docs MAT
7300: 43 48 20 27 6c 69 6e 2a 27 3b 0a 3c 2f 63 6f 64  CH 'lin*';.</cod
7310: 65 62 6c 6f 63 6b 3e 0a 0a 3c 75 6c 3e 0a 20 20  eblock>..<ul>.  
7320: 3c 6c 69 20 73 74 79 6c 65 3d 22 6c 69 73 74 2d  <li style="list-
7330: 73 74 79 6c 65 3a 6e 6f 6e 65 22 3e 3c 70 3e 0a  style:none"><p>.
7340: 20 20 20 20 4e 6f 72 6d 61 6c 6c 79 2c 20 61 20      Normally, a 
7350: 74 6f 6b 65 6e 20 6f 72 20 74 6f 6b 65 6e 20 70  token or token p
7360: 72 65 66 69 78 20 71 75 65 72 79 20 69 73 20 6d  refix query is m
7370: 61 74 63 68 65 64 20 61 67 61 69 6e 73 74 20 74  atched against t
7380: 68 65 20 46 54 53 20 74 61 62 6c 65 20 0a 20 20  he FTS table .  
7390: 20 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69    column specifi
73a0: 65 64 20 61 73 20 74 68 65 20 72 69 67 68 74 2d  ed as the right-
73b0: 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65  hand side of the
73c0: 20 4d 41 54 43 48 20 6f 70 65 72 61 74 6f 72 2e   MATCH operator.
73d0: 20 4f 72 2c 20 69 66 20 74 68 65 0a 20 20 20 20   Or, if the.    
73e0: 73 70 65 63 69 61 6c 20 63 6f 6c 75 6d 6e 20 77  special column w
73f0: 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  ith the same nam
7400: 65 20 61 73 20 74 68 65 20 46 54 53 20 74 61 62  e as the FTS tab
7410: 6c 65 20 69 74 73 65 6c 66 20 69 73 20 73 70 65  le itself is spe
7420: 63 69 66 69 65 64 2c 0a 20 20 20 20 61 67 61 69  cified,.    agai
7430: 6e 73 74 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 2e  nst all columns.
7440: 20 54 68 69 73 20 6d 61 79 20 62 65 20 6f 76 65   This may be ove
7450: 72 72 69 64 64 65 6e 20 62 79 20 73 70 65 63 69  rridden by speci
7460: 66 79 69 6e 67 20 61 20 63 6f 6c 75 6d 6e 2d 6e  fying a column-n
7470: 61 6d 65 0a 20 20 20 20 66 6f 6c 6c 6f 77 65 64  ame.    followed
7480: 20 62 79 20 61 20 22 3a 22 20 63 68 61 72 61 63   by a ":" charac
7490: 74 65 72 20 62 65 66 6f 72 65 20 61 20 62 61 73  ter before a bas
74a0: 69 63 20 74 65 72 6d 20 71 75 65 72 79 2e 20 54  ic term query. T
74b0: 68 65 72 65 20 6d 61 79 20 62 65 20 73 70 61 63  here may be spac
74c0: 65 0a 20 20 20 20 62 65 74 77 65 65 6e 20 74 68  e.    between th
74d0: 65 20 22 3a 22 20 61 6e 64 20 74 68 65 20 74 65  e ":" and the te
74e0: 72 6d 20 74 6f 20 71 75 65 72 79 20 66 6f 72 2c  rm to query for,
74f0: 20 62 75 74 20 6e 6f 74 20 62 65 74 77 65 65 6e   but not between
7500: 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 6e 61 6d 65   the column-name
7510: 0a 20 20 20 20 61 6e 64 20 74 68 65 20 22 3a 22  .    and the ":"
7520: 20 63 68 61 72 61 63 74 65 72 2e 20 46 6f 72 20   character. For 
7530: 65 78 61 6d 70 6c 65 3a 0a 3c 2f 75 6c 3e 0a 20  example:.</ul>. 
7540: 20 20 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20    .<codeblock>. 
7550: 20 3c 69 3e 2d 2d 20 51 75 65 72 79 20 74 68 65   <i>-- Query the
7560: 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 64 6f   database for do
7570: 63 75 6d 65 6e 74 73 20 66 6f 72 20 77 68 69 63  cuments for whic
7580: 68 20 74 68 65 20 74 65 72 6d 20 22 6c 69 6e 75  h the term "linu
7590: 78 22 20 61 70 70 65 61 72 73 20 69 6e 3c 2f 69  x" appears in</i
75a0: 3e 0a 20 20 3c 69 3e 2d 2d 20 74 68 65 20 64 6f  >.  <i>-- the do
75b0: 63 75 6d 65 6e 74 20 74 69 74 6c 65 2c 20 61 6e  cument title, an
75c0: 64 20 74 68 65 20 74 65 72 6d 20 22 70 72 6f 62  d the term "prob
75d0: 6c 65 6d 73 22 20 61 70 70 65 61 72 73 20 69 6e  lems" appears in
75e0: 20 65 69 74 68 65 72 20 74 68 65 20 74 69 74 6c   either the titl
75f0: 65 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 6f 72  e</i>.  <i>-- or
7600: 20 62 6f 64 79 20 6f 66 20 74 68 65 20 64 6f 63   body of the doc
7610: 75 6d 65 6e 74 2e 3c 2f 69 3e 0a 20 20 53 45 4c  ument.</i>.  SEL
7620: 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20  ECT * FROM docs 
7630: 57 48 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48  WHERE docs MATCH
7640: 20 27 74 69 74 6c 65 3a 6c 69 6e 75 78 20 70 72   'title:linux pr
7650: 6f 62 6c 65 6d 73 27 3b 0a 0a 20 20 3c 69 3e 2d  oblems';..  <i>-
7660: 2d 20 51 75 65 72 79 20 74 68 65 20 64 61 74 61  - Query the data
7670: 62 61 73 65 20 66 6f 72 20 64 6f 63 75 6d 65 6e  base for documen
7680: 74 73 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  ts for which the
7690: 20 74 65 72 6d 20 22 6c 69 6e 75 78 22 20 61 70   term "linux" ap
76a0: 70 65 61 72 73 20 69 6e 3c 2f 69 3e 0a 20 20 3c  pears in</i>.  <
76b0: 69 3e 2d 2d 20 74 68 65 20 64 6f 63 75 6d 65 6e  i>-- the documen
76c0: 74 20 74 69 74 6c 65 2c 20 61 6e 64 20 74 68 65  t title, and the
76d0: 20 74 65 72 6d 20 22 64 72 69 76 65 72 22 20 61   term "driver" a
76e0: 70 70 65 61 72 73 20 69 6e 20 74 68 65 20 62 6f  ppears in the bo
76f0: 64 79 20 6f 66 20 74 68 65 20 64 6f 63 75 6d 65  dy of the docume
7700: 6e 74 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 28  nt</i>.  <i>-- (
7710: 22 64 72 69 76 65 72 22 20 6d 61 79 20 61 6c 73  "driver" may als
7720: 6f 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  o appear in the 
7730: 74 69 74 6c 65 2c 20 62 75 74 20 74 68 69 73 20  title, but this 
7740: 61 6c 6f 6e 65 20 77 69 6c 6c 20 6e 6f 74 20 73  alone will not s
7750: 61 74 69 73 66 79 20 74 68 65 3c 2f 69 3e 2e 0a  atisfy the</i>..
7760: 20 20 3c 69 3e 2d 2d 20 71 75 65 72 79 20 63 72    <i>-- query cr
7770: 69 74 65 72 69 61 29 2e 3c 2f 69 3e 0a 20 20 53  iteria).</i>.  S
7780: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63  ELECT * FROM doc
7790: 73 20 57 48 45 52 45 20 62 6f 64 79 20 4d 41 54  s WHERE body MAT
77a0: 43 48 20 27 74 69 74 6c 65 3a 6c 69 6e 75 78 20  CH 'title:linux 
77b0: 64 72 69 76 65 72 27 3b 0a 3c 2f 63 6f 64 65 62  driver';.</codeb
77c0: 6c 6f 63 6b 3e 0a 0a 3c 75 6c 3e 0a 20 20 3c 6c  lock>..<ul>.  <l
77d0: 69 3e 3c 70 3e 3c 62 3e 50 68 72 61 73 65 20 71  i><p><b>Phrase q
77e0: 75 65 72 69 65 73 3c 2f 62 3e 2e 0a 20 20 20 20  ueries</b>..    
77f0: 41 20 70 68 72 61 73 65 20 71 75 65 72 79 20 69  A phrase query i
7800: 73 20 61 20 71 75 65 72 79 20 74 68 61 74 20 72  s a query that r
7810: 65 74 72 69 65 76 65 73 20 61 6c 6c 20 64 6f 63  etrieves all doc
7820: 75 6d 65 6e 74 73 20 74 68 61 74 20 63 6f 6e 74  uments that cont
7830: 61 69 6e 20 61 0a 20 20 20 20 6e 6f 6d 69 6e 61  ain a.    nomina
7840: 74 65 64 20 73 65 74 20 6f 66 20 74 65 72 6d 73  ted set of terms
7850: 20 6f 72 20 74 65 72 6d 20 70 72 65 66 69 78 65   or term prefixe
7860: 73 20 69 6e 20 61 20 73 70 65 63 69 66 69 65 64  s in a specified
7870: 20 6f 72 64 65 72 20 77 69 74 68 20 6e 6f 0a 20   order with no. 
7880: 20 20 20 69 6e 74 65 72 76 65 6e 69 6e 67 20 74     intervening t
7890: 6f 6b 65 6e 73 2e 20 50 68 72 61 73 65 20 71 75  okens. Phrase qu
78a0: 65 72 69 65 73 20 61 72 65 20 73 70 65 63 69 66  eries are specif
78b0: 69 65 64 20 62 79 20 65 6e 63 6c 6f 73 69 6e 67  ied by enclosing
78c0: 20 61 20 73 70 61 63 65 0a 20 20 20 20 73 65 70   a space.    sep
78d0: 61 72 61 74 65 64 20 73 65 71 75 65 6e 63 65 20  arated sequence 
78e0: 6f 66 20 74 65 72 6d 73 20 6f 72 20 74 65 72 6d  of terms or term
78f0: 20 70 72 65 66 69 78 65 73 20 69 6e 20 64 6f 75   prefixes in dou
7900: 62 6c 65 20 71 75 6f 74 65 73 20 28 22 29 2e 0a  ble quotes (")..
7910: 20 20 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a      For example:
7920: 0a 3c 2f 75 6c 3e 0a 0a 3c 63 6f 64 65 62 6c 6f  .</ul>..<codeblo
7930: 63 6b 3e 0a 20 20 3c 69 3e 2d 2d 20 51 75 65 72  ck>.  <i>-- Quer
7940: 79 20 66 6f 72 20 61 6c 6c 20 64 6f 63 75 6d 65  y for all docume
7950: 6e 74 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  nts that contain
7960: 20 74 68 65 20 70 68 72 61 73 65 20 22 6c 69 6e   the phrase "lin
7970: 75 78 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 22  ux applications"
7980: 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a  .</i>.  SELECT *
7990: 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45   FROM docs WHERE
79a0: 20 64 6f 63 73 20 4d 41 54 43 48 20 27 22 6c 69   docs MATCH '"li
79b0: 6e 75 78 20 61 70 70 6c 69 63 61 74 69 6f 6e 73  nux applications
79c0: 22 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 51 75 65  "';..  <i>-- Que
79d0: 72 79 20 66 6f 72 20 61 6c 6c 20 64 6f 63 75 6d  ry for all docum
79e0: 65 6e 74 73 20 74 68 61 74 20 63 6f 6e 74 61 69  ents that contai
79f0: 6e 20 61 20 70 68 72 61 73 65 20 74 68 61 74 20  n a phrase that 
7a00: 6d 61 74 63 68 65 73 20 22 6c 69 6e 2a 20 61 70  matches "lin* ap
7a10: 70 2a 22 2e 20 41 73 20 77 65 6c 6c 20 61 73 3c  p*". As well as<
7a20: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 22 6c 69 6e  /i>.  <i>-- "lin
7a30: 75 78 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 22  ux applications"
7a40: 2c 20 74 68 69 73 20 77 69 6c 6c 20 6d 61 74 63  , this will matc
7a50: 68 20 63 6f 6d 6d 6f 6e 20 70 68 72 61 73 65 73  h common phrases
7a60: 20 73 75 63 68 20 61 73 20 22 6c 69 6e 6f 6c 65   such as "linole
7a70: 75 6d 20 61 70 70 6c 69 61 6e 63 65 73 22 3c 2f  um appliances"</
7a80: 69 3e 0a 20 20 3c 69 3e 2d 2d 20 6f 72 20 22 6c  i>.  <i>-- or "l
7a90: 69 6e 6b 20 61 70 70 72 65 6e 74 69 63 65 22 2e  ink apprentice".
7aa0: 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20  </i>.  SELECT * 
7ab0: 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20  FROM docs WHERE 
7ac0: 64 6f 63 73 20 4d 41 54 43 48 20 27 22 6c 69 6e  docs MATCH '"lin
7ad0: 2a 20 61 70 70 2a 22 27 3b 0a 3c 2f 63 6f 64 65  * app*"';.</code
7ae0: 62 6c 6f 63 6b 3e 0a 0a 3c 75 6c 3e 0a 20 20 3c  block>..<ul>.  <
7af0: 6c 69 3e 3c 70 3e 3c 62 3e 4e 45 41 52 20 71 75  li><p><b>NEAR qu
7b00: 65 72 69 65 73 3c 2f 62 3e 2e 20 0a 20 20 20 20  eries</b>. .    
7b10: 41 20 4e 45 41 52 20 71 75 65 72 79 20 69 73 20  A NEAR query is 
7b20: 61 20 71 75 65 72 79 20 74 68 61 74 20 72 65 74  a query that ret
7b30: 75 72 6e 73 20 64 6f 63 75 6d 65 6e 74 73 20 74  urns documents t
7b40: 68 61 74 20 63 6f 6e 74 61 69 6e 20 61 20 74 77  hat contain a tw
7b50: 6f 20 6f 72 0a 20 20 20 20 6d 6f 72 65 20 6e 6f  o or.    more no
7b60: 6d 69 6e 61 74 65 64 20 74 65 72 6d 73 20 6f 72  minated terms or
7b70: 20 70 68 72 61 73 65 73 20 77 69 74 68 69 6e 20   phrases within 
7b80: 61 20 73 70 65 63 69 66 69 65 64 20 70 72 6f 78  a specified prox
7b90: 69 6d 69 74 79 20 6f 66 20 65 61 63 68 20 0a 20  imity of each . 
7ba0: 20 20 20 6f 74 68 65 72 20 28 62 79 20 64 65 66     other (by def
7bb0: 61 75 6c 74 20 77 69 74 68 20 31 30 20 6f 72 20  ault with 10 or 
7bc0: 6c 65 73 73 20 69 6e 74 65 72 76 65 6e 69 6e 67  less intervening
7bd0: 20 74 65 72 6d 73 29 2e 20 41 20 4e 45 41 52 20   terms). A NEAR 
7be0: 71 75 65 72 79 20 69 73 20 0a 20 20 20 20 73 70  query is .    sp
7bf0: 65 63 69 66 69 65 64 20 62 79 20 70 75 74 74 69  ecified by putti
7c00: 6e 67 20 74 68 65 20 6b 65 79 77 6f 72 64 20 22  ng the keyword "
7c10: 4e 45 41 52 22 20 62 65 74 77 65 65 6e 20 74 77  NEAR" between tw
7c20: 6f 20 70 68 72 61 73 65 2c 20 74 65 72 6d 20 6f  o phrase, term o
7c30: 72 20 0a 20 20 20 20 74 65 72 6d 20 70 72 65 66  r .    term pref
7c40: 69 78 20 71 75 65 72 69 65 73 2e 20 54 6f 20 73  ix queries. To s
7c50: 70 65 63 69 66 79 20 61 20 70 72 6f 78 69 6d 69  pecify a proximi
7c60: 74 79 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  ty other than th
7c70: 65 20 64 65 66 61 75 6c 74 2c 0a 20 20 20 20 61  e default,.    a
7c80: 6e 20 6f 70 65 72 61 74 6f 72 20 6f 66 20 74 68  n operator of th
7c90: 65 20 66 6f 72 6d 20 22 4e 45 41 52 2f 3c 69 3e  e form "NEAR/<i>
7ca0: 26 6c 74 3b 4e 26 67 74 3b 3c 2f 69 3e 22 20 6d  &lt;N&gt;</i>" m
7cb0: 61 79 20 62 65 20 75 73 65 64 2c 20 77 68 65 72  ay be used, wher
7cc0: 65 0a 20 20 20 20 3c 69 3e 26 6c 74 3b 4e 26 67  e.    <i>&lt;N&g
7cd0: 74 3b 3c 2f 69 3e 20 69 73 20 74 68 65 20 6d 61  t;</i> is the ma
7ce0: 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
7cf0: 69 6e 74 65 72 76 65 6e 69 6e 67 20 74 65 72 6d  intervening term
7d00: 73 20 61 6c 6c 6f 77 65 64 2e 0a 20 20 20 20 46  s allowed..    F
7d10: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 3c 2f 75 6c  or example:.</ul
7d20: 3e 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20  >..<codeblock>. 
7d30: 20 3c 69 3e 2d 2d 20 56 69 72 74 75 61 6c 20 74   <i>-- Virtual t
7d40: 61 62 6c 65 20 64 65 63 6c 61 72 61 74 69 6f 6e  able declaration
7d50: 2e 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45 20 56  .</i>.  CREATE V
7d60: 49 52 54 55 41 4c 20 54 41 42 4c 45 20 64 6f 63  IRTUAL TABLE doc
7d70: 73 20 55 53 49 4e 47 20 66 74 73 34 28 29 3b 0a  s USING fts4();.
7d80: 0a 20 20 3c 69 3e 2d 2d 20 56 69 72 74 75 61 6c  .  <i>-- Virtual
7d90: 20 74 61 62 6c 65 20 64 61 74 61 2e 3c 2f 69 3e   table data.</i>
7da0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64  .  INSERT INTO d
7db0: 6f 63 73 20 56 41 4c 55 45 53 28 27 53 51 4c 69  ocs VALUES('SQLi
7dc0: 74 65 20 69 73 20 61 6e 20 41 43 49 44 20 63 6f  te is an ACID co
7dd0: 6d 70 6c 69 61 6e 74 20 65 6d 62 65 64 64 65 64  mpliant embedded
7de0: 20 72 65 6c 61 74 69 6f 6e 61 6c 20 64 61 74 61   relational data
7df0: 62 61 73 65 20 6d 61 6e 61 67 65 6d 65 6e 74 20  base management 
7e00: 73 79 73 74 65 6d 27 29 3b 0a 0a 20 20 3c 69 3e  system');..  <i>
7e10: 2d 2d 20 53 65 61 72 63 68 20 66 6f 72 20 61 20  -- Search for a 
7e20: 64 6f 63 75 6d 65 6e 74 20 74 68 61 74 20 63 6f  document that co
7e30: 6e 74 61 69 6e 73 20 74 68 65 20 74 65 72 6d 73  ntains the terms
7e40: 20 22 73 71 6c 69 74 65 22 20 61 6e 64 20 22 64   "sqlite" and "d
7e50: 61 74 61 62 61 73 65 22 20 77 69 74 68 3c 2f 69  atabase" with</i
7e60: 3e 0a 20 20 3c 69 3e 2d 2d 20 6e 6f 74 20 6d 6f  >.  <i>-- not mo
7e70: 72 65 20 74 68 61 6e 20 31 30 20 69 6e 74 65 72  re than 10 inter
7e80: 76 65 6e 69 6e 67 20 74 65 72 6d 73 2e 20 54 68  vening terms. Th
7e90: 69 73 20 6d 61 74 63 68 65 73 20 74 68 65 20 6f  is matches the o
7ea0: 6e 6c 79 20 64 6f 63 75 6d 65 6e 74 20 69 6e 3c  nly document in<
7eb0: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 61 62 6c  /i>.  <i>-- tabl
7ec0: 65 20 64 6f 63 73 20 28 73 69 6e 63 65 20 74 68  e docs (since th
7ed0: 65 72 65 20 61 72 65 20 6f 6e 6c 79 20 73 69 78  ere are only six
7ee0: 20 74 65 72 6d 73 20 62 65 74 77 65 65 6e 20 22   terms between "
7ef0: 53 51 4c 69 74 65 22 20 61 6e 64 20 22 64 61 74  SQLite" and "dat
7f00: 61 62 61 73 65 22 3c 2f 69 3e 20 0a 20 20 3c 69  abase"</i> .  <i
7f10: 3e 2d 2d 20 69 6e 20 74 68 65 20 64 6f 63 75 6d  >-- in the docum
7f20: 65 6e 74 29 3c 2f 69 3e 2e 0a 20 20 53 45 4c 45  ent)</i>..  SELE
7f30: 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57  CT * FROM docs W
7f40: 48 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20  HERE docs MATCH 
7f50: 27 73 71 6c 69 74 65 20 4e 45 41 52 20 64 61 74  'sqlite NEAR dat
7f60: 61 62 61 73 65 27 3b 0a 0a 20 20 3c 69 3e 2d 2d  abase';..  <i>--
7f70: 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 64 6f   Search for a do
7f80: 63 75 6d 65 6e 74 20 74 68 61 74 20 63 6f 6e 74  cument that cont
7f90: 61 69 6e 73 20 74 68 65 20 74 65 72 6d 73 20 22  ains the terms "
7fa0: 73 71 6c 69 74 65 22 20 61 6e 64 20 22 64 61 74  sqlite" and "dat
7fb0: 61 62 61 73 65 22 20 77 69 74 68 3c 2f 69 3e 0a  abase" with</i>.
7fc0: 20 20 3c 69 3e 2d 2d 20 6e 6f 74 20 6d 6f 72 65    <i>-- not more
7fd0: 20 74 68 61 6e 20 36 20 69 6e 74 65 72 76 65 6e   than 6 interven
7fe0: 69 6e 67 20 74 65 72 6d 73 2e 20 54 68 69 73 20  ing terms. This 
7ff0: 61 6c 73 6f 20 6d 61 74 63 68 65 73 20 74 68 65  also matches the
8000: 20 6f 6e 6c 79 20 64 6f 63 75 6d 65 6e 74 20 69   only document i
8010: 6e 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 61  n</i>.  <i>-- ta
8020: 62 6c 65 20 64 6f 63 73 2e 20 4e 6f 74 65 20 74  ble docs. Note t
8030: 68 61 74 20 74 68 65 20 6f 72 64 65 72 20 69 6e  hat the order in
8040: 20 77 68 69 63 68 20 74 68 65 20 74 65 72 6d 73   which the terms
8050: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 64   appear in the d
8060: 6f 63 75 6d 65 6e 74 3c 2f 69 3e 0a 20 20 3c 69  ocument</i>.  <i
8070: 3e 2d 2d 20 64 6f 65 73 20 6e 6f 74 20 68 61 76  >-- does not hav
8080: 65 20 74 6f 20 62 65 20 74 68 65 20 73 61 6d 65  e to be the same
8090: 20 61 73 20 74 68 65 20 6f 72 64 65 72 20 69 6e   as the order in
80a0: 20 77 68 69 63 68 20 74 68 65 79 20 61 70 70 65   which they appe
80b0: 61 72 20 69 6e 20 74 68 65 20 71 75 65 72 79 2e  ar in the query.
80c0: 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20  </i>.  SELECT * 
80d0: 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20  FROM docs WHERE 
80e0: 64 6f 63 73 20 4d 41 54 43 48 20 27 64 61 74 61  docs MATCH 'data
80f0: 62 61 73 65 20 4e 45 41 52 2f 36 20 73 71 6c 69  base NEAR/6 sqli
8100: 74 65 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 53 65  te';..  <i>-- Se
8110: 61 72 63 68 20 66 6f 72 20 61 20 64 6f 63 75 6d  arch for a docum
8120: 65 6e 74 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ent that contain
8130: 73 20 74 68 65 20 74 65 72 6d 73 20 22 73 71 6c  s the terms "sql
8140: 69 74 65 22 20 61 6e 64 20 22 64 61 74 61 62 61  ite" and "databa
8150: 73 65 22 20 77 69 74 68 3c 2f 69 3e 0a 20 20 3c  se" with</i>.  <
8160: 69 3e 2d 2d 20 6e 6f 74 20 6d 6f 72 65 20 74 68  i>-- not more th
8170: 61 6e 20 35 20 69 6e 74 65 72 76 65 6e 69 6e 67  an 5 intervening
8180: 20 74 65 72 6d 73 2e 20 54 68 69 73 20 71 75 65   terms. This que
8190: 72 79 20 6d 61 74 63 68 65 73 20 6e 6f 20 64 6f  ry matches no do
81a0: 63 75 6d 65 6e 74 73 2e 3c 2f 69 3e 0a 20 20 53  cuments.</i>.  S
81b0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63  ELECT * FROM doc
81c0: 73 20 57 48 45 52 45 20 64 6f 63 73 20 4d 41 54  s WHERE docs MAT
81d0: 43 48 20 27 64 61 74 61 62 61 73 65 20 4e 45 41  CH 'database NEA
81e0: 52 2f 35 20 73 71 6c 69 74 65 27 3b 0a 0a 20 20  R/5 sqlite';..  
81f0: 3c 69 3e 2d 2d 20 53 65 61 72 63 68 20 66 6f 72  <i>-- Search for
8200: 20 61 20 64 6f 63 75 6d 65 6e 74 20 74 68 61 74   a document that
8210: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 68   contains the ph
8220: 72 61 73 65 20 22 41 43 49 44 20 63 6f 6d 70 6c  rase "ACID compl
8230: 69 61 6e 74 22 20 61 6e 64 20 74 68 65 20 74 65  iant" and the te
8240: 72 6d 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 22  rm</i>.  <i>-- "
8250: 64 61 74 61 62 61 73 65 22 20 77 69 74 68 20 6e  database" with n
8260: 6f 74 20 6d 6f 72 65 20 74 68 61 6e 20 32 20 74  ot more than 2 t
8270: 65 72 6d 73 20 73 65 70 61 72 61 74 69 6e 67 20  erms separating 
8280: 74 68 65 20 74 77 6f 2e 20 54 68 69 73 20 6d 61  the two. This ma
8290: 74 63 68 65 73 20 74 68 65 3c 2f 69 3e 0a 20 20  tches the</i>.  
82a0: 3c 69 3e 2d 2d 20 64 6f 63 75 6d 65 6e 74 20 73  <i>-- document s
82b0: 74 6f 72 65 64 20 69 6e 20 74 61 62 6c 65 20 64  tored in table d
82c0: 6f 63 73 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43  ocs.</i>.  SELEC
82d0: 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48  T * FROM docs WH
82e0: 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27  ERE docs MATCH '
82f0: 64 61 74 61 62 61 73 65 20 4e 45 41 52 2f 32 20  database NEAR/2 
8300: 22 41 43 49 44 20 63 6f 6d 70 6c 69 61 6e 74 22  "ACID compliant"
8310: 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 53 65 61 72  ';..  <i>-- Sear
8320: 63 68 20 66 6f 72 20 61 20 64 6f 63 75 6d 65 6e  ch for a documen
8330: 74 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  t that contains 
8340: 74 68 65 20 70 68 72 61 73 65 20 22 41 43 49 44  the phrase "ACID
8350: 20 63 6f 6d 70 6c 69 61 6e 74 22 20 61 6e 64 20   compliant" and 
8360: 74 68 65 20 74 65 72 6d 3c 2f 69 3e 0a 20 20 3c  the term</i>.  <
8370: 69 3e 2d 2d 20 22 73 71 6c 69 74 65 22 20 77 69  i>-- "sqlite" wi
8380: 74 68 20 6e 6f 74 20 6d 6f 72 65 20 74 68 61 6e  th not more than
8390: 20 32 20 74 65 72 6d 73 20 73 65 70 61 72 61 74   2 terms separat
83a0: 69 6e 67 20 74 68 65 20 74 77 6f 2e 20 54 68 69  ing the two. Thi
83b0: 73 20 61 6c 73 6f 20 6d 61 74 63 68 65 73 3c 2f  s also matches</
83c0: 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 68 65 20 6f  i>.  <i>-- the o
83d0: 6e 6c 79 20 64 6f 63 75 6d 65 6e 74 20 73 74 6f  nly document sto
83e0: 72 65 64 20 69 6e 20 74 61 62 6c 65 20 64 6f 63  red in table doc
83f0: 73 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20  s.</i>.  SELECT 
8400: 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52  * FROM docs WHER
8410: 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27 22 41  E docs MATCH '"A
8420: 43 49 44 20 63 6f 6d 70 6c 69 61 6e 74 22 20 4e  CID compliant" N
8430: 45 41 52 2f 32 20 73 71 6c 69 74 65 27 3b 0a 3c  EAR/2 sqlite';.<
8440: 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 75 6c  /codeblock>..<ul
8450: 3e 0a 20 20 3c 6c 69 20 73 74 79 6c 65 3d 22 6c  >.  <li style="l
8460: 69 73 74 2d 73 74 79 6c 65 3a 20 6e 6f 6e 65 22  ist-style: none"
8470: 3e 3c 70 3e 0a 20 20 20 20 4d 6f 72 65 20 74 68  ><p>.    More th
8480: 61 6e 20 6f 6e 65 20 4e 45 41 52 20 6f 70 65 72  an one NEAR oper
8490: 61 74 6f 72 20 6d 61 79 20 61 70 70 65 61 72 20  ator may appear 
84a0: 69 6e 20 61 20 73 69 6e 67 6c 65 20 71 75 65 72  in a single quer
84b0: 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  y. In this case 
84c0: 65 61 63 68 0a 20 20 20 20 70 61 69 72 20 6f 66  each.    pair of
84d0: 20 74 65 72 6d 73 20 6f 72 20 70 68 72 61 73 65   terms or phrase
84e0: 73 20 73 65 70 61 72 61 74 65 64 20 62 79 20 61  s separated by a
84f0: 20 4e 45 41 52 20 6f 70 65 72 61 74 6f 72 20 6d   NEAR operator m
8500: 75 73 74 20 61 70 70 65 61 72 20 77 69 74 68 69  ust appear withi
8510: 6e 20 74 68 65 0a 20 20 20 20 73 70 65 63 69 66  n the.    specif
8520: 69 65 64 20 70 72 6f 78 69 6d 69 74 79 20 6f 66  ied proximity of
8530: 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e 20 74   each other in t
8540: 68 65 20 64 6f 63 75 6d 65 6e 74 2e 20 55 73 69  he document. Usi
8550: 6e 67 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c  ng the same tabl
8560: 65 20 61 6e 64 0a 20 20 20 20 64 61 74 61 20 61  e and.    data a
8570: 73 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 6f  s in the block o
8580: 66 20 65 78 61 6d 70 6c 65 73 20 61 62 6f 76 65  f examples above
8590: 3a 0a 3c 2f 75 6c 3e 0a 0a 3c 63 6f 64 65 62 6c  :.</ul>..<codebl
85a0: 6f 63 6b 3e 20 0a 20 3c 69 3e 2d 2d 20 54 68 65  ock> . <i>-- The
85b0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72 79   following query
85c0: 20 73 65 6c 65 63 74 73 20 64 6f 63 75 6d 65 6e   selects documen
85d0: 74 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ts that contains
85e0: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
85f0: 74 68 65 20 74 65 72 6d 20 3c 2f 69 3e 0a 20 20  the term </i>.  
8600: 3c 69 3e 2d 2d 20 22 73 71 6c 69 74 65 22 20 73  <i>-- "sqlite" s
8610: 65 70 61 72 61 74 65 64 20 62 79 20 74 77 6f 20  eparated by two 
8620: 6f 72 20 66 65 77 65 72 20 74 65 72 6d 73 20 66  or fewer terms f
8630: 72 6f 6d 20 61 6e 20 69 6e 73 74 61 6e 63 65 20  rom an instance 
8640: 6f 66 20 74 68 65 20 74 65 72 6d 20 22 61 63 69  of the term "aci
8650: 64 22 2c 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20  d",</i>.  <i>-- 
8660: 77 68 69 63 68 20 69 73 20 69 6e 20 74 75 72 6e  which is in turn
8670: 20 73 65 70 61 72 61 74 65 64 20 62 79 20 74 77   separated by tw
8680: 6f 20 6f 72 20 66 65 77 65 72 20 74 65 72 6d 73  o or fewer terms
8690: 20 66 72 6f 6d 20 61 6e 20 69 6e 73 74 61 6e 63   from an instanc
86a0: 65 20 6f 66 20 74 68 65 20 74 65 72 6d 3c 2f 69  e of the term</i
86b0: 3e 0a 20 20 3c 69 3e 2d 2d 20 22 72 65 6c 61 74  >.  <i>-- "relat
86c0: 69 6f 6e 61 6c 22 2e 20 41 73 20 69 74 20 68 61  ional". As it ha
86d0: 70 70 65 6e 73 2c 20 74 68 65 20 6f 6e 6c 79 20  ppens, the only 
86e0: 64 6f 63 75 6d 65 6e 74 20 69 6e 20 74 61 62 6c  document in tabl
86f0: 65 20 64 6f 63 73 20 73 61 74 69 73 66 69 65 73  e docs satisfies
8700: 20 74 68 69 73 20 63 72 69 74 65 72 69 61 2e 3c   this criteria.<
8710: 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  /i>.  SELECT * F
8720: 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20 64  ROM docs WHERE d
8730: 6f 63 73 20 4d 41 54 43 48 20 27 73 71 6c 69 74  ocs MATCH 'sqlit
8740: 65 20 4e 45 41 52 2f 32 20 61 63 69 64 20 4e 45  e NEAR/2 acid NE
8750: 41 52 2f 32 20 72 65 6c 61 74 69 6f 6e 61 6c 27  AR/2 relational'
8760: 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68 69 73 20  ;..  <i>-- This 
8770: 71 75 65 72 79 20 6d 61 74 63 68 65 73 20 6e 6f  query matches no
8780: 20 64 6f 63 75 6d 65 6e 74 73 2e 20 54 68 65 72   documents. Ther
8790: 65 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  e is an instance
87a0: 20 6f 66 20 74 68 65 20 74 65 72 6d 20 22 73 71   of the term "sq
87b0: 6c 69 74 65 22 20 77 69 74 68 3c 2f 69 3e 0a 20  lite" with</i>. 
87c0: 20 3c 69 3e 2d 2d 20 73 75 66 66 69 63 69 65 6e   <i>-- sufficien
87d0: 74 20 70 72 6f 78 69 6d 69 74 79 20 74 6f 20 61  t proximity to a
87e0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 22 61  n instance of "a
87f0: 63 69 64 22 20 62 75 74 20 69 74 20 69 73 20 6e  cid" but it is n
8800: 6f 74 20 73 75 66 66 69 63 69 65 6e 74 6c 79 20  ot sufficiently 
8810: 63 6c 6f 73 65 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  close</i>.  <i>-
8820: 2d 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65  - to an instance
8830: 20 6f 66 20 74 68 65 20 74 65 72 6d 20 22 72 65   of the term "re
8840: 6c 61 74 69 6f 6e 61 6c 22 2e 3c 2f 69 3e 0a 20  lational".</i>. 
8850: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64   SELECT * FROM d
8860: 6f 63 73 20 57 48 45 52 45 20 64 6f 63 73 20 4d  ocs WHERE docs M
8870: 41 54 43 48 20 27 61 63 69 64 20 4e 45 41 52 2f  ATCH 'acid NEAR/
8880: 32 20 73 71 6c 69 74 65 20 4e 45 41 52 2f 32 20  2 sqlite NEAR/2 
8890: 72 65 6c 61 74 69 6f 6e 61 6c 27 3b 0a 3c 2f 63  relational';.</c
88a0: 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20  odeblock>..<p>. 
88b0: 20 50 68 72 61 73 65 20 61 6e 64 20 4e 45 41 52   Phrase and NEAR
88c0: 20 71 75 65 72 69 65 73 20 6d 61 79 20 6e 6f 74   queries may not
88d0: 20 73 70 61 6e 20 6d 75 6c 74 69 70 6c 65 20 63   span multiple c
88e0: 6f 6c 75 6d 6e 73 20 77 69 74 68 69 6e 20 61 20  olumns within a 
88f0: 72 6f 77 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20  row...<p>.  The 
8900: 74 68 72 65 65 20 62 61 73 69 63 20 71 75 65 72  three basic quer
8910: 79 20 74 79 70 65 73 20 64 65 73 63 72 69 62 65  y types describe
8920: 64 20 61 62 6f 76 65 20 6d 61 79 20 62 65 20 75  d above may be u
8930: 73 65 64 20 74 6f 20 71 75 65 72 79 20 74 68 65  sed to query the
8940: 20 66 75 6c 6c 2d 74 65 78 74 0a 20 20 69 6e 64   full-text.  ind
8950: 65 78 20 66 6f 72 20 74 68 65 20 73 65 74 20 6f  ex for the set o
8960: 66 20 64 6f 63 75 6d 65 6e 74 73 20 74 68 61 74  f documents that
8970: 20 6d 61 74 63 68 20 74 68 65 20 73 70 65 63 69   match the speci
8980: 66 69 65 64 20 63 72 69 74 65 72 69 61 2e 20 55  fied criteria. U
8990: 73 69 6e 67 20 74 68 65 0a 20 20 46 54 53 20 71  sing the.  FTS q
89a0: 75 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20  uery expression 
89b0: 6c 61 6e 67 75 61 67 65 20 69 74 20 69 73 20 70  language it is p
89c0: 6f 73 73 69 62 6c 65 20 74 6f 20 70 65 72 66 6f  ossible to perfo
89d0: 72 6d 20 76 61 72 69 6f 75 73 20 73 65 74 20 0a  rm various set .
89e0: 20 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20    operations on 
89f0: 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 62  the results of b
8a00: 61 73 69 63 20 71 75 65 72 69 65 73 2e 20 54 68  asic queries. Th
8a10: 65 72 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c  ere are currentl
8a20: 79 20 74 68 72 65 65 20 0a 20 20 73 75 70 70 6f  y three .  suppo
8a30: 72 74 65 64 20 6f 70 65 72 61 74 69 6f 6e 73 3a  rted operations:
8a40: 0a 0a 3c 75 6c 3e 0a 20 20 3c 6c 69 3e 20 54 68  ..<ul>.  <li> Th
8a50: 65 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 20 64  e AND operator d
8a60: 65 74 65 72 6d 69 6e 65 73 20 74 68 65 20 3c 62  etermines the <b
8a70: 3e 69 6e 74 65 72 73 65 63 74 69 6f 6e 3c 2f 62  >intersection</b
8a80: 3e 20 6f 66 20 74 77 6f 20 73 65 74 73 20 6f 66  > of two sets of
8a90: 20 64 6f 63 75 6d 65 6e 74 73 2e 0a 0a 20 20 3c   documents...  <
8aa0: 6c 69 3e 20 54 68 65 20 4f 52 20 6f 70 65 72 61  li> The OR opera
8ab0: 74 6f 72 20 63 61 6c 63 75 6c 61 74 65 73 20 74  tor calculates t
8ac0: 68 65 20 3c 62 3e 75 6e 69 6f 6e 3c 2f 62 3e 20  he <b>union</b> 
8ad0: 6f 66 20 74 77 6f 20 73 65 74 73 20 6f 66 20 64  of two sets of d
8ae0: 6f 63 75 6d 65 6e 74 73 2e 0a 0a 20 20 3c 6c 69  ocuments...  <li
8af0: 3e 20 54 68 65 20 4e 4f 54 20 6f 70 65 72 61 74  > The NOT operat
8b00: 6f 72 20 28 6f 72 2c 20 69 66 20 75 73 69 6e 67  or (or, if using
8b10: 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 73 79   the standard sy
8b20: 6e 74 61 78 2c 20 61 20 75 6e 61 72 79 20 22 2d  ntax, a unary "-
8b30: 22 20 6f 70 65 72 61 74 6f 72 29 0a 20 20 20 20  " operator).    
8b40: 20 20 20 6d 61 79 20 62 65 20 75 73 65 64 20 74     may be used t
8b50: 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 3c 62  o compute the <b
8b60: 3e 72 65 6c 61 74 69 76 65 20 63 6f 6d 70 6c 65  >relative comple
8b70: 6d 65 6e 74 3c 2f 62 3e 20 6f 66 20 6f 6e 65 20  ment</b> of one 
8b80: 73 65 74 20 6f 66 0a 20 20 20 20 20 20 20 64 6f  set of.       do
8b90: 63 75 6d 65 6e 74 73 20 77 69 74 68 20 72 65 73  cuments with res
8ba0: 70 65 63 74 20 74 6f 20 61 6e 6f 74 68 65 72 2e  pect to another.
8bb0: 0a 3c 2f 75 6c 3e 0a 0a 3c 70 3e 0a 20 20 54 68  .</ul>..<p>.  Th
8bc0: 65 20 46 54 53 20 6d 6f 64 75 6c 65 73 20 6d 61  e FTS modules ma
8bd0: 79 20 62 65 20 63 6f 6d 70 69 6c 65 64 20 74 6f  y be compiled to
8be0: 20 75 73 65 20 6f 6e 65 20 6f 66 20 74 77 6f 20   use one of two 
8bf0: 73 6c 69 67 68 74 6c 79 20 64 69 66 66 65 72 65  slightly differe
8c00: 6e 74 20 76 65 72 73 69 6f 6e 73 0a 20 20 6f 66  nt versions.  of
8c10: 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 71   the full-text q
8c20: 75 65 72 79 20 73 79 6e 74 61 78 2c 20 74 68 65  uery syntax, the
8c30: 20 22 73 74 61 6e 64 61 72 64 22 20 71 75 65 72   "standard" quer
8c40: 79 20 73 79 6e 74 61 78 20 61 6e 64 20 74 68 65  y syntax and the
8c50: 20 22 65 6e 68 61 6e 63 65 64 22 20 0a 20 20 71   "enhanced" .  q
8c60: 75 65 72 79 20 73 79 6e 74 61 78 2e 20 54 68 65  uery syntax. The
8c70: 20 62 61 73 69 63 20 74 65 72 6d 2c 20 74 65 72   basic term, ter
8c80: 6d 2d 70 72 65 66 69 78 2c 20 70 68 72 61 73 65  m-prefix, phrase
8c90: 20 61 6e 64 20 4e 45 41 52 20 71 75 65 72 69 65   and NEAR querie
8ca0: 73 20 64 65 73 63 72 69 62 65 64 20 0a 20 20 61  s described .  a
8cb0: 62 6f 76 65 20 61 72 65 20 74 68 65 20 73 61 6d  bove are the sam
8cc0: 65 20 69 6e 20 62 6f 74 68 20 76 65 72 73 69 6f  e in both versio
8cd0: 6e 73 20 6f 66 20 74 68 65 20 73 79 6e 74 61 78  ns of the syntax
8ce0: 2e 20 54 68 65 20 77 61 79 20 69 6e 20 77 68 69  . The way in whi
8cf0: 63 68 20 73 65 74 20 0a 20 20 6f 70 65 72 61 74  ch set .  operat
8d00: 69 6f 6e 73 20 61 72 65 20 73 70 65 63 69 66 69  ions are specifi
8d10: 65 64 20 69 73 20 73 6c 69 67 68 74 6c 79 20 64  ed is slightly d
8d20: 69 66 66 65 72 65 6e 74 2e 20 54 68 65 20 66 6f  ifferent. The fo
8d30: 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 73 75 62 2d  llowing two sub-
8d40: 73 65 63 74 69 6f 6e 73 20 0a 20 20 64 65 73 63  sections .  desc
8d50: 72 69 62 65 20 74 68 65 20 70 61 72 74 20 6f 66  ribe the part of
8d60: 20 74 68 65 20 74 77 6f 20 71 75 65 72 79 20 73   the two query s
8d70: 79 6e 74 61 78 65 73 20 74 68 61 74 20 70 65 72  yntaxes that per
8d80: 74 61 69 6e 73 20 74 6f 20 73 65 74 20 6f 70 65  tains to set ope
8d90: 72 61 74 69 6f 6e 73 2e 20 0a 20 20 52 65 66 65  rations. .  Refe
8da0: 72 20 74 6f 20 74 68 65 20 64 65 73 63 72 69 70  r to the descrip
8db0: 74 69 6f 6e 20 6f 66 20 68 6f 77 20 74 6f 20 5b  tion of how to [
8dc0: 63 6f 6d 70 69 6c 65 20 66 74 73 5d 20 66 6f 72  compile fts] for
8dd0: 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6e 6f 74   compilation not
8de0: 65 73 2e 0a 0a 3c 68 32 20 74 61 67 73 3d 22 65  es...<h2 tags="e
8df0: 6e 68 61 6e 63 65 64 20 71 75 65 72 79 20 73 79  nhanced query sy
8e00: 6e 74 61 78 22 3e 0a 20 20 53 65 74 20 4f 70 65  ntax">.  Set Ope
8e10: 72 61 74 69 6f 6e 73 20 55 73 69 6e 67 20 54 68  rations Using Th
8e20: 65 20 45 6e 68 61 6e 63 65 64 20 51 75 65 72 79  e Enhanced Query
8e30: 20 53 79 6e 74 61 78 3c 2f 68 32 3e 0a 0a 3c 70   Syntax</h2>..<p
8e40: 3e 0a 20 20 54 68 65 20 65 6e 68 61 6e 63 65 64  >.  The enhanced
8e50: 20 71 75 65 72 79 20 73 79 6e 74 61 78 20 73 75   query syntax su
8e60: 70 70 6f 72 74 73 20 74 68 65 20 41 4e 44 2c 20  pports the AND, 
8e70: 4f 52 20 61 6e 64 20 4e 4f 54 20 62 69 6e 61 72  OR and NOT binar
8e80: 79 20 73 65 74 20 6f 70 65 72 61 74 6f 72 73 2e  y set operators.
8e90: 0a 20 20 45 61 63 68 20 6f 66 20 74 68 65 20 74  .  Each of the t
8ea0: 77 6f 20 6f 70 65 72 61 6e 64 73 20 74 6f 20 61  wo operands to a
8eb0: 6e 20 6f 70 65 72 61 74 6f 72 20 6d 61 79 20 62  n operator may b
8ec0: 65 20 61 20 62 61 73 69 63 20 46 54 53 20 71 75  e a basic FTS qu
8ed0: 65 72 79 2c 20 6f 72 20 74 68 65 0a 20 20 72 65  ery, or the.  re
8ee0: 73 75 6c 74 20 6f 66 20 61 6e 6f 74 68 65 72 20  sult of another 
8ef0: 41 4e 44 2c 20 4f 52 20 6f 72 20 4e 4f 54 20 73  AND, OR or NOT s
8f00: 65 74 20 6f 70 65 72 61 74 69 6f 6e 2e 20 4f 70  et operation. Op
8f10: 65 72 61 74 6f 72 73 20 6d 75 73 74 20 62 65 20  erators must be 
8f20: 65 6e 74 65 72 65 64 0a 20 20 75 73 69 6e 67 20  entered.  using 
8f30: 63 61 70 69 74 61 6c 20 6c 65 74 74 65 72 73 2e  capital letters.
8f40: 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 79   Otherwise, they
8f50: 20 61 72 65 20 69 6e 74 65 72 70 72 65 74 65 64   are interpreted
8f60: 20 61 73 20 62 61 73 69 63 20 74 65 72 6d 20 71   as basic term q
8f70: 75 65 72 69 65 73 0a 20 20 69 6e 73 74 65 61 64  ueries.  instead
8f80: 20 6f 66 20 73 65 74 20 6f 70 65 72 61 74 6f 72   of set operator
8f90: 73 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 41 4e  s...<p>.  The AN
8fa0: 44 20 6f 70 65 72 61 74 6f 72 20 6d 61 79 20 62  D operator may b
8fb0: 65 20 69 6d 70 6c 69 63 69 74 6c 79 20 73 70 65  e implicitly spe
8fc0: 63 69 66 69 65 64 2e 20 49 66 20 74 77 6f 20 62  cified. If two b
8fd0: 61 73 69 63 20 71 75 65 72 69 65 73 20 61 70 70  asic queries app
8fe0: 65 61 72 20 0a 20 20 77 69 74 68 20 6e 6f 20 6f  ear .  with no o
8ff0: 70 65 72 61 74 6f 72 20 73 65 70 61 72 61 74 69  perator separati
9000: 6e 67 20 74 68 65 6d 20 69 6e 20 61 6e 20 46 54  ng them in an FT
9010: 53 20 71 75 65 72 79 20 73 74 72 69 6e 67 2c 20  S query string, 
9020: 74 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 0a  the results are.
9030: 20 20 74 68 65 20 73 61 6d 65 20 61 73 20 69 66    the same as if
9040: 20 74 68 65 20 74 77 6f 20 62 61 73 69 63 20 71   the two basic q
9050: 75 65 72 69 65 73 20 77 65 72 65 20 73 65 70 61  ueries were sepa
9060: 72 61 74 65 64 20 62 79 20 61 6e 20 41 4e 44 20  rated by an AND 
9070: 6f 70 65 72 61 74 6f 72 2e 0a 20 20 46 6f 72 20  operator..  For 
9080: 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 71 75 65  example, the que
9090: 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 22 69  ry expression "i
90a0: 6d 70 6c 69 63 69 74 20 6f 70 65 72 61 74 6f 72  mplicit operator
90b0: 22 20 69 73 20 61 20 6d 6f 72 65 20 73 75 63 63  " is a more succ
90c0: 69 6e 63 74 0a 20 20 76 65 72 73 69 6f 6e 20 6f  inct.  version o
90d0: 66 20 22 69 6d 70 6c 69 63 69 74 20 41 4e 44 20  f "implicit AND 
90e0: 6f 70 65 72 61 74 6f 72 22 2e 0a 0a 3c 63 6f 64  operator"...<cod
90f0: 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d 20  eblock>.  <i>-- 
9100: 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 64 65  Virtual table de
9110: 63 6c 61 72 61 74 69 6f 6e 3c 2f 69 3e 0a 20 20  claration</i>.  
9120: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
9130: 41 42 4c 45 20 64 6f 63 73 20 55 53 49 4e 47 20  ABLE docs USING 
9140: 66 74 73 33 28 29 3b 0a 0a 20 20 3c 69 3e 2d 2d  fts3();..  <i>--
9150: 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 64   Virtual table d
9160: 61 74 61 3c 2f 69 3e 0a 20 20 49 4e 53 45 52 54  ata</i>.  INSERT
9170: 20 49 4e 54 4f 20 64 6f 63 73 28 64 6f 63 69 64   INTO docs(docid
9180: 2c 20 63 6f 6e 74 65 6e 74 29 20 56 41 4c 55 45  , content) VALUE
9190: 53 28 31 2c 20 27 61 20 64 61 74 61 62 61 73 65  S(1, 'a database
91a0: 20 69 73 20 61 20 73 6f 66 74 77 61 72 65 20 73   is a software s
91b0: 79 73 74 65 6d 27 29 3b 0a 20 20 49 4e 53 45 52  ystem');.  INSER
91c0: 54 20 49 4e 54 4f 20 64 6f 63 73 28 64 6f 63 69  T INTO docs(doci
91d0: 64 2c 20 63 6f 6e 74 65 6e 74 29 20 56 41 4c 55  d, content) VALU
91e0: 45 53 28 32 2c 20 27 73 71 6c 69 74 65 20 69 73  ES(2, 'sqlite is
91f0: 20 61 20 73 6f 66 74 77 61 72 65 20 73 79 73 74   a software syst
9200: 65 6d 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  em');.  INSERT I
9210: 4e 54 4f 20 64 6f 63 73 28 64 6f 63 69 64 2c 20  NTO docs(docid, 
9220: 63 6f 6e 74 65 6e 74 29 20 56 41 4c 55 45 53 28  content) VALUES(
9230: 33 2c 20 27 73 71 6c 69 74 65 20 69 73 20 61 20  3, 'sqlite is a 
9240: 64 61 74 61 62 61 73 65 27 29 3b 0a 0a 20 20 3c  database');..  <
9250: 69 3e 2d 2d 20 52 65 74 75 72 6e 20 74 68 65 20  i>-- Return the 
9260: 73 65 74 20 6f 66 20 64 6f 63 75 6d 65 6e 74 73  set of documents
9270: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 74 68   that contain th
9280: 65 20 74 65 72 6d 20 22 73 71 6c 69 74 65 22 2c  e term "sqlite",
9290: 20 61 6e 64 20 74 68 65 3c 2f 69 3e 0a 20 20 3c   and the</i>.  <
92a0: 69 3e 2d 2d 20 74 65 72 6d 20 22 64 61 74 61 62  i>-- term "datab
92b0: 61 73 65 22 2e 20 54 68 69 73 20 71 75 65 72 79  ase". This query
92c0: 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 74 68 65   will return the
92d0: 20 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 64   document with d
92e0: 6f 63 69 64 20 33 20 6f 6e 6c 79 2e 3c 2f 69 3e  ocid 3 only.</i>
92f0: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
9300: 20 64 6f 63 73 20 57 48 45 52 45 20 64 6f 63 73   docs WHERE docs
9310: 20 4d 41 54 43 48 20 27 73 71 6c 69 74 65 20 41   MATCH 'sqlite A
9320: 4e 44 20 64 61 74 61 62 61 73 65 27 3b 0a 0a 20  ND database';.. 
9330: 20 3c 69 3e 2d 2d 20 41 67 61 69 6e 2c 20 72 65   <i>-- Again, re
9340: 74 75 72 6e 20 74 68 65 20 73 65 74 20 6f 66 20  turn the set of 
9350: 64 6f 63 75 6d 65 6e 74 73 20 74 68 61 74 20 63  documents that c
9360: 6f 6e 74 61 69 6e 20 62 6f 74 68 20 22 73 71 6c  ontain both "sql
9370: 69 74 65 22 20 61 6e 64 3c 2f 69 3e 0a 20 20 3c  ite" and</i>.  <
9380: 69 3e 2d 2d 20 22 64 61 74 61 62 61 73 65 22 2e  i>-- "database".
9390: 20 54 68 69 73 20 74 69 6d 65 2c 20 75 73 65 20   This time, use 
93a0: 61 6e 20 69 6d 70 6c 69 63 69 74 20 41 4e 44 20  an implicit AND 
93b0: 6f 70 65 72 61 74 6f 72 2e 20 41 67 61 69 6e 2c  operator. Again,
93c0: 20 64 6f 63 75 6d 65 6e 74 3c 2f 69 3e 0a 20 20   document</i>.  
93d0: 3c 69 3e 2d 2d 20 33 20 69 73 20 74 68 65 20 6f  <i>-- 3 is the o
93e0: 6e 6c 79 20 64 6f 63 75 6d 65 6e 74 20 6d 61 74  nly document mat
93f0: 63 68 65 64 20 62 79 20 74 68 69 73 20 71 75 65  ched by this que
9400: 72 79 2e 20 3c 2f 69 3e 0a 20 20 53 45 4c 45 43  ry. </i>.  SELEC
9410: 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48  T * FROM docs WH
9420: 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27  ERE docs MATCH '
9430: 64 61 74 61 62 61 73 65 20 73 71 6c 69 74 65 27  database sqlite'
9440: 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 51 75 65 72 79  ;..  <i>-- Query
9450: 20 66 6f 72 20 74 68 65 20 73 65 74 20 6f 66 20   for the set of 
9460: 64 6f 63 75 6d 65 6e 74 73 20 74 68 61 74 20 63  documents that c
9470: 6f 6e 74 61 69 6e 73 20 65 69 74 68 65 72 20 22  ontains either "
9480: 73 71 6c 69 74 65 22 20 6f 72 20 22 64 61 74 61  sqlite" or "data
9490: 62 61 73 65 22 2e 3c 2f 69 3e 0a 20 20 3c 69 3e  base".</i>.  <i>
94a0: 2d 2d 20 41 6c 6c 20 74 68 72 65 65 20 64 6f 63  -- All three doc
94b0: 75 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 64 61  uments in the da
94c0: 74 61 62 61 73 65 20 61 72 65 20 6d 61 74 63 68  tabase are match
94d0: 65 64 20 62 79 20 74 68 69 73 20 71 75 65 72 79  ed by this query
94e0: 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a  .</i>.  SELECT *
94f0: 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45   FROM docs WHERE
9500: 20 64 6f 63 73 20 4d 41 54 43 48 20 27 73 71 6c   docs MATCH 'sql
9510: 69 74 65 20 4f 52 20 64 61 74 61 62 61 73 65 27  ite OR database'
9520: 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 51 75 65 72 79  ;..  <i>-- Query
9530: 20 66 6f 72 20 61 6c 6c 20 64 6f 63 75 6d 65 6e   for all documen
9540: 74 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20  ts that contain 
9550: 74 68 65 20 74 65 72 6d 20 22 64 61 74 61 62 61  the term "databa
9560: 73 65 22 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20  se", but do not 
9570: 63 6f 6e 74 61 69 6e 3c 2f 69 3e 0a 20 20 3c 69  contain</i>.  <i
9580: 3e 2d 2d 20 74 68 65 20 74 65 72 6d 20 22 73 71  >-- the term "sq
9590: 6c 69 74 65 22 2e 20 44 6f 63 75 6d 65 6e 74 20  lite". Document 
95a0: 31 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 64 6f  1 is the only do
95b0: 63 75 6d 65 6e 74 20 74 68 61 74 20 6d 61 74 63  cument that matc
95c0: 68 65 73 20 74 68 69 73 20 63 72 69 74 65 72 69  hes this criteri
95d0: 61 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20  a.</i>.  SELECT 
95e0: 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52  * FROM docs WHER
95f0: 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27 64 61  E docs MATCH 'da
9600: 74 61 62 61 73 65 20 4e 4f 54 20 73 71 6c 69 74  tabase NOT sqlit
9610: 65 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68 65  e';..  <i>-- The
9620: 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72 79   following query
9630: 20 6d 61 74 63 68 65 73 20 6e 6f 20 64 6f 63 75   matches no docu
9640: 6d 65 6e 74 73 2e 20 42 65 63 61 75 73 65 20 22  ments. Because "
9650: 61 6e 64 22 20 69 73 20 69 6e 20 6c 6f 77 65 72  and" is in lower
9660: 63 61 73 65 20 6c 65 74 74 65 72 73 2c 3c 2f 69  case letters,</i
9670: 3e 0a 20 20 3c 69 3e 2d 2d 20 69 74 20 69 73 20  >.  <i>-- it is 
9680: 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61  interpreted as a
9690: 20 62 61 73 69 63 20 74 65 72 6d 20 71 75 65 72   basic term quer
96a0: 79 20 69 6e 73 74 65 61 64 20 6f 66 20 61 6e 20  y instead of an 
96b0: 6f 70 65 72 61 74 6f 72 2e 20 4f 70 65 72 61 74  operator. Operat
96c0: 6f 72 73 20 6d 75 73 74 3c 2f 69 3e 0a 20 20 3c  ors must</i>.  <
96d0: 69 3e 2d 2d 20 62 65 20 73 70 65 63 69 66 69 65  i>-- be specifie
96e0: 64 20 75 73 69 6e 67 20 63 61 70 69 74 61 6c 20  d using capital 
96f0: 6c 65 74 74 65 72 73 2e 20 49 6e 20 70 72 61 63  letters. In prac
9700: 74 69 63 65 2c 20 74 68 69 73 20 71 75 65 72 79  tice, this query
9710: 20 77 69 6c 6c 20 6d 61 74 63 68 20 61 6e 79 20   will match any 
9720: 64 6f 63 75 6d 65 6e 74 73 3c 2f 69 3e 0a 20 20  documents</i>.  
9730: 3c 69 3e 2d 2d 20 74 68 61 74 20 63 6f 6e 74 61  <i>-- that conta
9740: 69 6e 20 65 61 63 68 20 6f 66 20 74 68 65 20 74  in each of the t
9750: 68 72 65 65 20 74 65 72 6d 73 20 22 64 61 74 61  hree terms "data
9760: 62 61 73 65 22 2c 20 22 61 6e 64 22 20 61 6e 64  base", "and" and
9770: 20 22 73 71 6c 69 74 65 22 20 61 74 20 6c 65 61   "sqlite" at lea
9780: 73 74 20 6f 6e 63 65 2e 3c 2f 69 3e 0a 20 20 3c  st once.</i>.  <
9790: 69 3e 2d 2d 20 4e 6f 20 64 6f 63 75 6d 65 6e 74  i>-- No document
97a0: 73 20 69 6e 20 74 68 65 20 65 78 61 6d 70 6c 65  s in the example
97b0: 20 64 61 74 61 20 61 62 6f 76 65 20 6d 61 74 63   data above matc
97c0: 68 20 74 68 69 73 20 63 72 69 74 65 72 69 61 2e  h this criteria.
97d0: 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20  </i>.  SELECT * 
97e0: 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20  FROM docs WHERE 
97f0: 64 6f 63 73 20 4d 41 54 43 48 20 27 64 61 74 61  docs MATCH 'data
9800: 62 61 73 65 20 61 6e 64 20 73 71 6c 69 74 65 27  base and sqlite'
9810: 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a  ;.</codeblock>..
9820: 3c 70 3e 0a 20 20 54 68 65 20 65 78 61 6d 70 6c  <p>.  The exampl
9830: 65 73 20 61 62 6f 76 65 20 61 6c 6c 20 75 73 65  es above all use
9840: 20 62 61 73 69 63 20 66 75 6c 6c 2d 74 65 78 74   basic full-text
9850: 20 74 65 72 6d 20 71 75 65 72 69 65 73 20 61 73   term queries as
9860: 20 62 6f 74 68 20 6f 70 65 72 61 6e 64 73 20 6f   both operands o
9870: 66 20 0a 20 20 74 68 65 20 73 65 74 20 6f 70 65  f .  the set ope
9880: 72 61 74 69 6f 6e 73 20 64 65 6d 6f 6e 73 74 72  rations demonstr
9890: 61 74 65 64 2e 20 50 68 72 61 73 65 20 61 6e 64  ated. Phrase and
98a0: 20 4e 45 41 52 20 71 75 65 72 69 65 73 20 6d 61   NEAR queries ma
98b0: 79 20 61 6c 73 6f 20 62 65 20 75 73 65 64 2c 0a  y also be used,.
98c0: 20 20 61 73 20 6d 61 79 20 74 68 65 20 72 65 73    as may the res
98d0: 75 6c 74 73 20 6f 66 20 6f 74 68 65 72 20 73 65  ults of other se
98e0: 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 57 68  t operations. Wh
98f0: 65 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  en more than one
9900: 20 73 65 74 20 6f 70 65 72 61 74 69 6f 6e 0a 20   set operation. 
9910: 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 61   is present in a
9920: 6e 20 46 54 53 20 71 75 65 72 79 2c 20 74 68 65  n FTS query, the
9930: 20 70 72 65 63 65 64 65 6e 63 65 20 6f 66 20 6f   precedence of o
9940: 70 65 72 61 74 6f 72 73 20 69 73 20 61 73 20 66  perators is as f
9950: 6f 6c 6c 6f 77 73 3a 0a 0a 3c 74 61 62 6c 65 20  ollows:..<table 
9960: 73 74 72 69 70 65 64 3d 31 3e 0a 20 20 3c 74 72  striped=1>.  <tr
9970: 3e 3c 74 68 3e 4f 70 65 72 61 74 6f 72 3c 74 68  ><th>Operator<th
9980: 3e 45 6e 68 61 6e 63 65 64 20 51 75 65 72 79 20  >Enhanced Query 
9990: 53 79 6e 74 61 78 20 50 72 65 63 65 64 65 6e 63  Syntax Precedenc
99a0: 65 0a 20 20 3c 74 72 3e 3c 74 64 3e 4e 4f 54 20  e.  <tr><td>NOT 
99b0: 3c 74 64 3e 20 48 69 67 68 65 73 74 20 70 72 65  <td> Highest pre
99c0: 63 65 64 65 6e 63 65 20 28 74 69 67 68 74 65 73  cedence (tightes
99d0: 74 20 67 72 6f 75 70 69 6e 67 29 2e 0a 20 20 3c  t grouping)..  <
99e0: 74 72 3e 3c 74 64 3e 41 4e 44 20 3c 74 64 3e 0a  tr><td>AND <td>.
99f0: 20 20 3c 74 72 3e 3c 74 64 3e 4f 52 20 20 3c 74    <tr><td>OR  <t
9a00: 64 3e 20 4c 6f 77 65 73 74 20 70 72 65 63 65 64  d> Lowest preced
9a10: 65 6e 63 65 20 28 6c 6f 6f 73 65 73 74 20 67 72  ence (loosest gr
9a20: 6f 75 70 69 6e 67 29 2e 0a 3c 2f 74 61 62 6c 65  ouping)..</table
9a30: 3e 0a 0a 3c 70 3e 0a 20 20 57 68 65 6e 20 75 73  >..<p>.  When us
9a40: 69 6e 67 20 74 68 65 20 65 6e 68 61 6e 63 65 64  ing the enhanced
9a50: 20 71 75 65 72 79 20 73 79 6e 74 61 78 2c 20 70   query syntax, p
9a60: 61 72 65 6e 74 68 65 73 69 73 20 6d 61 79 20 62  arenthesis may b
9a70: 65 20 75 73 65 64 20 74 6f 20 6f 76 65 72 72 69  e used to overri
9a80: 64 65 0a 20 20 74 68 65 20 64 65 66 61 75 6c 74  de.  the default
9a90: 20 70 72 65 63 65 64 65 6e 63 65 20 6f 66 20 74   precedence of t
9aa0: 68 65 20 76 61 72 69 6f 75 73 20 6f 70 65 72 61  he various opera
9ab0: 74 6f 72 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c  tors. For exampl
9ac0: 65 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a  e:..<codeblock>.
9ad0: 0a 20 20 3c 69 3e 2d 2d 20 52 65 74 75 72 6e 20  .  <i>-- Return 
9ae0: 74 68 65 20 64 6f 63 69 64 20 76 61 6c 75 65 73  the docid values
9af0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
9b00: 20 61 6c 6c 20 64 6f 63 75 6d 65 6e 74 73 20 74   all documents t
9b10: 68 61 74 20 63 6f 6e 74 61 69 6e 20 74 68 65 3c  hat contain the<
9b20: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 77 6f 20  /i>.  <i>-- two 
9b30: 74 65 72 6d 73 20 22 73 71 6c 69 74 65 22 20 61  terms "sqlite" a
9b40: 6e 64 20 22 64 61 74 61 62 61 73 65 22 2c 20 61  nd "database", a
9b50: 6e 64 2f 6f 72 20 63 6f 6e 74 61 69 6e 20 74 68  nd/or contain th
9b60: 65 20 74 65 72 6d 20 22 6c 69 62 72 61 72 79 22  e term "library"
9b70: 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 64  .</i>.  SELECT d
9b80: 6f 63 69 64 20 46 52 4f 4d 20 64 6f 63 73 20 57  ocid FROM docs W
9b90: 48 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20  HERE docs MATCH 
9ba0: 27 73 71 6c 69 74 65 20 41 4e 44 20 64 61 74 61  'sqlite AND data
9bb0: 62 61 73 65 20 4f 52 20 6c 69 62 72 61 72 79 27  base OR library'
9bc0: 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68 69 73 20  ;..  <i>-- This 
9bd0: 71 75 65 72 79 20 69 73 20 65 71 75 69 76 61 6c  query is equival
9be0: 65 6e 74 20 74 6f 20 74 68 65 20 61 62 6f 76 65  ent to the above
9bf0: 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 64  .</i>.  SELECT d
9c00: 6f 63 69 64 20 46 52 4f 4d 20 64 6f 63 73 20 57  ocid FROM docs W
9c10: 48 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20  HERE docs MATCH 
9c20: 27 73 71 6c 69 74 65 20 41 4e 44 20 64 61 74 61  'sqlite AND data
9c30: 62 61 73 65 27 0a 20 20 20 20 55 4e 49 4f 4e 0a  base'.    UNION.
9c40: 20 20 53 45 4c 45 43 54 20 64 6f 63 69 64 20 46    SELECT docid F
9c50: 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20 64  ROM docs WHERE d
9c60: 6f 63 73 20 4d 41 54 43 48 20 27 6c 69 62 72 61  ocs MATCH 'libra
9c70: 72 79 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 51 75  ry';..  <i>-- Qu
9c80: 65 72 79 20 66 6f 72 20 74 68 65 20 73 65 74 20  ery for the set 
9c90: 6f 66 20 64 6f 63 75 6d 65 6e 74 73 20 74 68 61  of documents tha
9ca0: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74  t contains the t
9cb0: 65 72 6d 20 22 6c 69 6e 75 78 22 2c 20 61 6e 64  erm "linux", and
9cc0: 20 61 74 20 6c 65 61 73 74 3c 2f 69 3e 0a 20 20   at least</i>.  
9cd0: 3c 69 3e 2d 2d 20 6f 6e 65 20 6f 66 20 74 68 65  <i>-- one of the
9ce0: 20 70 68 72 61 73 65 73 20 22 73 71 6c 69 74 65   phrases "sqlite
9cf0: 20 64 61 74 61 62 61 73 65 22 20 61 6e 64 20 22   database" and "
9d00: 73 71 6c 69 74 65 20 6c 69 62 72 61 72 79 22 2e  sqlite library".
9d10: 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 64 6f  </i>.  SELECT do
9d20: 63 69 64 20 46 52 4f 4d 20 64 6f 63 73 20 57 48  cid FROM docs WH
9d30: 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27  ERE docs MATCH '
9d40: 28 22 73 71 6c 69 74 65 20 64 61 74 61 62 61 73  ("sqlite databas
9d50: 65 22 20 4f 52 20 22 73 71 6c 69 74 65 20 6c 69  e" OR "sqlite li
9d60: 62 72 61 72 79 22 29 20 41 4e 44 20 6c 69 6e 75  brary") AND linu
9d70: 78 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68 69  x';..  <i>-- Thi
9d80: 73 20 71 75 65 72 79 20 69 73 20 65 71 75 69 76  s query is equiv
9d90: 61 6c 65 6e 74 20 74 6f 20 74 68 65 20 61 62 6f  alent to the abo
9da0: 76 65 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54  ve.</i>.  SELECT
9db0: 20 64 6f 63 69 64 20 46 52 4f 4d 20 64 6f 63 73   docid FROM docs
9dc0: 20 57 48 45 52 45 20 64 6f 63 73 20 4d 41 54 43   WHERE docs MATC
9dd0: 48 20 27 6c 69 6e 75 78 27 0a 20 20 20 20 49 4e  H 'linux'.    IN
9de0: 54 45 52 53 45 43 54 0a 20 20 53 45 4c 45 43 54  TERSECT.  SELECT
9df0: 20 64 6f 63 69 64 20 46 52 4f 4d 20 28 0a 20 20   docid FROM (.  
9e00: 20 20 53 45 4c 45 43 54 20 64 6f 63 69 64 20 46    SELECT docid F
9e10: 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20 64  ROM docs WHERE d
9e20: 6f 63 73 20 4d 41 54 43 48 20 27 22 73 71 6c 69  ocs MATCH '"sqli
9e30: 74 65 20 6c 69 62 72 61 72 79 22 27 0a 20 20 20  te library"'.   
9e40: 20 20 20 55 4e 49 4f 4e 0a 20 20 20 20 53 45 4c     UNION.    SEL
9e50: 45 43 54 20 64 6f 63 69 64 20 46 52 4f 4d 20 64  ECT docid FROM d
9e60: 6f 63 73 20 57 48 45 52 45 20 64 6f 63 73 20 4d  ocs WHERE docs M
9e70: 41 54 43 48 20 27 22 73 71 6c 69 74 65 20 64 61  ATCH '"sqlite da
9e80: 74 61 62 61 73 65 22 27 0a 20 20 29 3b 0a 3c 2f  tabase"'.  );.</
9e90: 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 0a 3c 68 32  codeblock>...<h2
9ea0: 3e 53 65 74 20 4f 70 65 72 61 74 69 6f 6e 73 20  >Set Operations 
9eb0: 55 73 69 6e 67 20 54 68 65 20 53 74 61 6e 64 61  Using The Standa
9ec0: 72 64 20 51 75 65 72 79 20 53 79 6e 74 61 78 3c  rd Query Syntax<
9ed0: 2f 68 32 3e 0a 0a 3c 70 3e 0a 20 20 46 54 53 20  /h2>..<p>.  FTS 
9ee0: 71 75 65 72 79 20 73 65 74 20 6f 70 65 72 61 74  query set operat
9ef0: 69 6f 6e 73 20 75 73 69 6e 67 20 74 68 65 20 73  ions using the s
9f00: 74 61 6e 64 61 72 64 20 71 75 65 72 79 20 73 79  tandard query sy
9f10: 6e 74 61 78 20 61 72 65 20 73 69 6d 69 6c 61 72  ntax are similar
9f20: 2c 20 62 75 74 0a 20 20 6e 6f 74 20 69 64 65 6e  , but.  not iden
9f30: 74 69 63 61 6c 2c 20 74 6f 20 73 65 74 20 6f 70  tical, to set op
9f40: 65 72 61 74 69 6f 6e 73 20 77 69 74 68 20 74 68  erations with th
9f50: 65 20 65 6e 68 61 6e 63 65 64 20 71 75 65 72 79  e enhanced query
9f60: 20 73 79 6e 74 61 78 2e 20 54 68 65 72 65 0a 20   syntax. There. 
9f70: 20 61 72 65 20 66 6f 75 72 20 64 69 66 66 65 72   are four differ
9f80: 65 6e 63 65 73 2c 20 61 73 20 66 6f 6c 6c 6f 77  ences, as follow
9f90: 73 3a 0a 0a 3c 6f 6c 3e 0a 20 20 3c 6c 69 20 76  s:..<ol>.  <li v
9fa0: 61 6c 75 65 3d 31 3e 3c 70 3e 20 4f 6e 6c 79 20  alue=1><p> Only 
9fb0: 74 68 65 20 69 6d 70 6c 69 63 69 74 20 76 65 72  the implicit ver
9fc0: 73 69 6f 6e 20 6f 66 20 74 68 65 20 41 4e 44 20  sion of the AND 
9fd0: 6f 70 65 72 61 74 6f 72 20 69 73 20 73 75 70 70  operator is supp
9fe0: 6f 72 74 65 64 2e 0a 20 20 20 20 53 70 65 63 69  orted..    Speci
9ff0: 66 79 69 6e 67 20 74 68 65 20 73 74 72 69 6e 67  fying the string
a000: 20 22 41 4e 44 22 20 61 73 20 70 61 72 74 20 6f   "AND" as part o
a010: 66 20 61 6e 20 73 74 61 6e 64 61 72 64 20 71 75  f an standard qu
a020: 65 72 79 20 73 79 6e 74 61 78 20 71 75 65 72 79  ery syntax query
a030: 20 69 73 0a 20 20 20 20 69 6e 74 65 72 70 72 65   is.    interpre
a040: 74 65 64 20 61 73 20 61 20 74 65 72 6d 20 71 75  ted as a term qu
a050: 65 72 79 20 66 6f 72 20 74 68 65 20 73 65 74 20  ery for the set 
a060: 6f 66 20 64 6f 63 75 6d 65 6e 74 73 20 63 6f 6e  of documents con
a070: 74 61 69 6e 69 6e 67 20 74 68 65 20 74 65 72 6d  taining the term
a080: 20 0a 20 20 20 20 22 61 6e 64 22 2e 0a 3c 2f 6f   .    "and"..</o
a090: 6c 3e 0a 0a 3c 6f 6c 3e 0a 20 20 3c 6c 69 20 76  l>..<ol>.  <li v
a0a0: 61 6c 75 65 3d 32 3e 3c 70 3e 20 50 61 72 65 6e  alue=2><p> Paren
a0b0: 74 68 65 73 69 73 20 61 72 65 20 6e 6f 74 20 73  thesis are not s
a0c0: 75 70 70 6f 72 74 65 64 2e 0a 3c 2f 6f 6c 3e 0a  upported..</ol>.
a0d0: 0a 3c 6f 6c 3e 0a 20 20 3c 6c 69 20 76 61 6c 75  .<ol>.  <li valu
a0e0: 65 3d 33 3e 3c 70 3e 20 54 68 65 20 4e 4f 54 20  e=3><p> The NOT 
a0f0: 6f 70 65 72 61 74 6f 72 20 69 73 20 6e 6f 74 20  operator is not 
a100: 73 75 70 70 6f 72 74 65 64 2e 20 49 6e 73 74 65  supported. Inste
a110: 61 64 20 6f 66 20 74 68 65 20 4e 4f 54 20 0a 20  ad of the NOT . 
a120: 20 20 20 6f 70 65 72 61 74 6f 72 2c 20 74 68 65     operator, the
a130: 20 73 74 61 6e 64 61 72 64 20 71 75 65 72 79 20   standard query 
a140: 73 79 6e 74 61 78 20 73 75 70 70 6f 72 74 73 20  syntax supports 
a150: 61 20 75 6e 61 72 79 20 22 2d 22 20 6f 70 65 72  a unary "-" oper
a160: 61 74 6f 72 20 74 68 61 74 0a 20 20 20 20 6d 61  ator that.    ma
a170: 79 20 62 65 20 61 70 70 6c 69 65 64 20 74 6f 20  y be applied to 
a180: 62 61 73 69 63 20 74 65 72 6d 20 61 6e 64 20 74  basic term and t
a190: 65 72 6d 2d 70 72 65 66 69 78 20 71 75 65 72 69  erm-prefix queri
a1a0: 65 73 20 28 62 75 74 20 6e 6f 74 20 74 6f 20 70  es (but not to p
a1b0: 68 72 61 73 65 0a 20 20 20 20 6f 72 20 4e 45 41  hrase.    or NEA
a1c0: 52 20 71 75 65 72 69 65 73 29 2e 20 41 20 74 65  R queries). A te
a1d0: 72 6d 20 6f 72 20 74 65 72 6d 2d 70 72 65 66 69  rm or term-prefi
a1e0: 78 20 74 68 61 74 20 68 61 73 20 61 20 75 6e 61  x that has a una
a1f0: 72 79 20 22 2d 22 20 6f 70 65 72 61 74 6f 72 0a  ry "-" operator.
a200: 20 20 20 20 61 74 74 61 63 68 65 64 20 74 6f 20      attached to 
a210: 69 74 20 6d 61 79 20 6e 6f 74 20 61 70 70 65 61  it may not appea
a220: 72 20 61 73 20 61 6e 20 6f 70 65 72 61 6e 64 20  r as an operand 
a230: 74 6f 20 61 6e 20 4f 52 20 6f 70 65 72 61 74 6f  to an OR operato
a240: 72 2e 20 41 6e 20 46 54 53 0a 20 20 20 20 71 75  r. An FTS.    qu
a250: 65 72 79 20 6d 61 79 20 6e 6f 74 20 63 6f 6e 73  ery may not cons
a260: 69 73 74 20 65 6e 74 69 72 65 6c 79 20 6f 66 20  ist entirely of 
a270: 74 65 72 6d 73 20 6f 72 20 74 65 72 6d 2d 70 72  terms or term-pr
a280: 65 66 69 78 20 71 75 65 72 69 65 73 20 77 69 74  efix queries wit
a290: 68 20 75 6e 61 72 79 0a 20 20 20 20 22 2d 22 20  h unary.    "-" 
a2a0: 6f 70 65 72 61 74 6f 72 73 20 61 74 74 61 63 68  operators attach
a2b0: 65 64 20 74 6f 20 74 68 65 6d 2e 0a 3c 2f 6f 6c  ed to them..</ol
a2c0: 3e 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20  >..<codeblock>. 
a2d0: 20 3c 69 3e 2d 2d 20 53 65 61 72 63 68 20 66 6f   <i>-- Search fo
a2e0: 72 20 74 68 65 20 73 65 74 20 6f 66 20 64 6f 63  r the set of doc
a2f0: 75 6d 65 6e 74 73 20 74 68 61 74 20 63 6f 6e 74  uments that cont
a300: 61 69 6e 20 74 68 65 20 74 65 72 6d 20 22 73 71  ain the term "sq
a310: 6c 69 74 65 22 20 62 75 74 20 64 6f 3c 2f 69 3e  lite" but do</i>
a320: 0a 20 20 3c 69 3e 2d 2d 20 6e 6f 74 20 63 6f 6e  .  <i>-- not con
a330: 74 61 69 6e 20 74 68 65 20 74 65 72 6d 20 22 64  tain the term "d
a340: 61 74 61 62 61 73 65 22 2e 3c 2f 69 3e 0a 20 20  atabase".</i>.  
a350: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f  SELECT * FROM do
a360: 63 73 20 57 48 45 52 45 20 64 6f 63 73 20 4d 41  cs WHERE docs MA
a370: 54 43 48 20 27 73 71 6c 69 74 65 20 2d 64 61 74  TCH 'sqlite -dat
a380: 61 62 61 73 65 27 3b 0a 3c 2f 63 6f 64 65 62 6c  abase';.</codebl
a390: 6f 63 6b 3e 0a 0a 3c 6f 6c 3e 0a 20 20 3c 6c 69  ock>..<ol>.  <li
a3a0: 20 76 61 6c 75 65 3d 34 3e 3c 70 3e 20 54 68 65   value=4><p> The
a3b0: 20 72 65 6c 61 74 69 76 65 20 70 72 65 63 65 64   relative preced
a3c0: 65 6e 63 65 20 6f 66 20 74 68 65 20 73 65 74 20  ence of the set 
a3d0: 6f 70 65 72 61 74 69 6f 6e 73 20 69 73 20 64 69  operations is di
a3e0: 66 66 65 72 65 6e 74 2e 20 0a 20 20 20 49 6e 20  fferent. .   In 
a3f0: 70 61 72 74 69 63 75 6c 61 72 2c 20 75 73 69 6e  particular, usin
a400: 67 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 71  g the standard q
a410: 75 65 72 79 20 73 79 6e 74 61 78 20 74 68 65 20  uery syntax the 
a420: 22 4f 52 22 20 6f 70 65 72 61 74 6f 72 20 68 61  "OR" operator ha
a430: 73 20 61 0a 20 20 20 68 69 67 68 65 72 20 70 72  s a.   higher pr
a440: 65 63 65 64 65 6e 63 65 20 74 68 61 6e 20 22 41  ecedence than "A
a450: 4e 44 22 2e 20 54 68 65 20 70 72 65 63 65 64 65  ND". The precede
a460: 6e 63 65 20 6f 66 20 6f 70 65 72 61 74 6f 72 73  nce of operators
a470: 20 77 68 65 6e 20 75 73 69 6e 67 20 74 68 65 0a   when using the.
a480: 20 20 20 73 74 61 6e 64 61 72 64 20 71 75 65 72     standard quer
a490: 79 20 73 79 6e 74 61 78 20 69 73 3a 20 0a 3c 2f  y syntax is: .</
a4a0: 6f 6c 3e 0a 0a 3c 74 61 62 6c 65 20 73 74 72 69  ol>..<table stri
a4b0: 70 65 64 3d 31 3e 0a 20 20 3c 74 72 3e 3c 74 68  ped=1>.  <tr><th
a4c0: 3e 4f 70 65 72 61 74 6f 72 3c 74 68 3e 53 74 61  >Operator<th>Sta
a4d0: 6e 64 61 72 64 20 51 75 65 72 79 20 53 79 6e 74  ndard Query Synt
a4e0: 61 78 20 50 72 65 63 65 64 65 6e 63 65 0a 20 20  ax Precedence.  
a4f0: 3c 74 72 3e 3c 74 64 3e 55 6e 61 72 79 20 22 2d  <tr><td>Unary "-
a500: 22 20 3c 74 64 3e 20 48 69 67 68 65 73 74 20 70  " <td> Highest p
a510: 72 65 63 65 64 65 6e 63 65 20 28 74 69 67 68 74  recedence (tight
a520: 65 73 74 20 67 72 6f 75 70 69 6e 67 29 2e 0a 20  est grouping).. 
a530: 20 3c 74 72 3e 3c 74 64 3e 4f 52 20 20 3c 74 64   <tr><td>OR  <td
a540: 3e 0a 20 20 3c 74 72 3e 3c 74 64 3e 41 4e 44 20  >.  <tr><td>AND 
a550: 3c 74 64 3e 20 4c 6f 77 65 73 74 20 70 72 65 63  <td> Lowest prec
a560: 65 64 65 6e 63 65 20 28 6c 6f 6f 73 65 73 74 20  edence (loosest 
a570: 67 72 6f 75 70 69 6e 67 29 2e 0a 3c 2f 74 61 62  grouping)..</tab
a580: 6c 65 3e 0a 0a 3c 6f 6c 3e 3c 6c 69 20 73 74 79  le>..<ol><li sty
a590: 6c 65 3d 22 6c 69 73 74 2d 73 74 79 6c 65 3a 6e  le="list-style:n
a5a0: 6f 6e 65 22 3e 0a 20 20 54 68 65 20 66 6f 6c 6c  one">.  The foll
a5b0: 6f 77 69 6e 67 20 65 78 61 6d 70 6c 65 20 69 6c  owing example il
a5c0: 6c 75 73 74 72 61 74 65 73 20 70 72 65 63 65 64  lustrates preced
a5d0: 65 6e 63 65 20 6f 66 20 6f 70 65 72 61 74 6f 72  ence of operator
a5e0: 73 20 75 73 69 6e 67 20 74 68 65 20 73 74 61 6e  s using the stan
a5f0: 64 61 72 64 20 0a 20 20 71 75 65 72 79 20 73 79  dard .  query sy
a600: 6e 74 61 78 3a 0a 3c 2f 6f 6c 3e 0a 0a 3c 63 6f  ntax:.</ol>..<co
a610: 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d  deblock>.  <i>--
a620: 20 53 65 61 72 63 68 20 66 6f 72 20 64 6f 63 75   Search for docu
a630: 6d 65 6e 74 73 20 74 68 61 74 20 63 6f 6e 74 61  ments that conta
a640: 69 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  in at least one 
a650: 6f 66 20 74 68 65 20 74 65 72 6d 73 20 22 64 61  of the terms "da
a660: 74 61 62 61 73 65 22 3c 2f 69 3e 0a 20 20 3c 69  tabase"</i>.  <i
a670: 3e 2d 2d 20 61 6e 64 20 22 73 71 6c 69 74 65 22  >-- and "sqlite"
a680: 2c 20 61 6e 64 20 61 6c 73 6f 20 63 6f 6e 74 61  , and also conta
a690: 69 6e 20 74 68 65 20 74 65 72 6d 20 22 6c 69 62  in the term "lib
a6a0: 72 61 72 79 22 2e 20 42 65 63 61 75 73 65 20 6f  rary". Because o
a6b0: 66 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65  f the difference
a6c0: 73 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 69 6e  s</i>.  <i>-- in
a6d0: 20 6f 70 65 72 61 74 6f 72 20 70 72 65 63 65 64   operator preced
a6e0: 65 6e 63 65 73 2c 20 74 68 69 73 20 71 75 65 72  ences, this quer
a6f0: 79 20 77 6f 75 6c 64 20 68 61 76 65 20 61 20 64  y would have a d
a700: 69 66 66 65 72 65 6e 74 20 69 6e 74 65 72 70 72  ifferent interpr
a710: 65 74 61 74 69 6f 6e 20 75 73 69 6e 67 3c 2f 69  etation using</i
a720: 3e 0a 20 20 3c 69 3e 2d 2d 20 74 68 65 20 65 6e  >.  <i>-- the en
a730: 68 61 6e 63 65 64 20 71 75 65 72 79 20 73 79 6e  hanced query syn
a740: 74 61 78 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43  tax.</i>.  SELEC
a750: 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48  T * FROM docs WH
a760: 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27  ERE docs MATCH '
a770: 73 71 6c 69 74 65 20 4f 52 20 64 61 74 61 62 61  sqlite OR databa
a780: 73 65 20 6c 69 62 72 61 72 79 27 3b 0a 3c 2f 63  se library';.</c
a790: 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 74 63 6c 3e  odeblock>..<tcl>
a7a0: 68 64 5f 66 72 61 67 6d 65 6e 74 20 73 6e 69 70  hd_fragment snip
a7b0: 70 65 74 20 7b 46 54 53 20 61 75 78 69 6c 69 61  pet {FTS auxilia
a7c0: 72 79 20 66 75 6e 63 74 69 6f 6e 73 7d 3c 2f 74  ry functions}</t
a7d0: 63 6c 3e 0a 3c 68 31 3e 41 75 78 69 6c 69 61 72  cl>.<h1>Auxiliar
a7e0: 79 20 46 75 6e 63 74 69 6f 6e 73 20 2d 20 53 6e  y Functions - Sn
a7f0: 69 70 70 65 74 2c 20 4f 66 66 73 65 74 73 20 61  ippet, Offsets a
a800: 6e 64 20 4d 61 74 63 68 69 6e 66 6f 3c 2f 68 31  nd Matchinfo</h1
a810: 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 46 54 53  >..<p>.  The FTS
a820: 33 20 61 6e 64 20 46 54 53 34 20 6d 6f 64 75 6c  3 and FTS4 modul
a830: 65 73 20 70 72 6f 76 69 64 65 20 74 68 72 65 65  es provide three
a840: 20 73 70 65 63 69 61 6c 20 53 51 4c 20 73 63 61   special SQL sca
a850: 6c 61 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  lar functions th
a860: 61 74 20 6d 61 79 20 62 65 20 75 73 65 66 75 6c  at may be useful
a870: 0a 20 20 74 6f 20 74 68 65 20 64 65 76 65 6c 6f  .  to the develo
a880: 70 65 72 73 20 6f 66 20 66 75 6c 6c 2d 74 65 78  pers of full-tex
a890: 74 20 71 75 65 72 79 20 73 79 73 74 65 6d 73 3a  t query systems:
a8a0: 20 22 73 6e 69 70 70 65 74 22 2c 20 22 6f 66 66   "snippet", "off
a8b0: 73 65 74 73 22 20 61 6e 64 0a 20 20 22 6d 61 74  sets" and.  "mat
a8c0: 63 68 69 6e 66 6f 22 2e 20 54 68 65 20 70 75 72  chinfo". The pur
a8d0: 70 6f 73 65 20 6f 66 20 74 68 65 20 22 73 6e 69  pose of the "sni
a8e0: 70 70 65 74 22 20 61 6e 64 20 22 6f 66 66 73 65  ppet" and "offse
a8f0: 74 73 22 20 66 75 6e 63 74 69 6f 6e 73 20 69 73  ts" functions is
a900: 20 74 6f 20 61 6c 6c 6f 77 0a 20 20 74 68 65 20   to allow.  the 
a910: 75 73 65 72 20 74 6f 20 69 64 65 6e 74 69 66 79  user to identify
a920: 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66   the location of
a930: 20 71 75 65 72 69 65 64 20 74 65 72 6d 73 20 69   queried terms i
a940: 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 64  n the returned d
a950: 6f 63 75 6d 65 6e 74 73 2e 0a 20 20 54 68 65 20  ocuments..  The 
a960: 22 6d 61 74 63 68 69 6e 66 6f 22 20 66 75 6e 63  "matchinfo" func
a970: 74 69 6f 6e 20 70 72 6f 76 69 64 65 73 20 74 68  tion provides th
a980: 65 20 75 73 65 72 20 77 69 74 68 20 6d 65 74 72  e user with metr
a990: 69 63 73 20 74 68 61 74 20 6d 61 79 20 62 65 20  ics that may be 
a9a0: 75 73 65 66 75 6c 0a 20 20 66 6f 72 20 66 69 6c  useful.  for fil
a9b0: 74 65 72 69 6e 67 20 6f 72 20 73 6f 72 74 69 6e  tering or sortin
a9c0: 67 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  g query results 
a9d0: 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 72 65 6c  according to rel
a9e0: 65 76 61 6e 63 65 2e 0a 0a 3c 70 3e 0a 20 20 54  evance...<p>.  T
a9f0: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
aa00: 74 20 74 6f 20 61 6c 6c 20 74 68 72 65 65 20 73  t to all three s
aa10: 70 65 63 69 61 6c 20 53 51 4c 20 73 63 61 6c 61  pecial SQL scala
aa20: 72 20 66 75 6e 63 74 69 6f 6e 73 0a 20 20 6d 75  r functions.  mu
aa30: 73 74 20 62 65 20 74 68 65 20 5b 46 54 53 20 68  st be the [FTS h
aa40: 69 64 64 65 6e 20 63 6f 6c 75 6d 6e 5d 20 6f 66  idden column] of
aa50: 20 74 68 65 20 46 54 53 20 74 61 62 6c 65 20 74   the FTS table t
aa60: 68 61 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  hat the function
aa70: 20 69 73 0a 20 20 61 70 70 6c 69 65 64 20 74 6f   is.  applied to
aa80: 2e 20 20 54 68 65 20 5b 46 54 53 20 68 69 64 64  .  The [FTS hidd
aa90: 65 6e 20 63 6f 6c 75 6d 6e 5d 20 69 73 20 61 6e  en column] is an
aaa0: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2d 67   automatically-g
aab0: 65 6e 65 72 61 74 65 64 20 63 6f 6c 75 6d 6e 20  enerated column 
aac0: 66 6f 75 6e 64 20 6f 6e 0a 20 20 61 6c 6c 20 46  found on.  all F
aad0: 54 53 20 74 61 62 6c 65 73 20 74 68 61 74 20 68  TS tables that h
aae0: 61 73 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  as the same name
aaf0: 20 61 73 20 74 68 65 20 46 54 53 20 74 61 62 6c   as the FTS tabl
ab00: 65 20 69 74 73 65 6c 66 2e 0a 20 20 46 6f 72 20  e itself..  For 
ab10: 65 78 61 6d 70 6c 65 2c 20 67 69 76 65 6e 20 61  example, given a
ab20: 6e 20 46 54 53 20 74 61 62 6c 65 20 6e 61 6d 65  n FTS table name
ab30: 64 20 22 6d 61 69 6c 22 3a 0a 0a 3c 63 6f 64 65  d "mail":..<code
ab40: 62 6c 6f 63 6b 3e 0a 20 20 53 45 4c 45 43 54 20  block>.  SELECT 
ab50: 6f 66 66 73 65 74 73 28 6d 61 69 6c 29 20 46 52  offsets(mail) FR
ab60: 4f 4d 20 6d 61 69 6c 20 57 48 45 52 45 20 6d 61  OM mail WHERE ma
ab70: 69 6c 20 4d 41 54 43 48 20 26 6c 74 3b 66 75 6c  il MATCH &lt;ful
ab80: 6c 2d 74 65 78 74 20 71 75 65 72 79 20 65 78 70  l-text query exp
ab90: 72 65 73 73 69 6f 6e 26 67 74 3b 3b 0a 20 20 53  ression&gt;;.  S
aba0: 45 4c 45 43 54 20 73 6e 69 70 70 65 74 28 6d 61  ELECT snippet(ma
abb0: 69 6c 29 20 46 52 4f 4d 20 6d 61 69 6c 20 57 48  il) FROM mail WH
abc0: 45 52 45 20 6d 61 69 6c 20 4d 41 54 43 48 20 26  ERE mail MATCH &
abd0: 6c 74 3b 66 75 6c 6c 2d 74 65 78 74 20 71 75 65  lt;full-text que
abe0: 72 79 20 65 78 70 72 65 73 73 69 6f 6e 26 67 74  ry expression&gt
abf0: 3b 3b 0a 20 20 53 45 4c 45 43 54 20 6d 61 74 63  ;;.  SELECT matc
ac00: 68 69 6e 66 6f 28 6d 61 69 6c 29 20 46 52 4f 4d  hinfo(mail) FROM
ac10: 20 6d 61 69 6c 20 57 48 45 52 45 20 6d 61 69 6c   mail WHERE mail
ac20: 20 4d 41 54 43 48 20 26 6c 74 3b 66 75 6c 6c 2d   MATCH &lt;full-
ac30: 74 65 78 74 20 71 75 65 72 79 20 65 78 70 72 65  text query expre
ac40: 73 73 69 6f 6e 26 67 74 3b 3b 0a 3c 2f 63 6f 64  ssion&gt;;.</cod
ac50: 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 54  eblock>..<p>.  T
ac60: 68 65 20 74 68 72 65 65 20 61 75 78 69 6c 69 61  he three auxilia
ac70: 72 79 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65  ry functions are
ac80: 20 6f 6e 6c 79 20 75 73 65 66 75 6c 20 77 69 74   only useful wit
ac90: 68 69 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61  hin a SELECT sta
aca0: 74 65 6d 65 6e 74 20 74 68 61 74 0a 20 20 75 73  tement that.  us
acb0: 65 73 20 74 68 65 20 46 54 53 20 74 61 62 6c 65  es the FTS table
acc0: 27 73 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64  's full-text ind
acd0: 65 78 2e 20 5e 49 66 20 75 73 65 64 20 77 69 74  ex. ^If used wit
ace0: 68 69 6e 20 61 20 53 45 4c 45 43 54 20 74 68 61  hin a SELECT tha
acf0: 74 20 75 73 65 73 0a 20 20 74 68 65 20 22 71 75  t uses.  the "qu
ad00: 65 72 79 20 62 79 20 72 6f 77 69 64 22 20 6f 72  ery by rowid" or
ad10: 20 22 6c 69 6e 65 61 72 20 73 63 61 6e 22 20 73   "linear scan" s
ad20: 74 72 61 74 65 67 69 65 73 2c 20 74 68 65 6e 20  trategies, then 
ad30: 74 68 65 20 73 6e 69 70 70 65 74 20 61 6e 64 0a  the snippet and.
ad40: 20 20 6f 66 66 73 65 74 73 20 62 6f 74 68 20 72    offsets both r
ad50: 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73  eturn an empty s
ad60: 74 72 69 6e 67 2c 20 61 6e 64 20 74 68 65 20 6d  tring, and the m
ad70: 61 74 63 68 69 6e 66 6f 20 66 75 6e 63 74 69 6f  atchinfo functio
ad80: 6e 20 72 65 74 75 72 6e 73 0a 20 20 61 20 62 6c  n returns.  a bl
ad90: 6f 62 20 76 61 6c 75 65 20 7a 65 72 6f 20 62 79  ob value zero by
ada0: 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 0a 3c 70  tes in size...<p
adb0: 20 69 64 3d 6d 61 74 63 68 61 62 6c 65 3e 0a 20   id=matchable>. 
adc0: 20 41 6c 6c 20 74 68 72 65 65 20 61 75 78 69 6c   All three auxil
add0: 69 61 72 79 20 66 75 6e 63 74 69 6f 6e 73 20 65  iary functions e
ade0: 78 74 72 61 63 74 20 61 20 73 65 74 20 6f 66 20  xtract a set of 
adf0: 22 6d 61 74 63 68 61 62 6c 65 20 70 68 72 61 73  "matchable phras
ae00: 65 73 22 20 66 72 6f 6d 0a 20 20 74 68 65 20 46  es" from.  the F
ae10: 54 53 20 71 75 65 72 79 20 65 78 70 72 65 73 73  TS query express
ae20: 69 6f 6e 20 74 6f 20 77 6f 72 6b 20 77 69 74 68  ion to work with
ae30: 2e 20 54 68 65 20 73 65 74 20 6f 66 20 6d 61 74  . The set of mat
ae40: 63 68 61 62 6c 65 20 70 68 72 61 73 65 73 20 66  chable phrases f
ae50: 6f 72 0a 20 20 61 20 67 69 76 65 6e 20 71 75 65  or.  a given que
ae60: 72 79 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  ry consists of a
ae70: 6c 6c 20 70 68 72 61 73 65 73 20 28 69 6e 63 6c  ll phrases (incl
ae80: 75 64 69 6e 67 20 75 6e 71 75 6f 74 65 64 20 74  uding unquoted t
ae90: 6f 6b 65 6e 73 20 61 6e 64 0a 20 20 74 6f 6b 65  okens and.  toke
aea0: 6e 20 70 72 65 66 69 78 65 73 29 20 69 6e 20 74  n prefixes) in t
aeb0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 78  he expression ex
aec0: 63 65 70 74 20 74 68 6f 73 65 20 74 68 61 74 20  cept those that 
aed0: 61 72 65 20 70 72 65 66 69 78 65 64 20 77 69 74  are prefixed wit
aee0: 68 0a 20 20 61 20 75 6e 61 72 79 20 22 2d 22 20  h.  a unary "-" 
aef0: 6f 70 65 72 61 74 6f 72 20 28 73 74 61 6e 64 61  operator (standa
af00: 72 64 20 73 79 6e 74 61 78 29 20 6f 72 20 61 72  rd syntax) or ar
af10: 65 20 70 61 72 74 20 6f 66 20 61 20 73 75 62 2d  e part of a sub-
af20: 65 78 70 72 65 73 73 69 6f 6e 20 0a 20 20 74 68  expression .  th
af30: 61 74 20 69 73 20 75 73 65 64 20 61 73 20 74 68  at is used as th
af40: 65 20 72 69 67 68 74 2d 68 61 6e 64 20 6f 70 65  e right-hand ope
af50: 72 61 6e 64 20 6f 66 20 61 20 4e 4f 54 20 6f 70  rand of a NOT op
af60: 65 72 61 74 6f 72 2e 0a 0a 3c 70 3e 0a 20 20 57  erator...<p>.  W
af70: 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ith the followin
af80: 67 20 70 72 6f 76 69 73 6f 73 2c 20 65 61 63 68  g provisos, each
af90: 20 73 65 72 69 65 73 20 6f 66 20 74 6f 6b 65 6e   series of token
afa0: 73 20 69 6e 20 74 68 65 20 46 54 53 20 74 61 62  s in the FTS tab
afb0: 6c 65 20 74 68 61 74 0a 20 20 6d 61 74 63 68 65  le that.  matche
afc0: 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 6d 61 74  s one of the mat
afd0: 63 68 61 62 6c 65 20 70 68 72 61 73 65 73 20 69  chable phrases i
afe0: 6e 20 74 68 65 20 71 75 65 72 79 20 65 78 70 72  n the query expr
aff0: 65 73 73 69 6f 6e 20 69 73 20 6b 6e 6f 77 6e 20  ession is known 
b000: 61 73 20 61 0a 20 20 22 70 68 72 61 73 65 20 6d  as a.  "phrase m
b010: 61 74 63 68 22 3a 0a 0a 3c 6f 6c 3e 0a 20 20 3c  atch":..<ol>.  <
b020: 6c 69 3e 20 49 66 20 61 20 6d 61 74 63 68 61 62  li> If a matchab
b030: 6c 65 20 70 68 72 61 73 65 20 69 73 20 70 61 72  le phrase is par
b040: 74 20 6f 66 20 61 20 73 65 72 69 65 73 20 6f 66  t of a series of
b050: 20 70 68 72 61 73 65 73 20 63 6f 6e 6e 65 63 74   phrases connect
b060: 65 64 20 62 79 0a 20 20 20 20 20 20 20 4e 45 41  ed by.       NEA
b070: 52 20 6f 70 65 72 61 74 6f 72 73 20 69 6e 20 74  R operators in t
b080: 68 65 20 46 54 53 20 71 75 65 72 79 20 65 78 70  he FTS query exp
b090: 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 20 65 61  ression, then ea
b0a0: 63 68 20 70 68 72 61 73 65 20 6d 61 74 63 68 0a  ch phrase match.
b0b0: 20 20 20 20 20 20 20 6d 75 73 74 20 62 65 20 73         must be s
b0c0: 75 66 66 69 63 69 65 6e 74 6c 79 20 63 6c 6f 73  ufficiently clos
b0d0: 65 20 74 6f 20 6f 74 68 65 72 20 70 68 72 61 73  e to other phras
b0e0: 65 20 6d 61 74 63 68 65 73 20 6f 66 20 74 68 65  e matches of the
b0f0: 20 72 65 6c 65 76 61 6e 74 0a 20 20 20 20 20 20   relevant.      
b100: 20 74 79 70 65 73 20 74 6f 20 73 61 74 69 73 66   types to satisf
b110: 79 20 74 68 65 20 4e 45 41 52 20 63 6f 6e 64 69  y the NEAR condi
b120: 74 69 6f 6e 2e 0a 0a 20 20 3c 6c 69 3e 20 49 66  tion...  <li> If
b130: 20 74 68 65 20 6d 61 74 63 68 61 62 6c 65 20 70   the matchable p
b140: 68 72 61 73 65 20 69 6e 20 74 68 65 20 46 54 53  hrase in the FTS
b150: 20 71 75 65 72 79 20 69 73 20 72 65 73 74 72 69   query is restri
b160: 63 74 65 64 20 74 6f 20 6d 61 74 63 68 69 6e 67  cted to matching
b170: 0a 20 20 20 20 20 20 20 64 61 74 61 20 69 6e 20  .       data in 
b180: 61 20 73 70 65 63 69 66 69 65 64 20 46 54 53 20  a specified FTS 
b190: 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c 20 74 68  table column, th
b1a0: 65 6e 20 6f 6e 6c 79 20 70 68 72 61 73 65 20 6d  en only phrase m
b1b0: 61 74 63 68 65 73 20 74 68 61 74 20 0a 20 20 20  atches that .   
b1c0: 20 20 20 20 6f 63 63 75 72 20 77 69 74 68 69 6e      occur within
b1d0: 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61 72 65   that column are
b1e0: 20 63 6f 6e 73 69 64 65 72 65 64 2e 0a 3c 2f 6f   considered..</o
b1f0: 6c 3e 0a 20 0a 3c 74 63 6c 3e 68 64 5f 66 72 61  l>. .<tcl>hd_fra
b200: 67 6d 65 6e 74 20 6f 66 66 73 65 74 73 20 6f 66  gment offsets of
b210: 66 73 65 74 73 3c 2f 74 63 6c 3e 0a 3c 68 32 3e  fsets</tcl>.<h2>
b220: 54 68 65 20 4f 66 66 73 65 74 73 20 46 75 6e 63  The Offsets Func
b230: 74 69 6f 6e 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a 20  tion</h2>..<p>. 
b240: 20 46 6f 72 20 61 20 53 45 4c 45 43 54 20 71 75   For a SELECT qu
b250: 65 72 79 20 74 68 61 74 20 75 73 65 73 20 74 68  ery that uses th
b260: 65 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65  e full-text inde
b270: 78 2c 20 74 68 65 20 6f 66 66 73 65 74 73 28 29  x, the offsets()
b280: 20 66 75 6e 63 74 69 6f 6e 20 0a 20 20 72 65 74   function .  ret
b290: 75 72 6e 73 20 61 20 74 65 78 74 20 76 61 6c 75  urns a text valu
b2a0: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 73  e containing a s
b2b0: 65 72 69 65 73 20 6f 66 20 73 70 61 63 65 2d 73  eries of space-s
b2c0: 65 70 61 72 61 74 65 64 20 69 6e 74 65 67 65 72  eparated integer
b2d0: 73 2e 20 46 6f 72 0a 20 20 65 61 63 68 20 74 65  s. For.  each te
b2e0: 72 6d 20 69 6e 20 65 61 63 68 20 3c 61 20 68 72  rm in each <a hr
b2f0: 65 66 3d 23 6d 61 74 63 68 61 62 6c 65 3e 70 68  ef=#matchable>ph
b300: 72 61 73 65 20 6d 61 74 63 68 3c 2f 61 3e 20 6f  rase match</a> o
b310: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  f the current ro
b320: 77 2c 20 0a 20 20 74 68 65 72 65 20 61 72 65 20  w, .  there are 
b330: 66 6f 75 72 20 69 6e 74 65 67 65 72 73 20 69 6e  four integers in
b340: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 6c 69   the returned li
b350: 73 74 2e 20 45 61 63 68 20 73 65 74 20 6f 66 20  st. Each set of 
b360: 66 6f 75 72 20 69 6e 74 65 67 65 72 73 20 69 73  four integers is
b370: 20 0a 20 20 69 6e 74 65 72 70 72 65 74 65 64 20   .  interpreted 
b380: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 0a 3c 74 61  as follows:..<ta
b390: 62 6c 65 20 73 74 72 69 70 65 64 3d 31 3e 0a 20  ble striped=1>. 
b3a0: 20 3c 74 72 3e 3c 74 68 3e 49 6e 74 65 67 65 72   <tr><th>Integer
b3b0: 20 3c 74 68 3e 49 6e 74 65 72 70 72 65 74 61 74   <th>Interpretat
b3c0: 69 6f 6e 0a 20 20 3c 74 72 3e 3c 74 64 3e 30 20  ion.  <tr><td>0 
b3d0: 0a 20 20 20 20 20 20 3c 74 64 3e 54 68 65 20 63  .      <td>The c
b3e0: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 74 68 61  olumn number tha
b3f0: 74 20 74 68 65 20 74 65 72 6d 20 69 6e 73 74 61  t the term insta
b400: 6e 63 65 20 6f 63 63 75 72 73 20 69 6e 20 28 30  nce occurs in (0
b410: 20 66 6f 72 20 74 68 65 0a 20 20 20 20 20 20 20   for the.       
b420: 20 20 20 6c 65 66 74 6d 6f 73 74 20 63 6f 6c 75     leftmost colu
b430: 6d 6e 20 6f 66 20 74 68 65 20 46 54 53 20 74 61  mn of the FTS ta
b440: 62 6c 65 2c 20 31 20 66 6f 72 20 74 68 65 20 6e  ble, 1 for the n
b450: 65 78 74 20 6c 65 66 74 6d 6f 73 74 2c 20 65 74  ext leftmost, et
b460: 63 2e 29 2e 0a 20 20 3c 74 72 3e 3c 74 64 3e 31  c.)..  <tr><td>1
b470: 0a 20 20 20 20 20 20 3c 74 64 3e 54 68 65 20 74  .      <td>The t
b480: 65 72 6d 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  erm number of th
b490: 65 20 6d 61 74 63 68 69 6e 67 20 74 65 72 6d 20  e matching term 
b4a0: 77 69 74 68 69 6e 20 74 68 65 20 66 75 6c 6c 2d  within the full-
b4b0: 74 65 78 74 20 71 75 65 72 79 0a 20 20 20 20 20  text query.     
b4c0: 20 20 20 20 20 65 78 70 72 65 73 73 69 6f 6e 2e       expression.
b4d0: 20 54 65 72 6d 73 20 77 69 74 68 69 6e 20 61 20   Terms within a 
b4e0: 71 75 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e  query expression
b4f0: 20 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74   are numbered st
b500: 61 72 74 69 6e 67 0a 20 20 20 20 20 20 20 20 20  arting.         
b510: 20 66 72 6f 6d 20 30 20 69 6e 20 74 68 65 20 6f   from 0 in the o
b520: 72 64 65 72 20 74 68 61 74 20 74 68 65 79 20 6f  rder that they o
b530: 63 63 75 72 2e 0a 20 20 3c 74 72 3e 3c 74 64 3e  ccur..  <tr><td>
b540: 32 0a 20 20 20 20 20 20 3c 74 64 3e 54 68 65 20  2.      <td>The 
b550: 62 79 74 65 20 6f 66 66 73 65 74 20 6f 66 20 74  byte offset of t
b560: 68 65 20 6d 61 74 63 68 69 6e 67 20 74 65 72 6d  he matching term
b570: 20 77 69 74 68 69 6e 20 74 68 65 20 63 6f 6c 75   within the colu
b580: 6d 6e 2e 0a 20 20 3c 74 72 3e 3c 74 64 3e 33 0a  mn..  <tr><td>3.
b590: 20 20 20 20 20 20 3c 74 64 3e 54 68 65 20 73 69        <td>The si
b5a0: 7a 65 20 6f 66 20 74 68 65 20 6d 61 74 63 68 69  ze of the matchi
b5b0: 6e 67 20 74 65 72 6d 20 69 6e 20 62 79 74 65 73  ng term in bytes
b5c0: 2e 0a 3c 2f 74 61 62 6c 65 3e 0a 0a 3c 70 3e 0a  ..</table>..<p>.
b5d0: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
b5e0: 62 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 65  block contains e
b5f0: 78 61 6d 70 6c 65 73 20 74 68 61 74 20 75 73 65  xamples that use
b600: 20 74 68 65 20 6f 66 66 73 65 74 73 20 66 75 6e   the offsets fun
b610: 63 74 69 6f 6e 2e 0a 0a 3c 63 6f 64 65 62 6c 6f  ction...<codeblo
b620: 63 6b 3e 0a 20 20 43 52 45 41 54 45 20 56 49 52  ck>.  CREATE VIR
b630: 54 55 41 4c 20 54 41 42 4c 45 20 6d 61 69 6c 20  TUAL TABLE mail 
b640: 55 53 49 4e 47 20 66 74 73 33 28 73 75 62 6a 65  USING fts3(subje
b650: 63 74 2c 20 62 6f 64 79 29 3b 0a 20 20 49 4e 53  ct, body);.  INS
b660: 45 52 54 20 49 4e 54 4f 20 6d 61 69 6c 20 56 41  ERT INTO mail VA
b670: 4c 55 45 53 28 27 68 65 6c 6c 6f 20 77 6f 72 6c  LUES('hello worl
b680: 64 27 2c 20 27 54 68 69 73 20 6d 65 73 73 61 67  d', 'This messag
b690: 65 20 69 73 20 61 20 68 65 6c 6c 6f 20 77 6f 72  e is a hello wor
b6a0: 6c 64 20 6d 65 73 73 61 67 65 2e 27 29 3b 0a 20  ld message.');. 
b6b0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6d 61 69   INSERT INTO mai
b6c0: 6c 20 56 41 4c 55 45 53 28 27 75 72 67 65 6e 74  l VALUES('urgent
b6d0: 3a 20 73 65 72 69 6f 75 73 27 2c 20 27 54 68 69  : serious', 'Thi
b6e0: 73 20 6d 61 69 6c 20 69 73 20 73 65 65 6e 20 61  s mail is seen a
b6f0: 73 20 61 20 6d 6f 72 65 20 73 65 72 69 6f 75 73  s a more serious
b700: 20 6d 61 69 6c 27 29 3b 0a 0a 20 20 3c 69 3e 2d   mail');..  <i>-
b710: 2d 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  - The following 
b720: 71 75 65 72 79 20 72 65 74 75 72 6e 73 20 61 20  query returns a 
b730: 73 69 6e 67 6c 65 20 72 6f 77 20 28 61 73 20 69  single row (as i
b740: 74 20 6d 61 74 63 68 65 73 20 6f 6e 6c 79 20 74  t matches only t
b750: 68 65 20 66 69 72 73 74 3c 2f 69 3e 0a 20 20 3c  he first</i>.  <
b760: 69 3e 2d 2d 20 65 6e 74 72 79 20 69 6e 20 74 61  i>-- entry in ta
b770: 62 6c 65 20 22 6d 61 69 6c 22 2e 20 54 68 65 20  ble "mail". The 
b780: 74 65 78 74 20 72 65 74 75 72 6e 65 64 20 62 79  text returned by
b790: 20 74 68 65 20 6f 66 66 73 65 74 73 20 66 75 6e   the offsets fun
b7a0: 63 74 69 6f 6e 20 69 73 3c 2f 69 3e 0a 20 20 3c  ction is</i>.  <
b7b0: 69 3e 2d 2d 20 22 30 20 30 20 36 20 35 20 31 20  i>-- "0 0 6 5 1 
b7c0: 30 20 32 34 20 35 22 2e 3c 2f 69 3e 0a 20 20 3c  0 24 5".</i>.  <
b7d0: 69 3e 2d 2d 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  i>--</i>.  <i>--
b7e0: 20 54 68 65 20 66 69 72 73 74 20 73 65 74 20 6f   The first set o
b7f0: 66 20 66 6f 75 72 20 69 6e 74 65 67 65 72 73 20  f four integers 
b800: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e  in the result in
b810: 64 69 63 61 74 65 20 74 68 61 74 20 63 6f 6c 75  dicate that colu
b820: 6d 6e 20 30 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  mn 0</i>.  <i>--
b830: 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 73   contains an ins
b840: 74 61 6e 63 65 20 6f 66 20 74 65 72 6d 20 30 20  tance of term 0 
b850: 28 22 77 6f 72 6c 64 22 29 20 61 74 20 62 79 74  ("world") at byt
b860: 65 20 6f 66 66 73 65 74 20 36 2e 20 54 68 65 20  e offset 6. The 
b870: 74 65 72 6d 20 69 6e 73 74 61 6e 63 65 3c 2f 69  term instance</i
b880: 3e 0a 20 20 3c 69 3e 2d 2d 20 69 73 20 35 20 62  >.  <i>-- is 5 b
b890: 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 54 68  ytes in size. Th
b8a0: 65 20 73 65 63 6f 6e 64 20 73 65 74 20 6f 66 20  e second set of 
b8b0: 66 6f 75 72 20 69 6e 74 65 67 65 72 73 20 73 68  four integers sh
b8c0: 6f 77 73 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20  ows that column 
b8d0: 31 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 6f 66  1</i>.  <i>-- of
b8e0: 20 74 68 65 20 6d 61 74 63 68 65 64 20 72 6f 77   the matched row
b8f0: 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 73   contains an ins
b900: 74 61 6e 63 65 20 6f 66 20 74 65 72 6d 20 30 20  tance of term 0 
b910: 28 22 77 6f 72 6c 64 22 29 20 61 74 20 62 79 74  ("world") at byt
b920: 65 20 6f 66 66 73 65 74 3c 2f 69 3e 0a 20 20 3c  e offset</i>.  <
b930: 69 3e 2d 2d 20 32 34 2e 20 41 67 61 69 6e 2c 20  i>-- 24. Again, 
b940: 74 68 65 20 74 65 72 6d 20 69 6e 73 74 61 6e 63  the term instanc
b950: 65 20 69 73 20 35 20 62 79 74 65 73 20 69 6e 20  e is 5 bytes in 
b960: 73 69 7a 65 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45  size.</i>.  SELE
b970: 43 54 20 6f 66 66 73 65 74 73 28 6d 61 69 6c 29  CT offsets(mail)
b980: 20 46 52 4f 4d 20 6d 61 69 6c 20 57 48 45 52 45   FROM mail WHERE
b990: 20 6d 61 69 6c 20 4d 41 54 43 48 20 27 77 6f 72   mail MATCH 'wor
b9a0: 6c 64 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68  ld';..  <i>-- Th
b9b0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72  e following quer
b9c0: 79 20 72 65 74 75 72 6e 73 20 61 6c 73 6f 20 6d  y returns also m
b9d0: 61 74 63 68 65 73 20 6f 6e 6c 79 20 74 68 65 20  atches only the 
b9e0: 66 69 72 73 74 20 72 6f 77 20 69 6e 20 74 61 62  first row in tab
b9f0: 6c 65 20 22 6d 61 69 6c 22 2e 3c 2f 69 3e 0a 20  le "mail".</i>. 
ba00: 20 3c 69 3e 2d 2d 20 49 6e 20 74 68 69 73 20 63   <i>-- In this c
ba10: 61 73 65 20 74 68 65 20 72 65 74 75 72 6e 65 64  ase the returned
ba20: 20 74 65 78 74 20 69 73 20 22 31 20 30 20 35 20   text is "1 0 5 
ba30: 37 20 31 20 30 20 33 30 20 37 22 2e 3c 2f 69 3e  7 1 0 30 7".</i>
ba40: 0a 20 20 53 45 4c 45 43 54 20 6f 66 66 73 65 74  .  SELECT offset
ba50: 73 28 6d 61 69 6c 29 20 46 52 4f 4d 20 6d 61 69  s(mail) FROM mai
ba60: 6c 20 57 48 45 52 45 20 6d 61 69 6c 20 4d 41 54  l WHERE mail MAT
ba70: 43 48 20 27 6d 65 73 73 61 67 65 27 3b 0a 0a 20  CH 'message';.. 
ba80: 20 3c 69 3e 2d 2d 20 54 68 65 20 66 6f 6c 6c 6f   <i>-- The follo
ba90: 77 69 6e 67 20 71 75 65 72 79 20 6d 61 74 63 68  wing query match
baa0: 65 73 20 74 68 65 20 73 65 63 6f 6e 64 20 72 6f  es the second ro
bab0: 77 20 69 6e 20 74 61 62 6c 65 20 22 6d 61 69 6c  w in table "mail
bac0: 22 2e 20 49 74 20 72 65 74 75 72 6e 73 20 74 68  ". It returns th
bad0: 65 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 65  e</i>.  <i>-- te
bae0: 78 74 20 22 31 20 30 20 32 38 20 37 20 31 20 31  xt "1 0 28 7 1 1
baf0: 20 33 36 20 34 22 2e 20 4f 6e 6c 79 20 74 68 6f   36 4". Only tho
bb00: 73 65 20 6f 63 63 75 72 72 65 6e 63 65 73 20 6f  se occurrences o
bb10: 66 20 74 65 72 6d 73 20 22 73 65 72 69 6f 75 73  f terms "serious
bb20: 22 20 61 6e 64 20 22 6d 61 69 6c 22 3c 2f 69 3e  " and "mail"</i>
bb30: 0a 20 20 3c 69 3e 2d 2d 20 74 68 61 74 20 61 72  .  <i>-- that ar
bb40: 65 20 70 61 72 74 20 6f 66 20 61 6e 20 69 6e 73  e part of an ins
bb50: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 70 68 72  tance of the phr
bb60: 61 73 65 20 22 73 65 72 69 6f 75 73 20 6d 61 69  ase "serious mai
bb70: 6c 22 20 61 72 65 20 69 64 65 6e 74 69 66 69 65  l" are identifie
bb80: 64 3b 20 74 68 65 3c 2f 69 3e 0a 20 20 3c 69 3e  d; the</i>.  <i>
bb90: 2d 2d 20 6f 74 68 65 72 20 6f 63 63 75 72 72 65  -- other occurre
bba0: 6e 63 65 73 20 6f 66 20 22 73 65 72 69 6f 75 73  nces of "serious
bbb0: 22 20 61 6e 64 20 22 6d 61 69 6c 22 20 61 72 65  " and "mail" are
bbc0: 20 69 67 6e 6f 72 65 64 2e 3c 2f 69 3e 0a 20 20   ignored.</i>.  
bbd0: 53 45 4c 45 43 54 20 6f 66 66 73 65 74 73 28 6d  SELECT offsets(m
bbe0: 61 69 6c 29 20 46 52 4f 4d 20 6d 61 69 6c 20 57  ail) FROM mail W
bbf0: 48 45 52 45 20 6d 61 69 6c 20 4d 41 54 43 48 20  HERE mail MATCH 
bc00: 27 22 73 65 72 69 6f 75 73 20 6d 61 69 6c 22 27  '"serious mail"'
bc10: 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a  ;.</codeblock>..
bc20: 3c 74 63 6c 3e 68 64 5f 66 72 61 67 6d 65 6e 74  <tcl>hd_fragment
bc30: 20 73 6e 69 70 70 65 74 20 73 6e 69 70 70 65 74   snippet snippet
bc40: 3c 2f 74 63 6c 3e 0a 3c 68 32 3e 54 68 65 20 53  </tcl>.<h2>The S
bc50: 6e 69 70 70 65 74 20 46 75 6e 63 74 69 6f 6e 3c  nippet Function<
bc60: 2f 68 32 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20  /h2>..<p>.  The 
bc70: 73 6e 69 70 70 65 74 20 66 75 6e 63 74 69 6f 6e  snippet function
bc80: 20 69 73 20 75 73 65 64 20 74 6f 20 63 72 65 61   is used to crea
bc90: 74 65 20 66 6f 72 6d 61 74 74 65 64 20 66 72 61  te formatted fra
bca0: 67 6d 65 6e 74 73 20 6f 66 20 64 6f 63 75 6d 65  gments of docume
bcb0: 6e 74 20 74 65 78 74 0a 20 20 66 6f 72 20 64 69  nt text.  for di
bcc0: 73 70 6c 61 79 20 61 73 20 70 61 72 74 20 6f 66  splay as part of
bcd0: 20 61 20 66 75 6c 6c 2d 74 65 78 74 20 71 75 65   a full-text que
bce0: 72 79 20 72 65 73 75 6c 74 73 20 72 65 70 6f 72  ry results repor
bcf0: 74 2e 20 54 68 65 20 73 6e 69 70 70 65 74 20 66  t. The snippet f
bd00: 75 6e 63 74 69 6f 6e 20 0a 20 20 6d 61 79 20 62  unction .  may b
bd10: 65 20 70 61 73 73 65 64 20 62 65 74 77 65 65 6e  e passed between
bd20: 20 6f 6e 65 20 61 6e 64 20 73 69 78 20 61 72 67   one and six arg
bd30: 75 6d 65 6e 74 73 2c 20 61 73 20 66 6f 6c 6c 6f  uments, as follo
bd40: 77 73 3a 0a 0a 3c 74 61 62 6c 65 20 73 74 72 69  ws:..<table stri
bd50: 70 65 64 3d 31 3e 0a 20 20 3c 74 72 3e 3c 74 68  ped=1>.  <tr><th
bd60: 3e 41 72 67 75 6d 65 6e 74 20 3c 74 68 3e 44 65  >Argument <th>De
bd70: 66 61 75 6c 74 20 56 61 6c 75 65 20 3c 74 68 3e  fault Value <th>
bd80: 44 65 73 63 72 69 70 74 69 6f 6e 0a 20 20 3c 74  Description.  <t
bd90: 72 3e 3c 74 64 3e 30 20 3c 74 64 3e 4e 2f 41 0a  r><td>0 <td>N/A.
bda0: 20 20 20 20 20 20 3c 74 64 3e 20 54 68 65 20 66        <td> The f
bdb0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
bdc0: 20 74 68 65 20 73 6e 69 70 70 65 74 20 66 75 6e   the snippet fun
bdd0: 63 74 69 6f 6e 20 6d 75 73 74 20 61 6c 77 61 79  ction must alway
bde0: 73 20 62 65 20 74 68 65 20 5b 46 54 53 20 68 69  s be the [FTS hi
bdf0: 64 64 65 6e 20 63 6f 6c 75 6d 6e 5d 0a 20 20 20  dden column].   
be00: 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 46          of the F
be10: 54 53 20 74 61 62 6c 65 20 62 65 69 6e 67 20 71  TS table being q
be20: 75 65 72 69 65 64 20 61 6e 64 20 66 72 6f 6d 20  ueried and from 
be30: 77 68 69 63 68 20 74 68 65 20 73 6e 69 70 70 65  which the snippe
be40: 74 20 69 73 20 74 6f 20 62 65 20 74 61 6b 65 6e  t is to be taken
be50: 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20 20 20  .  The.         
be60: 20 20 5b 46 54 53 20 68 69 64 64 65 6e 20 63 6f    [FTS hidden co
be70: 6c 75 6d 6e 5d 20 69 73 20 61 6e 20 61 75 74 6f  lumn] is an auto
be80: 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e 65 72 61  matically genera
be90: 74 65 64 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20  ted column with 
bea0: 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73  the same name as
beb0: 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20   the.           
bec0: 46 54 53 20 74 61 62 6c 65 20 69 74 73 65 6c 66  FTS table itself
bed0: 2e 0a 20 20 3c 74 72 3e 3c 74 64 3e 31 20 3c 74  ..  <tr><td>1 <t
bee0: 64 3e 22 26 6c 74 3b 62 26 67 74 3b 22 0a 20 20  d>"&lt;b&gt;".  
bef0: 20 20 20 20 3c 74 64 3e 20 54 68 65 20 22 73 74      <td> The "st
bf00: 61 72 74 20 6d 61 74 63 68 22 20 74 65 78 74 2e  art match" text.
bf10: 0a 20 20 3c 74 72 3e 3c 74 64 3e 32 20 3c 74 64  .  <tr><td>2 <td
bf20: 3e 22 26 6c 74 3b 2f 62 26 67 74 3b 22 0a 20 20  >"&lt;/b&gt;".  
bf30: 20 20 20 20 3c 74 64 3e 20 54 68 65 20 22 65 6e      <td> The "en
bf40: 64 20 6d 61 74 63 68 22 20 74 65 78 74 2e 0a 20  d match" text.. 
bf50: 20 3c 74 72 3e 3c 74 64 3e 33 20 3c 74 64 3e 22   <tr><td>3 <td>"
bf60: 26 6c 74 3b 62 26 67 74 3b 2e 2e 2e 26 6c 74 3b  &lt;b&gt;...&lt;
bf70: 2f 62 26 67 74 3b 22 0a 20 20 20 20 20 20 3c 74  /b&gt;".      <t
bf80: 64 3e 20 54 68 65 20 22 65 6c 6c 69 70 73 65 73  d> The "ellipses
bf90: 22 20 74 65 78 74 2e 0a 20 20 3c 74 72 3e 3c 74  " text..  <tr><t
bfa0: 64 3e 34 20 3c 74 64 3e 2d 31 0a 20 20 20 20 20  d>4 <td>-1.     
bfb0: 20 3c 74 64 3e 20 54 68 65 20 46 54 53 20 74 61   <td> The FTS ta
bfc0: 62 6c 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  ble column numbe
bfd0: 72 20 74 6f 20 65 78 74 72 61 63 74 20 74 68 65  r to extract the
bfe0: 20 72 65 74 75 72 6e 65 64 20 66 72 61 67 6d 65   returned fragme
bff0: 6e 74 73 20 6f 66 0a 20 20 20 20 20 20 20 20 20  nts of.         
c000: 20 20 74 65 78 74 20 66 72 6f 6d 2e 20 43 6f 6c    text from. Col
c010: 75 6d 6e 73 20 61 72 65 20 6e 75 6d 62 65 72 65  umns are numbere
c020: 64 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72  d from left to r
c030: 69 67 68 74 20 73 74 61 72 74 69 6e 67 20 77 69  ight starting wi
c040: 74 68 0a 20 20 20 20 20 20 20 20 20 20 20 7a 65  th.           ze
c050: 72 6f 2e 20 41 20 6e 65 67 61 74 69 76 65 20 76  ro. A negative v
c060: 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73 20 74  alue indicates t
c070: 68 61 74 20 74 68 65 20 74 65 78 74 20 6d 61 79  hat the text may
c080: 20 62 65 20 65 78 74 72 61 63 74 65 64 0a 20 20   be extracted.  
c090: 20 20 20 20 20 20 20 20 20 66 72 6f 6d 20 61 6e           from an
c0a0: 79 20 63 6f 6c 75 6d 6e 2e 0a 20 20 3c 74 72 3e  y column..  <tr>
c0b0: 3c 74 64 3e 35 20 3c 74 64 3e 2d 31 35 0a 20 20  <td>5 <td>-15.  
c0c0: 20 20 20 20 3c 74 64 3e 20 54 68 65 20 61 62 73      <td> The abs
c0d0: 6f 6c 75 74 65 20 76 61 6c 75 65 20 6f 66 20 74  olute value of t
c0e0: 68 69 73 20 69 6e 74 65 67 65 72 20 61 72 67 75  his integer argu
c0f0: 6d 65 6e 74 20 69 73 20 75 73 65 64 20 61 73 20  ment is used as 
c100: 74 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 20  the .           
c110: 28 61 70 70 72 6f 78 69 6d 61 74 65 29 20 6e 75  (approximate) nu
c120: 6d 62 65 72 20 6f 66 20 74 6f 6b 65 6e 73 20 74  mber of tokens t
c130: 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20 74 68 65  o include in the
c140: 20 72 65 74 75 72 6e 65 64 20 74 65 78 74 20 0a   returned text .
c150: 20 20 20 20 20 20 20 20 20 20 20 76 61 6c 75 65             value
c160: 2e 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c  . The maximum al
c170: 6c 6f 77 61 62 6c 65 20 61 62 73 6f 6c 75 74 65  lowable absolute
c180: 20 76 61 6c 75 65 20 69 73 20 36 34 2e 20 54 68   value is 64. Th
c190: 65 20 76 61 6c 75 65 20 6f 66 0a 20 20 20 20 20  e value of.     
c1a0: 20 20 20 20 20 20 74 68 69 73 20 61 72 67 75 6d        this argum
c1b0: 65 6e 74 20 69 73 20 72 65 66 65 72 72 65 64 20  ent is referred 
c1c0: 74 6f 20 61 73 20 3c 69 3e 4e 3c 2f 69 3e 20 69  to as <i>N</i> i
c1d0: 6e 20 74 68 65 20 64 69 73 63 75 73 73 69 6f 6e  n the discussion
c1e0: 20 62 65 6c 6f 77 2e 0a 3c 2f 74 61 62 6c 65 3e   below..</table>
c1f0: 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 73 6e 69 70  ..<p>.  The snip
c200: 70 65 74 20 66 75 6e 63 74 69 6f 6e 20 66 69 72  pet function fir
c210: 73 74 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66  st attempts to f
c220: 69 6e 64 20 61 20 66 72 61 67 6d 65 6e 74 20 6f  ind a fragment o
c230: 66 20 74 65 78 74 20 63 6f 6e 73 69 73 74 69 6e  f text consistin
c240: 67 0a 20 20 6f 66 20 3c 69 3e 7c 4e 7c 3c 2f 69  g.  of <i>|N|</i
c250: 3e 20 74 6f 6b 65 6e 73 20 77 69 74 68 69 6e 20  > tokens within 
c260: 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
c270: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 74  that contains at
c280: 20 6c 65 61 73 74 20 6f 6e 65 20 70 68 72 61 73   least one phras
c290: 65 20 0a 20 20 6d 61 74 63 68 20 66 6f 72 20 65  e .  match for e
c2a0: 61 63 68 20 6d 61 74 63 68 61 62 6c 65 20 70 68  ach matchable ph
c2b0: 72 61 73 65 20 6d 61 74 63 68 65 64 20 73 6f 6d  rase matched som
c2c0: 65 77 68 65 72 65 20 69 6e 20 74 68 65 20 63 75  ewhere in the cu
c2d0: 72 72 65 6e 74 20 72 6f 77 2c 20 0a 20 20 77 68  rrent row, .  wh
c2e0: 65 72 65 20 3c 69 3e 7c 4e 7c 3c 2f 69 3e 20 69  ere <i>|N|</i> i
c2f0: 73 20 74 68 65 20 61 62 73 6f 6c 75 74 65 20 76  s the absolute v
c300: 61 6c 75 65 20 6f 66 20 74 68 65 20 73 69 78 74  alue of the sixt
c310: 68 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  h argument passe
c320: 64 20 74 6f 20 74 68 65 0a 20 20 73 6e 69 70 70  d to the.  snipp
c330: 65 74 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20  et function. If 
c340: 74 68 65 20 74 65 78 74 20 73 74 6f 72 65 64 20  the text stored 
c350: 69 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75  in a single colu
c360: 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 6c 65 73 73  mn contains less
c370: 20 74 68 61 6e 0a 20 20 3c 69 3e 7c 4e 7c 3c 2f   than.  <i>|N|</
c380: 69 3e 20 74 6f 6b 65 6e 73 2c 20 74 68 65 6e 20  i> tokens, then 
c390: 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6c 75 6d  the entire colum
c3a0: 6e 20 76 61 6c 75 65 20 69 73 20 63 6f 6e 73 69  n value is consi
c3b0: 64 65 72 65 64 2e 20 54 65 78 74 20 66 72 61 67  dered. Text frag
c3c0: 6d 65 6e 74 73 20 0a 20 20 6d 61 79 20 6e 6f 74  ments .  may not
c3d0: 20 73 70 61 6e 20 6d 75 6c 74 69 70 6c 65 20 63   span multiple c
c3e0: 6f 6c 75 6d 6e 73 2e 0a 0a 3c 70 3e 0a 20 20 49  olumns...<p>.  I
c3f0: 66 20 73 75 63 68 20 61 20 74 65 78 74 20 66 72  f such a text fr
c400: 61 67 6d 65 6e 74 20 63 61 6e 20 62 65 20 66 6f  agment can be fo
c410: 75 6e 64 2c 20 69 74 20 69 73 20 72 65 74 75 72  und, it is retur
c420: 6e 65 64 20 77 69 74 68 20 74 68 65 20 66 6f 6c  ned with the fol
c430: 6c 6f 77 69 6e 67 0a 20 20 6d 6f 64 69 66 69 63  lowing.  modific
c440: 61 74 69 6f 6e 73 3a 0a 0a 3c 75 6c 3e 0a 20 20  ations:..<ul>.  
c450: 3c 6c 69 3e 20 49 66 20 74 68 65 20 74 65 78 74  <li> If the text
c460: 20 66 72 61 67 6d 65 6e 74 20 64 6f 65 73 20 6e   fragment does n
c470: 6f 74 20 62 65 67 69 6e 20 61 74 20 74 68 65 20  ot begin at the 
c480: 73 74 61 72 74 20 6f 66 20 61 20 63 6f 6c 75 6d  start of a colum
c490: 6e 20 76 61 6c 75 65 2c 0a 20 20 20 20 20 20 20  n value,.       
c4a0: 74 68 65 20 22 65 6c 6c 69 70 73 65 73 22 20 74  the "ellipses" t
c4b0: 65 78 74 20 69 73 20 70 72 65 70 65 6e 64 65 64  ext is prepended
c4c0: 20 74 6f 20 69 74 2e 0a 20 20 3c 6c 69 3e 20 49   to it..  <li> I
c4d0: 66 20 74 68 65 20 74 65 78 74 20 66 72 61 67 6d  f the text fragm
c4e0: 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20 66 69 6e  ent does not fin
c4f0: 69 73 68 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ish at the end o
c500: 66 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  f a column value
c510: 2c 0a 20 20 20 20 20 20 20 74 68 65 20 22 65 6c  ,.       the "el
c520: 6c 69 70 73 65 73 22 20 74 65 78 74 20 69 73 20  lipses" text is 
c530: 61 70 70 65 6e 64 65 64 20 74 6f 20 69 74 2e 0a  appended to it..
c540: 20 20 3c 6c 69 3e 20 46 6f 72 20 65 61 63 68 20    <li> For each 
c550: 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 74 65 78  token in the tex
c560: 74 20 66 72 61 67 6d 65 6e 74 20 74 68 61 74 20  t fragment that 
c570: 69 73 20 70 61 72 74 20 6f 66 20 61 20 70 68 72  is part of a phr
c580: 61 73 65 20 6d 61 74 63 68 2c 0a 20 20 20 20 20  ase match,.     
c590: 20 20 74 68 65 20 22 73 74 61 72 74 20 6d 61 74    the "start mat
c5a0: 63 68 22 20 74 65 78 74 20 69 73 20 69 6e 73 65  ch" text is inse
c5b0: 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20 66 72  rted into the fr
c5c0: 61 67 6d 65 6e 74 20 62 65 66 6f 72 65 20 74 68  agment before th
c5d0: 65 20 74 6f 6b 65 6e 2c 0a 20 20 20 20 20 20 20  e token,.       
c5e0: 61 6e 64 20 74 68 65 20 22 65 6e 64 20 6d 61 74  and the "end mat
c5f0: 63 68 22 20 74 65 78 74 20 69 73 20 69 6e 73 65  ch" text is inse
c600: 72 74 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  rted immediately
c610: 20 61 66 74 65 72 20 69 74 2e 0a 3c 2f 75 6c 3e   after it..</ul>
c620: 0a 0a 3c 70 3e 0a 20 20 49 66 20 6d 6f 72 65 20  ..<p>.  If more 
c630: 74 68 61 6e 20 6f 6e 65 20 73 75 63 68 20 66 72  than one such fr
c640: 61 67 6d 65 6e 74 20 63 61 6e 20 62 65 20 66 6f  agment can be fo
c650: 75 6e 64 2c 20 74 68 65 6e 20 66 72 61 67 6d 65  und, then fragme
c660: 6e 74 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  nts that contain
c670: 0a 20 20 61 20 6c 61 72 67 65 72 20 6e 75 6d 62  .  a larger numb
c680: 65 72 20 6f 66 20 22 65 78 74 72 61 22 20 70 68  er of "extra" ph
c690: 72 61 73 65 20 6d 61 74 63 68 65 73 20 61 72 65  rase matches are
c6a0: 20 66 61 76 6f 75 72 65 64 2e 20 54 68 65 20 73   favoured. The s
c6b0: 74 61 72 74 20 6f 66 0a 20 20 74 68 65 20 73 65  tart of.  the se
c6c0: 6c 65 63 74 65 64 20 74 65 78 74 20 66 72 61 67  lected text frag
c6d0: 6d 65 6e 74 20 6d 61 79 20 62 65 20 6d 6f 76 65  ment may be move
c6e0: 64 20 61 20 66 65 77 20 74 6f 6b 65 6e 73 20 66  d a few tokens f
c6f0: 6f 72 77 61 72 64 20 6f 72 20 62 61 63 6b 77 61  orward or backwa
c700: 72 64 0a 20 20 74 6f 20 61 74 74 65 6d 70 74 20  rd.  to attempt 
c710: 74 6f 20 63 6f 6e 63 65 6e 74 72 61 74 65 20 74  to concentrate t
c720: 68 65 20 70 68 72 61 73 65 20 6d 61 74 63 68 65  he phrase matche
c730: 73 20 74 6f 77 61 72 64 20 74 68 65 20 63 65 6e  s toward the cen
c740: 74 65 72 20 6f 66 20 74 68 65 0a 20 20 66 72 61  ter of the.  fra
c750: 67 6d 65 6e 74 2e 0a 0a 3c 70 3e 0a 20 20 41 73  gment...<p>.  As
c760: 73 75 6d 69 6e 67 20 3c 69 3e 4e 3c 2f 69 3e 20  suming <i>N</i> 
c770: 69 73 20 61 20 70 6f 73 69 74 69 76 65 20 76 61  is a positive va
c780: 6c 75 65 2c 20 69 66 20 6e 6f 20 66 72 61 67 6d  lue, if no fragm
c790: 65 6e 74 73 20 63 61 6e 20 62 65 20 66 6f 75 6e  ents can be foun
c7a0: 64 20 74 68 61 74 0a 20 20 63 6f 6e 74 61 69 6e  d that.  contain
c7b0: 20 61 6e 20 70 68 72 61 73 65 20 6d 61 74 63 68   an phrase match
c7c0: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
c7d0: 6f 20 65 61 63 68 20 6d 61 74 63 68 61 62 6c 65  o each matchable
c7e0: 20 70 68 72 61 73 65 2c 20 74 68 65 20 73 6e 69   phrase, the sni
c7f0: 70 70 65 74 0a 20 20 66 75 6e 63 74 69 6f 6e 20  ppet.  function 
c800: 61 74 74 65 6d 70 74 73 20 74 6f 20 66 69 6e 64  attempts to find
c810: 20 74 77 6f 20 66 72 61 67 6d 65 6e 74 73 20 6f   two fragments o
c820: 66 20 61 70 70 72 6f 78 69 6d 61 74 65 6c 79 20  f approximately 
c830: 3c 69 3e 4e 3c 2f 69 3e 2f 32 20 74 6f 6b 65 6e  <i>N</i>/2 token
c840: 73 0a 20 20 74 68 61 74 20 62 65 74 77 65 65 6e  s.  that between
c850: 20 74 68 65 6d 20 63 6f 6e 74 61 69 6e 20 61 74   them contain at
c860: 20 6c 65 61 73 74 20 6f 6e 65 20 70 68 72 61 73   least one phras
c870: 65 20 6d 61 74 63 68 20 66 6f 72 20 65 61 63 68  e match for each
c880: 20 6d 61 74 63 68 61 62 6c 65 20 70 68 72 61 73   matchable phras
c890: 65 0a 20 20 6d 61 74 63 68 65 64 20 62 79 20 74  e.  matched by t
c8a0: 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 2e 20  he current row. 
c8b0: 49 66 20 74 68 69 73 20 66 61 69 6c 73 2c 20 61  If this fails, a
c8c0: 74 74 65 6d 70 74 73 20 61 72 65 20 6d 61 64 65  ttempts are made
c8d0: 20 74 6f 20 66 69 6e 64 20 74 68 72 65 65 0a 20   to find three. 
c8e0: 20 66 72 61 67 6d 65 6e 74 73 20 6f 66 20 3c 69   fragments of <i
c8f0: 3e 4e 3c 2f 69 3e 2f 33 20 74 6f 6b 65 6e 73 20  >N</i>/3 tokens 
c900: 65 61 63 68 20 61 6e 64 20 66 69 6e 61 6c 6c 79  each and finally
c910: 20 66 6f 75 72 20 3c 69 3e 4e 3c 2f 69 3e 2f 34   four <i>N</i>/4
c920: 20 74 6f 6b 65 6e 0a 20 20 66 72 61 67 6d 65 6e   token.  fragmen
c930: 74 73 2e 20 49 66 20 61 20 73 65 74 20 6f 66 20  ts. If a set of 
c940: 66 6f 75 72 20 66 72 61 67 6d 65 6e 74 73 20 63  four fragments c
c950: 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 20 74  annot be found t
c960: 68 61 74 20 65 6e 63 6f 6d 70 61 73 73 65 73 20  hat encompasses 
c970: 74 68 65 0a 20 20 72 65 71 75 69 72 65 64 20 70  the.  required p
c980: 68 72 61 73 65 20 6d 61 74 63 68 65 73 2c 20 74  hrase matches, t
c990: 68 65 20 66 6f 75 72 20 66 72 61 67 6d 65 6e 74  he four fragment
c9a0: 73 20 6f 66 20 3c 69 3e 4e 3c 2f 69 3e 2f 34 20  s of <i>N</i>/4 
c9b0: 74 6f 6b 65 6e 73 20 74 68 61 74 20 70 72 6f 76  tokens that prov
c9c0: 69 64 65 0a 20 20 74 68 65 20 62 65 73 74 20 63  ide.  the best c
c9d0: 6f 76 65 72 61 67 65 20 61 72 65 20 73 65 6c 65  overage are sele
c9e0: 63 74 65 64 2e 0a 0a 3c 70 3e 0a 20 20 49 66 20  cted...<p>.  If 
c9f0: 3c 69 3e 4e 3c 2f 69 3e 20 69 73 20 61 20 6e 65  <i>N</i> is a ne
ca00: 67 61 74 69 76 65 20 76 61 6c 75 65 2c 20 61 6e  gative value, an
ca10: 64 20 6e 6f 20 73 69 6e 67 6c 65 20 66 72 61 67  d no single frag
ca20: 6d 65 6e 74 20 63 61 6e 20 62 65 20 66 6f 75 6e  ment can be foun
ca30: 64 20 0a 20 20 63 6f 6e 74 61 69 6e 69 6e 67 20  d .  containing 
ca40: 74 68 65 20 72 65 71 75 69 72 65 64 20 70 68 72  the required phr
ca50: 61 73 65 20 6d 61 74 63 68 65 73 2c 20 74 68 65  ase matches, the
ca60: 20 73 6e 69 70 70 65 74 20 66 75 6e 63 74 69 6f   snippet functio
ca70: 6e 20 73 65 61 72 63 68 65 73 0a 20 20 66 6f 72  n searches.  for
ca80: 20 74 77 6f 20 66 72 61 67 6d 65 6e 74 73 20 6f   two fragments o
ca90: 66 20 3c 69 3e 7c 4e 7c 3c 2f 69 3e 20 74 6f 6b  f <i>|N|</i> tok
caa0: 65 6e 73 20 65 61 63 68 2c 20 74 68 65 6e 20 74  ens each, then t
cab0: 68 72 65 65 2c 20 74 68 65 6e 20 66 6f 75 72 2e  hree, then four.
cac0: 20 49 6e 0a 20 20 6f 74 68 65 72 20 77 6f 72 64   In.  other word
cad0: 73 2c 20 69 66 20 74 68 65 20 73 70 65 63 69 66  s, if the specif
cae0: 69 65 64 20 76 61 6c 75 65 20 6f 66 20 3c 69 3e  ied value of <i>
caf0: 4e 3c 2f 69 3e 20 69 73 20 6e 65 67 61 74 69 76  N</i> is negativ
cb00: 65 2c 20 74 68 65 20 73 69 7a 65 73 0a 20 20 6f  e, the sizes.  o
cb10: 66 20 74 68 65 20 66 72 61 67 6d 65 6e 74 73 20  f the fragments 
cb20: 69 73 20 6e 6f 74 20 64 65 63 72 65 61 73 65 64  is not decreased
cb30: 20 69 66 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   if more than on
cb40: 65 20 66 72 61 67 6d 65 6e 74 20 69 73 20 72 65  e fragment is re
cb50: 71 75 69 72 65 64 0a 20 20 74 6f 20 70 72 6f 76  quired.  to prov
cb60: 69 64 65 20 74 68 65 20 64 65 73 69 72 65 64 20  ide the desired 
cb70: 70 68 72 61 73 65 20 6d 61 74 63 68 20 63 6f 76  phrase match cov
cb80: 65 72 61 67 65 2e 0a 0a 3c 70 3e 0a 20 20 41 66  erage...<p>.  Af
cb90: 74 65 72 20 74 68 65 20 3c 69 3e 4d 3c 2f 69 3e  ter the <i>M</i>
cba0: 20 66 72 61 67 6d 65 6e 74 73 20 68 61 76 65 20   fragments have 
cbb0: 62 65 65 6e 20 6c 6f 63 61 74 65 64 2c 20 77 68  been located, wh
cbc0: 65 72 65 20 3c 69 3e 4d 3c 2f 69 3e 20 69 73 20  ere <i>M</i> is 
cbd0: 62 65 74 77 65 65 6e 0a 20 20 74 77 6f 20 61 6e  between.  two an
cbe0: 64 20 66 6f 75 72 20 61 73 20 64 65 73 63 72 69  d four as descri
cbf0: 62 65 64 20 69 6e 20 74 68 65 20 70 61 72 61 67  bed in the parag
cc00: 72 61 70 68 73 20 61 62 6f 76 65 2c 20 74 68 65  raphs above, the
cc10: 79 20 61 72 65 20 6a 6f 69 6e 65 64 20 74 6f 67  y are joined tog
cc20: 65 74 68 65 72 0a 20 20 69 6e 20 73 6f 72 74 65  ether.  in sorte
cc30: 64 20 6f 72 64 65 72 20 77 69 74 68 20 74 68 65  d order with the
cc40: 20 22 65 6c 6c 69 70 73 65 73 22 20 74 65 78 74   "ellipses" text
cc50: 20 73 65 70 61 72 61 74 69 6e 67 20 74 68 65 6d   separating them
cc60: 2e 20 54 68 65 20 74 68 72 65 65 20 0a 20 20 6d  . The three .  m
cc70: 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 65 6e 75  odifications enu
cc80: 6d 65 72 61 74 65 64 20 65 61 72 6c 69 65 72 20  merated earlier 
cc90: 61 72 65 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e  are performed on
cca0: 20 74 68 65 20 74 65 78 74 20 62 65 66 6f 72 65   the text before
ccb0: 20 69 74 20 69 73 20 0a 20 20 72 65 74 75 72 6e   it is .  return
ccc0: 65 64 2e 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e  ed...<codeblock>
ccd0: 0a 20 20 3c 62 3e 4e 6f 74 65 3a 20 49 6e 20 74  .  <b>Note: In t
cce0: 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20 65 78 61  his block of exa
ccf0: 6d 70 6c 65 73 2c 20 6e 65 77 6c 69 6e 65 73 20  mples, newlines 
cd00: 61 6e 64 20 77 68 69 74 65 73 70 61 63 65 20 63  and whitespace c
cd10: 68 61 72 61 63 74 65 72 73 20 68 61 76 65 0a 20  haracters have. 
cd20: 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 20 69   been inserted i
cd30: 6e 74 6f 20 74 68 65 20 64 6f 63 75 6d 65 6e 74  nto the document
cd40: 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74   inserted into t
cd50: 68 65 20 46 54 53 20 74 61 62 6c 65 2c 20 61 6e  he FTS table, an
cd60: 64 20 74 68 65 20 65 78 70 65 63 74 65 64 0a 20  d the expected. 
cd70: 20 72 65 73 75 6c 74 73 20 64 65 73 63 72 69 62   results describ
cd80: 65 64 20 69 6e 20 53 51 4c 20 63 6f 6d 6d 65 6e  ed in SQL commen
cd90: 74 73 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65  ts. This is done
cda0: 20 74 6f 20 65 6e 68 61 6e 63 65 20 72 65 61 64   to enhance read
cdb0: 61 62 69 6c 69 74 79 20 6f 6e 6c 79 2c 0a 20 20  ability only,.  
cdc0: 74 68 65 79 20 77 6f 75 6c 64 20 6e 6f 74 20 62  they would not b
cdd0: 65 20 70 72 65 73 65 6e 74 20 69 6e 20 61 63 74  e present in act
cde0: 75 61 6c 20 53 51 4c 69 74 65 20 63 6f 6d 6d 61  ual SQLite comma
cdf0: 6e 64 73 20 6f 72 20 6f 75 74 70 75 74 2e 3c 2f  nds or output.</
ce00: 62 3e 0a 0a 20 20 3c 69 3e 2d 2d 20 43 72 65 61  b>..  <i>-- Crea
ce10: 74 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20  te and populate 
ce20: 61 6e 20 46 54 53 20 74 61 62 6c 65 2e 3c 2f 69  an FTS table.</i
ce30: 3e 0a 20 20 43 52 45 41 54 45 20 56 49 52 54 55  >.  CREATE VIRTU
ce40: 41 4c 20 54 41 42 4c 45 20 74 65 78 74 20 55 53  AL TABLE text US
ce50: 49 4e 47 20 66 74 73 34 28 29 3b 0a 20 20 49 4e  ING fts4();.  IN
ce60: 53 45 52 54 20 49 4e 54 4f 20 74 65 78 74 20 56  SERT INTO text V
ce70: 41 4c 55 45 53 28 27 0a 20 20 20 20 44 75 72 69  ALUES('.    Duri
ce80: 6e 67 20 33 30 20 4e 6f 76 2d 31 20 44 65 63 2c  ng 30 Nov-1 Dec,
ce90: 20 32 2d 33 6f 43 20 64 72 6f 70 73 2e 20 43 6f   2-3oC drops. Co
cea0: 6f 6c 20 69 6e 20 74 68 65 20 75 70 70 65 72 20  ol in the upper 
ceb0: 70 6f 72 74 69 6f 6e 2c 20 6d 69 6e 69 6d 75 6d  portion, minimum
cec0: 20 74 65 6d 70 65 72 61 74 75 72 65 20 31 34 2d   temperature 14-
ced0: 31 36 6f 43 20 0a 20 20 20 20 61 6e 64 20 63 6f  16oC .    and co
cee0: 6f 6c 20 65 6c 73 65 77 68 65 72 65 2c 20 6d 69  ol elsewhere, mi
cef0: 6e 69 6d 75 6d 20 74 65 6d 70 65 72 61 74 75 72  nimum temperatur
cf00: 65 20 31 37 2d 32 30 6f 43 2e 20 43 6f 6c 64 20  e 17-20oC. Cold 
cf10: 74 6f 20 76 65 72 79 20 63 6f 6c 64 20 6f 6e 20  to very cold on 
cf20: 6d 6f 75 6e 74 61 69 6e 74 6f 70 73 2c 20 0a 20  mountaintops, . 
cf30: 20 20 20 6d 69 6e 69 6d 75 6d 20 74 65 6d 70 65     minimum tempe
cf40: 72 61 74 75 72 65 20 36 2d 31 32 6f 43 2e 20 4e  rature 6-12oC. N
cf50: 6f 72 74 68 65 61 73 74 65 72 6c 79 20 77 69 6e  ortheasterly win
cf60: 64 73 20 31 35 2d 33 30 20 6b 6d 2f 68 72 2e 20  ds 15-30 km/hr. 
cf70: 41 66 74 65 72 20 74 68 61 74 2c 20 74 65 6d 70  After that, temp
cf80: 65 72 61 74 75 72 65 20 0a 20 20 20 20 69 6e 63  erature .    inc
cf90: 72 65 61 73 65 73 2e 20 4e 6f 72 74 68 65 61 73  reases. Northeas
cfa0: 74 65 72 6c 79 20 77 69 6e 64 73 20 31 35 2d 33  terly winds 15-3
cfb0: 30 20 6b 6d 2f 68 72 2e 20 20 20 20 20 0a 20 20  0 km/hr.     .  
cfc0: 27 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68 65  ');..  <i>-- The
cfd0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72 79   following query
cfe0: 20 72 65 74 75 72 6e 73 20 74 68 65 20 74 65 78   returns the tex
cff0: 74 20 76 61 6c 75 65 3a 3c 2f 69 3e 0a 20 20 3c  t value:</i>.  <
d000: 69 3e 2d 2d 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  i>--</i>.  <i>--
d010: 20 20 20 22 26 6c 74 3b 62 26 67 74 3b 2e 2e 2e     "&lt;b&gt;...
d020: 26 6c 74 3b 2f 62 26 67 74 3b 63 6f 6f 6c 20 65  &lt;/b&gt;cool e
d030: 6c 73 65 77 68 65 72 65 2c 20 6d 69 6e 69 6d 75  lsewhere, minimu
d040: 6d 20 74 65 6d 70 65 72 61 74 75 72 65 20 31 37  m temperature 17
d050: 2d 32 30 6f 43 2e 20 26 6c 74 3b 62 26 67 74 3b  -20oC. &lt;b&gt;
d060: 43 6f 6c 64 26 6c 74 3b 2f 62 26 67 74 3b 20 74  Cold&lt;/b&gt; t
d070: 6f 20 76 65 72 79 20 3c 2f 69 3e 0a 20 20 3c 69  o very </i>.  <i
d080: 3e 2d 2d 20 20 20 20 26 6c 74 3b 62 26 67 74 3b  >--    &lt;b&gt;
d090: 63 6f 6c 64 26 6c 74 3b 2f 62 26 67 74 3b 20 6f  cold&lt;/b&gt; o
d0a0: 6e 20 6d 6f 75 6e 74 61 69 6e 74 6f 70 73 2c 20  n mountaintops, 
d0b0: 6d 69 6e 69 6d 75 6d 20 74 65 6d 70 65 72 61 74  minimum temperat
d0c0: 75 72 65 20 36 26 6c 74 3b 62 26 67 74 3b 2e 2e  ure 6&lt;b&gt;..
d0d0: 2e 26 6c 74 3b 2f 62 26 67 74 3b 22 2e 3c 2f 69  .&lt;/b&gt;".</i
d0e0: 3e 0a 20 20 3c 69 3e 2d 2d 3c 2f 69 3e 0a 20 20  >.  <i>--</i>.  
d0f0: 53 45 4c 45 43 54 20 73 6e 69 70 70 65 74 28 74  SELECT snippet(t
d100: 65 78 74 29 20 46 52 4f 4d 20 74 65 78 74 20 57  ext) FROM text W
d110: 48 45 52 45 20 74 65 78 74 20 4d 41 54 43 48 20  HERE text MATCH 
d120: 27 63 6f 6c 64 27 3b 0a 0a 20 20 3c 69 3e 2d 2d  'cold';..  <i>--
d130: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71   The following q
d140: 75 65 72 79 20 72 65 74 75 72 6e 73 20 74 68 65  uery returns the
d150: 20 74 65 78 74 20 76 61 6c 75 65 3a 3c 2f 69 3e   text value:</i>
d160: 0a 20 20 3c 69 3e 2d 2d 3c 2f 69 3e 0a 20 20 3c  .  <i>--</i>.  <
d170: 69 3e 2d 2d 20 20 20 22 2e 2e 2e 74 68 65 20 75  i>--   "...the u
d180: 70 70 65 72 20 70 6f 72 74 69 6f 6e 2c 20 26 23  pper portion, &#
d190: 39 31 3b 6d 69 6e 69 6d 75 6d 26 23 39 33 3b 20  91;minimum&#93; 
d1a0: 26 23 39 31 3b 74 65 6d 70 65 72 61 74 75 72 65  &#91;temperature
d1b0: 26 23 39 33 3b 20 31 34 2d 31 36 6f 43 20 61 6e  &#93; 14-16oC an
d1c0: 64 20 63 6f 6f 6c 20 65 6c 73 65 77 68 65 72 65  d cool elsewhere
d1d0: 2c 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20  ,</i>.  <i>--   
d1e0: 20 26 23 39 31 3b 6d 69 6e 69 6d 75 6d 26 23 39   &#91;minimum&#9
d1f0: 33 3b 20 26 23 39 31 3b 74 65 6d 70 65 72 61 74  3; &#91;temperat
d200: 75 72 65 26 23 39 33 3b 20 31 37 2d 32 30 6f 43  ure&#93; 17-20oC
d210: 2e 20 43 6f 6c 64 2e 2e 2e 22 3c 2f 69 3e 0a 20  . Cold..."</i>. 
d220: 20 3c 69 3e 2d 2d 3c 2f 69 3e 0a 20 20 53 45 4c   <i>--</i>.  SEL
d230: 45 43 54 20 73 6e 69 70 70 65 74 28 74 65 78 74  ECT snippet(text
d240: 2c 20 27 26 23 39 31 3b 20 27 26 23 39 33 3b 27  , '&#91; '&#93;'
d250: 2c 20 27 2e 2e 2e 27 29 20 46 52 4f 4d 20 74 65  , '...') FROM te
d260: 78 74 20 57 48 45 52 45 20 74 65 78 74 20 4d 41  xt WHERE text MA
d270: 54 43 48 20 27 22 6d 69 6e 2a 20 74 65 6d 2a 22  TCH '"min* tem*"
d280: 27 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a  '.</codeblock>..
d290: 3c 68 32 20 69 64 3d 6d 61 74 63 68 69 6e 66 6f  <h2 id=matchinfo
d2a0: 20 74 61 67 73 3d 6d 61 74 63 68 69 6e 66 6f 3e   tags=matchinfo>
d2b0: 54 68 65 20 4d 61 74 63 68 69 6e 66 6f 20 46 75  The Matchinfo Fu
d2c0: 6e 63 74 69 6f 6e 3c 2f 68 32 3e 0a 0a 3c 70 3e  nction</h2>..<p>
d2d0: 0a 20 20 54 68 65 20 6d 61 74 63 68 69 6e 66 6f  .  The matchinfo
d2e0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
d2f0: 73 20 61 20 62 6c 6f 62 20 76 61 6c 75 65 2e 20  s a blob value. 
d300: 49 66 20 69 74 20 69 73 20 75 73 65 64 20 77 69  If it is used wi
d310: 74 68 69 6e 20 61 20 71 75 65 72 79 0a 20 20 74  thin a query.  t
d320: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  hat does not use
d330: 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 69   the full-text i
d340: 6e 64 65 78 20 28 61 20 22 71 75 65 72 79 20 62  ndex (a "query b
d350: 79 20 72 6f 77 69 64 22 20 6f 72 20 22 6c 69 6e  y rowid" or "lin
d360: 65 61 72 20 73 63 61 6e 22 29 2c 0a 20 20 74 68  ear scan"),.  th
d370: 65 6e 20 74 68 65 20 62 6c 6f 62 20 69 73 20 7a  en the blob is z
d380: 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a  ero bytes in siz
d390: 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  e. Otherwise, th
d3a0: 65 20 62 6c 6f 62 20 63 6f 6e 73 69 73 74 73 20  e blob consists 
d3b0: 6f 66 20 7a 65 72 6f 0a 20 20 6f 72 20 6d 6f 72  of zero.  or mor
d3c0: 65 20 33 32 2d 62 69 74 20 75 6e 73 69 67 6e 65  e 32-bit unsigne
d3d0: 64 20 69 6e 74 65 67 65 72 73 20 69 6e 20 6d 61  d integers in ma
d3e0: 63 68 69 6e 65 20 62 79 74 65 2d 6f 72 64 65 72  chine byte-order
d3f0: 2e 20 54 68 65 20 65 78 61 63 74 20 6e 75 6d 62  . The exact numb
d400: 65 72 0a 20 20 6f 66 20 69 6e 74 65 67 65 72 73  er.  of integers
d410: 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64   in the returned
d420: 20 61 72 72 61 79 20 64 65 70 65 6e 64 73 20 6f   array depends o
d430: 6e 20 62 6f 74 68 20 74 68 65 20 71 75 65 72 79  n both the query
d440: 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 0a 20   and the value. 
d450: 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   of the second a
d460: 72 67 75 6d 65 6e 74 20 28 69 66 20 61 6e 79 29  rgument (if any)
d470: 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d   passed to the m
d480: 61 74 63 68 69 6e 66 6f 20 66 75 6e 63 74 69 6f  atchinfo functio
d490: 6e 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 6d 61  n...<p>.  The ma
d4a0: 74 63 68 69 6e 66 6f 20 66 75 6e 63 74 69 6f 6e  tchinfo function
d4b0: 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20   is called with 
d4c0: 65 69 74 68 65 72 20 6f 6e 65 20 6f 72 20 74 77  either one or tw
d4d0: 6f 20 61 72 67 75 6d 65 6e 74 73 2e 20 41 73 20  o arguments. As 
d4e0: 66 6f 72 0a 20 20 61 6c 6c 20 61 75 78 69 6c 69  for.  all auxili
d4f0: 61 72 79 20 66 75 6e 63 74 69 6f 6e 73 2c 20 74  ary functions, t
d500: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
d510: 74 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 70  t must be the sp
d520: 65 63 69 61 6c 20 0a 20 20 5b 46 54 53 20 68 69  ecial .  [FTS hi
d530: 64 64 65 6e 20 63 6f 6c 75 6d 6e 5d 2e 20 54 68  dden column]. Th
d540: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
d550: 74 2c 20 69 66 20 69 74 20 69 73 20 73 70 65 63  t, if it is spec
d560: 69 66 69 65 64 2c 20 6d 75 73 74 20 62 65 20 61  ified, must be a
d570: 20 74 65 78 74 20 76 61 6c 75 65 0a 20 20 63 6f   text value.  co
d580: 6d 70 72 69 73 65 64 20 6f 6e 6c 79 20 6f 66 20  mprised only of 
d590: 74 68 65 20 63 68 61 72 61 63 74 65 72 73 20 27  the characters '
d5a0: 70 27 2c 20 27 63 27 2c 20 27 6e 27 2c 20 27 61  p', 'c', 'n', 'a
d5b0: 27 2c 20 27 6c 27 2c 20 27 73 27 20 61 6e 64 20  ', 'l', 's' and 
d5c0: 27 78 27 2e 0a 20 20 49 66 20 6e 6f 20 73 65 63  'x'..  If no sec
d5d0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
d5e0: 65 78 70 6c 69 63 69 74 6c 79 20 73 75 70 70 6c  explicitly suppl
d5f0: 69 65 64 2c 20 69 74 20 64 65 66 61 75 6c 74 73  ied, it defaults
d600: 20 74 6f 20 22 70 63 78 22 2e 20 54 68 65 0a 20   to "pcx". The. 
d610: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
d620: 20 69 73 20 72 65 66 65 72 65 64 20 74 6f 20 61   is refered to a
d630: 73 20 74 68 65 20 22 66 6f 72 6d 61 74 20 73 74  s the "format st
d640: 72 69 6e 67 22 20 62 65 6c 6f 77 2e 0a 0a 3c 70  ring" below...<p
d650: 3e 0a 20 20 43 68 61 72 61 63 74 65 72 73 20 69  >.  Characters i
d660: 6e 20 74 68 65 20 6d 61 74 63 68 69 6e 66 6f 20  n the matchinfo 
d670: 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 61 72  format string ar
d680: 65 20 70 72 6f 63 65 73 73 65 64 20 66 72 6f 6d  e processed from
d690: 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e 20   left to right. 
d6a0: 0a 20 20 45 61 63 68 20 63 68 61 72 61 63 74 65  .  Each characte
d6b0: 72 20 69 6e 20 74 68 65 20 66 6f 72 6d 61 74 20  r in the format 
d6c0: 73 74 72 69 6e 67 20 63 61 75 73 65 73 20 6f 6e  string causes on
d6d0: 65 20 6f 72 20 6d 6f 72 65 20 33 32 2d 62 69 74  e or more 32-bit
d6e0: 20 75 6e 73 69 67 6e 65 64 0a 20 20 69 6e 74 65   unsigned.  inte
d6f0: 67 65 72 20 76 61 6c 75 65 73 20 74 6f 20 62 65  ger values to be
d700: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 72 65   added to the re
d710: 74 75 72 6e 65 64 20 61 72 72 61 79 2e 20 54 68  turned array. Th
d720: 65 20 22 76 61 6c 75 65 73 22 20 63 6f 6c 75 6d  e "values" colum
d730: 6e 20 69 6e 0a 20 20 74 68 65 20 66 6f 6c 6c 6f  n in.  the follo
d740: 77 69 6e 67 20 74 61 62 6c 65 20 63 6f 6e 74 61  wing table conta
d750: 69 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ins the number o
d760: 66 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73  f integer values
d770: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
d780: 0a 20 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  .  output buffer
d790: 20 66 6f 72 20 65 61 63 68 20 73 75 70 70 6f 72   for each suppor
d7a0: 74 65 64 20 66 6f 72 6d 61 74 20 73 74 72 69 6e  ted format strin
d7b0: 67 20 63 68 61 72 61 63 74 65 72 2e 20 49 6e 20  g character. In 
d7c0: 74 68 65 20 66 6f 72 6d 75 6c 61 0a 20 20 67 69  the formula.  gi
d7d0: 76 65 6e 2c 20 3c 69 3e 63 6f 6c 73 3c 2f 69 3e  ven, <i>cols</i>
d7e0: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
d7f0: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
d800: 20 46 54 53 20 74 61 62 6c 65 2c 20 61 6e 64 20   FTS table, and 
d810: 0a 20 20 3c 69 3e 70 68 72 61 73 65 73 3c 2f 69  .  <i>phrases</i
d820: 3e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  > is the number 
d830: 6f 66 20 3c 61 20 68 72 65 66 3d 23 6d 61 74 63  of <a href=#matc
d840: 68 61 62 6c 65 3e 6d 61 74 63 68 61 62 6c 65 20  hable>matchable 
d850: 70 68 72 61 73 65 73 3c 2f 61 3e 20 69 6e 20 0a  phrases</a> in .
d860: 20 20 74 68 65 20 71 75 65 72 79 2e 20 0a 0a 3c    the query. ..<
d870: 74 61 62 6c 65 20 73 74 72 69 70 65 64 3d 31 3e  table striped=1>
d880: 0a 20 20 3c 74 72 3e 3c 74 68 3e 43 68 61 72 61  .  <tr><th>Chara
d890: 63 74 65 72 3c 74 68 3e 56 61 6c 75 65 73 3c 74  cter<th>Values<t
d8a0: 68 3e 44 65 73 63 72 69 70 74 69 6f 6e 0a 20 20  h>Description.  
d8b0: 3c 74 72 3e 3c 74 64 3e 70 20 3c 74 64 3e 31 20  <tr><td>p <td>1 
d8c0: 3c 74 64 3e 54 68 65 20 6e 75 6d 62 65 72 20 6f  <td>The number o
d8d0: 66 20 6d 61 74 63 68 61 62 6c 65 20 70 68 72 61  f matchable phra
d8e0: 73 65 73 20 69 6e 20 74 68 65 20 71 75 65 72 79  ses in the query
d8f0: 2e 0a 20 20 3c 74 72 3e 3c 74 64 3e 63 20 3c 74  ..  <tr><td>c <t
d900: 64 3e 31 20 3c 74 64 3e 54 68 65 20 6e 75 6d 62  d>1 <td>The numb
d910: 65 72 20 6f 66 20 75 73 65 72 20 64 65 66 69 6e  er of user defin
d920: 65 64 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  ed columns in th
d930: 65 20 46 54 53 0a 20 20 20 20 74 61 62 6c 65 20  e FTS.    table 
d940: 28 69 2e 65 2e 20 6e 6f 74 20 69 6e 63 6c 75 64  (i.e. not includ
d950: 69 6e 67 20 74 68 65 20 64 6f 63 69 64 20 6f 72  ing the docid or
d960: 20 74 68 65 20 5b 46 54 53 20 68 69 64 64 65 6e   the [FTS hidden
d970: 20 63 6f 6c 75 6d 6e 5d 29 2e 0a 20 20 3c 74 72   column])..  <tr
d980: 3e 3c 74 64 3e 78 20 3c 74 64 20 73 74 79 6c 65  ><td>x <td style
d990: 3d 22 77 68 69 74 65 2d 73 70 61 63 65 3a 6e 6f  ="white-space:no
d9a0: 77 72 61 70 22 3e 33 20 2a 20 3c 69 3e 63 6f 6c  wrap">3 * <i>col
d9b0: 73 3c 2f 69 3e 20 2a 20 3c 69 3e 70 68 72 61 73  s</i> * <i>phras
d9c0: 65 73 3c 2f 69 3e 20 0a 20 20 20 20 3c 74 64 3e  es</i> .    <td>
d9d0: 0a 20 20 20 20 20 20 46 6f 72 20 65 61 63 68 20  .      For each 
d9e0: 64 69 73 74 69 6e 63 74 20 63 6f 6d 62 69 6e 61  distinct combina
d9f0: 74 69 6f 6e 20 6f 66 20 61 20 70 68 72 61 73 65  tion of a phrase
da00: 20 61 6e 64 20 74 61 62 6c 65 20 63 6f 6c 75 6d   and table colum
da10: 6e 2c 20 74 68 65 0a 20 20 20 20 20 20 66 6f 6c  n, the.      fol
da20: 6c 6f 77 69 6e 67 20 74 68 72 65 65 20 76 61 6c  lowing three val
da30: 75 65 73 3a 0a 20 20 20 20 20 20 3c 75 6c 3e 0a  ues:.      <ul>.
da40: 20 20 20 20 20 20 20 20 3c 6c 69 3e 20 49 6e 20          <li> In 
da50: 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 2c  the current row,
da60: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   the number of t
da70: 69 6d 65 73 20 74 68 65 20 70 68 72 61 73 65 20  imes the phrase 
da80: 61 70 70 65 61 72 73 20 69 6e 20 0a 20 20 20 20  appears in .    
da90: 20 20 20 20 20 20 20 20 20 74 68 65 20 63 6f 6c           the col
daa0: 75 6d 6e 2e 0a 20 20 20 20 20 20 20 20 3c 6c 69  umn..        <li
dab0: 3e 20 54 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  > The total numb
dac0: 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68 65 20  er of times the 
dad0: 70 68 72 61 73 65 20 61 70 70 65 61 72 73 20 69  phrase appears i
dae0: 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 0a  n the column in.
daf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6c 6c               all
db00: 20 72 6f 77 73 20 69 6e 20 74 68 65 20 46 54 53   rows in the FTS
db10: 20 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 20 20   table..        
db20: 3c 6c 69 3e 20 54 68 65 20 74 6f 74 61 6c 20 6e  <li> The total n
db30: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
db40: 20 74 68 65 20 46 54 53 20 74 61 62 6c 65 20 66   the FTS table f
db50: 6f 72 20 77 68 69 63 68 20 74 68 65 20 0a 20 20  or which the .  
db60: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d             colum
db70: 6e 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65  n contains at le
db80: 61 73 74 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65  ast one instance
db90: 20 6f 66 20 74 68 65 20 70 68 72 61 73 65 2e 0a   of the phrase..
dba0: 20 20 20 20 20 20 3c 2f 75 6c 3e 0a 20 20 20 20        </ul>.    
dbb0: 20 20 54 68 65 20 66 69 72 73 74 20 73 65 74 20    The first set 
dbc0: 6f 66 20 74 68 72 65 65 20 76 61 6c 75 65 73 20  of three values 
dbd0: 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74  corresponds to t
dbe0: 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c  he left-most col
dbf0: 75 6d 6e 0a 20 20 20 20 20 20 6f 66 20 74 68 65  umn.      of the
dc00: 20 74 61 62 6c 65 20 28 63 6f 6c 75 6d 6e 20 30   table (column 0
dc10: 29 20 61 6e 64 20 74 68 65 20 6c 65 66 74 2d 6d  ) and the left-m
dc20: 6f 73 74 20 6d 61 74 63 68 61 62 6c 65 20 70 68  ost matchable ph
dc30: 72 61 73 65 20 69 6e 20 74 68 65 0a 20 20 20 20  rase in the.    
dc40: 20 20 71 75 65 72 79 20 28 70 68 72 61 73 65 20    query (phrase 
dc50: 30 29 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65  0). If the table
dc60: 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f   has more than o
dc70: 6e 65 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20 73  ne column, the s
dc80: 65 63 6f 6e 64 0a 20 20 20 20 20 20 73 65 74 20  econd.      set 
dc90: 6f 66 20 74 68 72 65 65 20 76 61 6c 75 65 73 20  of three values 
dca0: 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 61 72  in the output ar
dcb0: 72 61 79 20 63 6f 72 72 65 73 70 6f 6e 64 20 74  ray correspond t
dcc0: 6f 20 70 68 72 61 73 65 20 30 20 61 6e 64 0a 20  o phrase 0 and. 
dcd0: 20 20 20 20 20 63 6f 6c 75 6d 6e 20 31 2e 20 46       column 1. F
dce0: 6f 6c 6c 6f 77 65 64 20 62 79 20 70 68 72 61 73  ollowed by phras
dcf0: 65 20 30 2c 20 63 6f 6c 75 6d 6e 20 32 20 61 6e  e 0, column 2 an
dd00: 64 20 73 6f 20 6f 6e 20 66 6f 72 20 61 6c 6c 20  d so on for all 
dd10: 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 20 20 20  columns of.     
dd20: 20 74 68 65 20 74 61 62 6c 65 2e 20 41 6e 64 20   the table. And 
dd30: 73 6f 20 6f 6e 20 66 6f 72 20 70 68 72 61 73 65  so on for phrase
dd40: 20 31 2c 20 63 6f 6c 75 6d 6e 20 30 2c 20 74 68   1, column 0, th
dd50: 65 6e 20 70 68 72 61 73 65 20 31 2c 20 63 6f 6c  en phrase 1, col
dd60: 75 6d 6e 20 31 0a 20 20 20 20 20 20 65 74 63 2e  umn 1.      etc.
dd70: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
dd80: 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 6f 63   the data for oc
dd90: 63 75 72 65 6e 63 65 73 20 6f 66 20 70 68 72 61  curences of phra
dda0: 73 65 20 3c 69 3e 70 3c 2f 69 3e 20 69 6e 0a 20  se <i>p</i> in. 
ddb0: 20 20 20 20 20 63 6f 6c 75 6d 6e 20 3c 69 3e 63       column <i>c
ddc0: 3c 2f 69 3e 20 6d 61 79 20 62 65 20 66 6f 75 6e  </i> may be foun
ddd0: 64 20 75 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c  d using the foll
dde0: 6f 77 69 6e 67 20 66 6f 72 6d 75 6c 61 3a 0a 3c  owing formula:.<
ddf0: 70 72 65 3e 0a 20 20 20 20 20 20 20 20 20 20 68  pre>.          h
de00: 69 74 73 5f 74 68 69 73 5f 72 6f 77 20 20 3d 20  its_this_row  = 
de10: 61 72 72 61 79 26 23 39 31 3b 33 20 2a 20 28 63  array&#91;3 * (c
de20: 20 2b 20 70 2a 63 6f 6c 73 29 20 2b 20 30 26 23   + p*cols) + 0&#
de30: 39 33 3b 0a 20 20 20 20 20 20 20 20 20 20 68 69  93;.          hi
de40: 74 73 5f 61 6c 6c 5f 72 6f 77 73 20 20 3d 20 61  ts_all_rows  = a
de50: 72 72 61 79 26 23 39 31 3b 33 20 2a 20 28 63 20  rray&#91;3 * (c 
de60: 2b 20 70 2a 63 6f 6c 73 29 20 2b 20 31 26 23 39  + p*cols) + 1&#9
de70: 33 3b 0a 20 20 20 20 20 20 20 20 20 20 64 6f 63  3;.          doc
de80: 73 5f 77 69 74 68 5f 68 69 74 73 20 3d 20 61 72  s_with_hits = ar
de90: 72 61 79 26 23 39 31 3b 33 20 2a 20 28 63 20 2b  ray&#91;3 * (c +
dea0: 20 70 2a 63 6f 6c 73 29 20 2b 20 32 26 23 39 33   p*cols) + 2&#93
deb0: 3b 0a 3c 2f 70 72 65 3e 0a 0a 20 20 3c 74 72 3e  ;.</pre>..  <tr>
dec0: 3c 74 64 3e 6e 20 3c 74 64 3e 31 20 3c 74 64 3e  <td>n <td>1 <td>
ded0: 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  The number of ro
dee0: 77 73 20 69 6e 20 74 68 65 20 46 54 53 34 20 74  ws in the FTS4 t
def0: 61 62 6c 65 2e 20 54 68 69 73 20 76 61 6c 75 65  able. This value
df00: 20 69 73 0a 20 20 20 20 6f 6e 6c 79 20 61 76 61   is.    only ava
df10: 69 6c 61 62 6c 65 20 77 68 65 6e 20 71 75 65 72  ilable when quer
df20: 79 69 6e 67 20 46 54 53 34 20 74 61 62 6c 65 73  ying FTS4 tables
df30: 2c 20 6e 6f 74 20 46 54 53 33 2e 0a 20 20 3c 74  , not FTS3..  <t
df40: 72 3e 3c 74 64 3e 61 20 3c 74 64 3e 3c 69 3e 63  r><td>a <td><i>c
df50: 6f 6c 73 3c 2f 69 3e 20 3c 74 64 3e 46 6f 72 20  ols</i> <td>For 
df60: 65 61 63 68 20 63 6f 6c 75 6d 6e 2c 20 74 68 65  each column, the
df70: 20 61 76 65 72 61 67 65 20 6e 75 6d 62 65 72 20   average number 
df80: 6f 66 0a 20 20 20 20 74 6f 6b 65 6e 73 20 69 6e  of.    tokens in
df90: 20 74 68 65 20 74 65 78 74 20 76 61 6c 75 65 73   the text values
dfa0: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63   stored in the c
dfb0: 6f 6c 75 6d 6e 20 28 63 6f 6e 73 69 64 65 72 69  olumn (consideri
dfc0: 6e 67 20 61 6c 6c 20 72 6f 77 73 20 69 6e 0a 20  ng all rows in. 
dfd0: 20 20 20 74 68 65 20 46 54 53 34 20 74 61 62 6c     the FTS4 tabl
dfe0: 65 29 2e 20 54 68 69 73 20 76 61 6c 75 65 20 69  e). This value i
dff0: 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  s only available
e000: 20 77 68 65 6e 20 71 75 65 72 79 69 6e 67 20 46   when querying F
e010: 54 53 34 20 74 61 62 6c 65 73 2c 0a 20 20 20 20  TS4 tables,.    
e020: 6e 6f 74 20 46 54 53 33 2e 20 20 0a 20 20 3c 74  not FTS3.  .  <t
e030: 72 3e 3c 74 64 3e 6c 20 3c 74 64 3e 3c 69 3e 63  r><td>l <td><i>c
e040: 6f 6c 73 3c 2f 69 3e 20 3c 74 64 3e 0a 20 20 20  ols</i> <td>.   
e050: 20 46 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   For each column
e060: 2c 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20  , the length of 
e070: 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64  the value stored
e080: 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
e090: 72 6f 77 20 6f 66 20 74 68 65 0a 20 20 20 20 46  row of the.    F
e0a0: 54 53 34 20 74 61 62 6c 65 2c 20 69 6e 20 74 6f  TS4 table, in to
e0b0: 6b 65 6e 73 2e 20 20 54 68 69 73 20 76 61 6c 75  kens.  This valu
e0c0: 65 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61  e is only availa
e0d0: 62 6c 65 20 77 68 65 6e 20 71 75 65 72 79 69 6e  ble when queryin
e0e0: 67 0a 20 20 20 20 46 54 53 34 20 74 61 62 6c 65  g.    FTS4 table
e0f0: 73 2c 20 6e 6f 74 20 46 54 53 33 2e 20 41 6e 64  s, not FTS3. And
e100: 20 6f 6e 6c 79 20 69 66 20 74 68 65 20 22 6d 61   only if the "ma
e110: 74 63 68 69 6e 66 6f 3d 66 74 73 33 22 20 64 69  tchinfo=fts3" di
e120: 72 65 63 74 69 76 65 20 77 61 73 20 6e 6f 74 0a  rective was not.
e130: 20 20 20 20 73 70 65 63 69 66 69 65 64 20 61 73      specified as
e140: 20 70 61 72 74 20 6f 66 20 74 68 65 20 22 43 52   part of the "CR
e150: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
e160: 4c 45 22 20 73 74 61 74 65 6d 65 6e 74 20 75 73  LE" statement us
e170: 65 64 20 74 6f 20 63 72 65 61 74 65 0a 20 20 20  ed to create.   
e180: 20 74 68 65 20 46 54 53 34 20 74 61 62 6c 65 2e   the FTS4 table.
e190: 0a 20 20 3c 74 72 3e 3c 74 64 3e 73 20 3c 74 64  .  <tr><td>s <td
e1a0: 3e 3c 69 3e 63 6f 6c 73 3c 2f 69 3e 20 3c 74 64  ><i>cols</i> <td
e1b0: 3e 46 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e  >For each column
e1c0: 2c 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20  , the length of 
e1d0: 74 68 65 20 6c 6f 6e 67 65 73 74 20 0a 20 20 20  the longest .   
e1e0: 20 73 75 62 73 65 71 75 65 6e 63 65 20 6f 66 20   subsequence of 
e1f0: 70 68 72 61 73 65 20 6d 61 74 63 68 65 73 20 74  phrase matches t
e200: 68 61 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76  hat the column v
e210: 61 6c 75 65 20 68 61 73 20 69 6e 20 63 6f 6d 6d  alue has in comm
e220: 6f 6e 0a 20 20 20 20 77 69 74 68 20 74 68 65 20  on.    with the 
e230: 71 75 65 72 79 20 74 65 78 74 2e 20 46 6f 72 20  query text. For 
e240: 65 78 61 6d 70 6c 65 2c 20 69 66 20 61 20 74 61  example, if a ta
e250: 62 6c 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61  ble column conta
e260: 69 6e 73 20 74 68 65 20 74 65 78 74 0a 20 20 20  ins the text.   
e270: 20 27 61 20 62 20 63 20 64 20 65 27 20 61 6e 64   'a b c d e' and
e280: 20 74 68 65 20 71 75 65 72 79 20 69 73 20 27 61   the query is 'a
e290: 20 63 20 22 64 20 65 22 27 2c 20 74 68 65 6e 20   c "d e"', then 
e2a0: 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68  the length of th
e2b0: 65 20 6c 6f 6e 67 65 73 74 0a 20 20 20 20 63 6f  e longest.    co
e2c0: 6d 6d 6f 6e 20 73 75 62 73 65 71 75 65 6e 63 65  mmon subsequence
e2d0: 20 69 73 20 32 20 28 70 68 72 61 73 65 20 22 63   is 2 (phrase "c
e2e0: 22 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 70 68  " followed by ph
e2f0: 72 61 73 65 20 22 64 20 65 22 29 2e 0a 20 20 20  rase "d e")..   
e300: 20 0a 20 20 20 20 0a 3c 2f 74 61 62 6c 65 3e 0a   .    .</table>.
e310: 0a 3c 70 3e 0a 20 20 46 6f 72 20 65 78 61 6d 70  .<p>.  For examp
e320: 6c 65 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e  le:..<codeblock>
e330: 0a 20 20 3c 69 3e 2d 2d 20 43 72 65 61 74 65 20  .  <i>-- Create 
e340: 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6e 20  and populate an 
e350: 46 54 53 34 20 74 61 62 6c 65 20 77 69 74 68 20  FTS4 table with 
e360: 74 77 6f 20 63 6f 6c 75 6d 6e 73 3a 3c 2f 69 3e  two columns:</i>
e370: 0a 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41  .  CREATE VIRTUA
e380: 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 4e 47  L TABLE t1 USING
e390: 20 66 74 73 34 28 61 2c 20 62 29 3b 0a 20 20 49   fts4(a, b);.  I
e3a0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
e3b0: 4c 55 45 53 28 27 74 72 61 6e 73 61 63 74 69 6f  LUES('transactio
e3c0: 6e 20 64 65 66 61 75 6c 74 20 6d 6f 64 65 6c 73  n default models
e3d0: 20 64 65 66 61 75 6c 74 27 2c 20 27 4e 6f 6e 20   default', 'Non 
e3e0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 65 61 64  transaction read
e3f0: 73 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  s');.  INSERT IN
e400: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 74 68  TO t1 VALUES('th
e410: 65 20 64 65 66 61 75 6c 74 20 74 72 61 6e 73 61  e default transa
e420: 63 74 69 6f 6e 27 2c 20 27 74 68 65 73 65 20 73  ction', 'these s
e430: 65 6d 61 6e 74 69 63 73 20 70 72 65 73 65 6e 74  emantics present
e440: 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  ');.  INSERT INT
e450: 4f 20 74 31 20 56 41 4c 55 45 53 28 27 73 69 6e  O t1 VALUES('sin
e460: 67 6c 65 20 72 65 71 75 65 73 74 27 2c 20 27 64  gle request', 'd
e470: 65 66 61 75 6c 74 20 64 61 74 61 27 29 3b 0a 0a  efault data');..
e480: 20 20 3c 69 3e 2d 2d 20 49 6e 20 74 68 65 20 66    <i>-- In the f
e490: 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72 79 2c 20  ollowing query, 
e4a0: 6e 6f 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67  no format string
e4b0: 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61 6e   is specified an
e4c0: 64 20 73 6f 20 69 74 20 64 65 66 61 75 6c 74 73  d so it defaults
e4d0: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 6f 20  </i>.  <i>-- to 
e4e0: 22 70 63 78 22 2e 20 49 74 20 74 68 65 72 65 66  "pcx". It theref
e4f0: 6f 72 65 20 72 65 74 75 72 6e 73 20 61 20 73 69  ore returns a si
e500: 6e 67 6c 65 20 72 6f 77 20 63 6f 6e 73 69 73 74  ngle row consist
e510: 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ing of a single 
e520: 62 6c 6f 62 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  blob</i>.  <i>--
e530: 20 76 61 6c 75 65 20 38 30 20 62 79 74 65 73 20   value 80 bytes 
e540: 69 6e 20 73 69 7a 65 20 28 32 30 20 33 32 2d 62  in size (20 32-b
e550: 69 74 20 69 6e 74 65 67 65 72 73 20 2d 20 31 20  it integers - 1 
e560: 66 6f 72 20 22 70 22 2c 20 31 20 66 6f 72 20 22  for "p", 1 for "
e570: 63 22 20 61 6e 64 3c 2f 69 3e 0a 20 20 3c 69 3e  c" and</i>.  <i>
e580: 2d 2d 20 33 2a 32 2a 33 20 66 6f 72 20 22 78 22  -- 3*2*3 for "x"
e590: 29 2e 20 49 66 20 65 61 63 68 20 62 6c 6f 63 6b  ). If each block
e5a0: 20 6f 66 20 34 20 62 79 74 65 73 20 69 6e 3c 2f   of 4 bytes in</
e5b0: 69 3e 20 74 68 65 20 62 6c 6f 62 20 69 73 20 69  i> the blob is i
e5c0: 6e 74 65 72 70 72 65 74 65 64 3c 2f 69 3e 20 0a  nterpreted</i> .
e5d0: 20 20 3c 69 3e 2d 2d 20 61 73 20 61 6e 20 75 6e    <i>-- as an un
e5e0: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 69  signed integer i
e5f0: 6e 20 6d 61 63 68 69 6e 65 20 62 79 74 65 2d 6f  n machine byte-o
e600: 72 64 65 72 2c 20 74 68 65 20 76 61 6c 75 65 73  rder, the values
e610: 20 77 69 6c 6c 20 62 65 3a 3c 2f 69 3e 0a 20 20   will be:</i>.  
e620: 3c 69 3e 2d 2d 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  <i>--</i>.  <i>-
e630: 2d 20 20 20 20 20 33 20 32 20 20 31 20 33 20 32  -     3 2  1 3 2
e640: 20 20 30 20 31 20 31 20 20 31 20 32 20 32 20 20    0 1 1  1 2 2  
e650: 30 20 31 20 31 20 20 30 20 30 20 30 20 20 31 20  0 1 1  0 0 0  1 
e660: 31 20 31 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 3c  1 1</i>.  <i>--<
e670: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 54 68 65 20  /i>.  <i>-- The 
e680: 72 6f 77 20 72 65 74 75 72 6e 65 64 20 63 6f 72  row returned cor
e690: 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20  responds to the 
e6a0: 73 65 63 6f 6e 64 20 65 6e 74 72 79 20 69 6e 73  second entry ins
e6b0: 65 72 74 65 64 20 69 6e 74 6f 20 74 61 62 6c 65  erted into table
e6c0: 20 74 31 2e 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d   t1.</i>.  <i>--
e6d0: 20 54 68 65 20 66 69 72 73 74 20 74 77 6f 20 69   The first two i
e6e0: 6e 74 65 67 65 72 73 20 69 6e 20 74 68 65 20 62  ntegers in the b
e6f0: 6c 6f 62 20 73 68 6f 77 20 74 68 61 74 20 74 68  lob show that th
e700: 65 20 71 75 65 72 79 20 63 6f 6e 74 61 69 6e 65  e query containe
e710: 64 20 74 68 72 65 65 3c 2f 69 3e 0a 20 20 3c 69  d three</i>.  <i
e720: 3e 2d 2d 20 70 68 72 61 73 65 73 20 61 6e 64 20  >-- phrases and 
e730: 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  the table being 
e740: 71 75 65 72 69 65 64 20 68 61 73 20 74 77 6f 20  queried has two 
e750: 63 6f 6c 75 6d 6e 73 2e 20 54 68 65 20 6e 65 78  columns. The nex
e760: 74 20 62 6c 6f 63 6b 20 6f 66 3c 2f 69 3e 0a 20  t block of</i>. 
e770: 20 3c 69 3e 2d 2d 20 74 68 72 65 65 20 69 6e 74   <i>-- three int
e780: 65 67 65 72 73 20 64 65 73 63 72 69 62 65 73 20  egers describes 
e790: 63 6f 6c 75 6d 6e 20 30 20 28 69 6e 20 74 68 69  column 0 (in thi
e7a0: 73 20 63 61 73 65 20 63 6f 6c 75 6d 6e 20 22 61  s case column "a
e7b0: 22 29 20 61 6e 64 20 70 68 72 61 73 65 3c 2f 69  ") and phrase</i
e7c0: 3e 0a 20 20 3c 69 3e 2d 2d 20 30 20 28 69 6e 20  >.  <i>-- 0 (in 
e7d0: 74 68 69 73 20 63 61 73 65 20 22 64 65 66 61 75  this case "defau
e7e0: 6c 74 22 29 2e 20 54 68 65 20 63 75 72 72 65 6e  lt"). The curren
e7f0: 74 20 72 6f 77 20 63 6f 6e 74 61 69 6e 73 20 31  t row contains 1
e800: 20 68 69 74 20 66 6f 72 20 22 64 65 66 61 75 6c   hit for "defaul
e810: 74 22 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 69  t"</i>.  <i>-- i
e820: 6e 20 63 6f 6c 75 6d 6e 20 30 2c 20 6f 66 20 61  n column 0, of a
e830: 20 74 6f 74 61 6c 20 6f 66 20 33 20 68 69 74 73   total of 3 hits
e840: 20 66 6f 72 20 22 64 65 66 61 75 6c 74 22 20 74   for "default" t
e850: 68 61 74 20 6f 63 63 75 72 20 69 6e 20 63 6f 6c  hat occur in col
e860: 75 6d 6e 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20  umn</i>.  <i>-- 
e870: 30 20 6f 66 20 61 6e 79 20 74 61 62 6c 65 20 72  0 of any table r
e880: 6f 77 2e 20 54 68 65 20 33 20 68 69 74 73 20 61  ow. The 3 hits a
e890: 72 65 20 73 70 72 65 61 64 20 61 63 72 6f 73 73  re spread across
e8a0: 20 32 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77   2 different row
e8b0: 73 2e 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 3c 2f  s.</i>.  <i>--</
e8c0: 69 3e 0a 20 20 3c 69 3e 2d 2d 20 54 68 65 20 6e  i>.  <i>-- The n
e8d0: 65 78 74 20 73 65 74 20 6f 66 20 74 68 72 65 65  ext set of three
e8e0: 20 69 6e 74 65 67 65 72 73 20 28 30 20 31 20 31   integers (0 1 1
e8f0: 29 20 70 65 72 74 61 69 6e 20 74 6f 20 74 68 65  ) pertain to the
e900: 20 68 69 74 73 20 66 6f 72 20 22 64 65 66 61 75   hits for "defau
e910: 6c 74 22 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20  lt"</i>.  <i>-- 
e920: 69 6e 20 63 6f 6c 75 6d 6e 20 31 20 6f 66 20 74  in column 1 of t
e930: 68 65 20 74 61 62 6c 65 20 28 30 20 69 6e 20 74  he table (0 in t
e940: 68 69 73 20 72 6f 77 2c 20 31 20 69 6e 20 61 6c  his row, 1 in al
e950: 6c 20 72 6f 77 73 2c 20 73 70 72 65 61 64 20 61  l rows, spread a
e960: 63 72 6f 73 73 20 3c 2f 69 3e 0a 20 20 3c 69 3e  cross </i>.  <i>
e970: 2d 2d 20 31 20 72 6f 77 73 29 2e 3c 2f 69 3e 0a  -- 1 rows).</i>.
e980: 20 20 3c 69 3e 2d 2d 3c 2f 69 3e 0a 20 20 53 45    <i>--</i>.  SE
e990: 4c 45 43 54 20 6d 61 74 63 68 69 6e 66 6f 28 74  LECT matchinfo(t
e9a0: 31 29 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  1) FROM t1 WHERE
e9b0: 20 74 31 20 4d 41 54 43 48 20 27 64 65 66 61 75   t1 MATCH 'defau
e9c0: 6c 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 22  lt transaction "
e9d0: 74 68 65 73 65 20 73 65 6d 61 6e 74 69 63 73 22  these semantics"
e9e0: 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68 65 20  ';..  <i>-- The 
e9f0: 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 66 6f  format string fo
ea00: 72 20 74 68 69 73 20 71 75 65 72 79 20 69 73 20  r this query is 
ea10: 22 6e 6c 22 2e 20 54 68 65 20 6f 75 74 70 75 74  "nl". The output
ea20: 20 61 72 72 61 79 20 77 69 6c 6c 20 74 68 65 72   array will ther
ea30: 65 66 6f 72 65 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  efore</i>.  <i>-
ea40: 2d 20 63 6f 6e 74 61 69 6e 20 33 20 69 6e 74 65  - contain 3 inte
ea50: 67 65 72 20 76 61 6c 75 65 73 20 2d 20 31 20 66  ger values - 1 f
ea60: 6f 72 20 22 6e 22 20 61 6e 64 20 32 20 66 6f 72  or "n" and 2 for
ea70: 20 22 6c 22 2e 20 54 68 65 20 71 75 65 72 79 20   "l". The query 
ea80: 72 65 74 75 72 6e 73 3c 2f 69 3e 0a 20 20 3c 69  returns</i>.  <i
ea90: 3e 2d 2d 20 74 77 6f 20 72 6f 77 73 20 28 74 68  >-- two rows (th
eaa0: 65 20 66 69 72 73 74 20 74 77 6f 20 72 6f 77 73  e first two rows
eab0: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6d 61   in the table ma
eac0: 74 63 68 29 2e 20 54 68 65 20 76 61 6c 75 65 73  tch). The values
ead0: 20 72 65 74 75 72 6e 65 64 20 61 72 65 3a 3c 2f   returned are:</
eae0: 69 3e 0a 20 20 3c 69 3e 2d 2d 3c 2f 69 3e 0a 20  i>.  <i>--</i>. 
eaf0: 20 3c 69 3e 2d 2d 20 20 20 20 20 33 20 20 31 20   <i>--     3  1 
eb00: 31 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20  1</i>.  <i>--   
eb10: 20 20 33 20 20 32 20 30 3c 2f 69 3e 0a 20 20 3c    3  2 0</i>.  <
eb20: 69 3e 2d 2d 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  i>--</i>.  <i>--
eb30: 20 54 68 65 20 66 69 72 73 74 20 76 61 6c 75 65   The first value
eb40: 20 69 6e 20 74 68 65 20 6d 61 74 63 68 69 6e 66   in the matchinf
eb50: 6f 20 61 72 72 61 79 20 72 65 74 75 72 6e 65 64  o array returned
eb60: 20 66 6f 72 20 62 6f 74 68 20 72 6f 77 73 20 69   for both rows i
eb70: 73 20 33 20 28 74 68 65 20 3c 2f 69 3e 0a 20 20  s 3 (the </i>.  
eb80: 3c 69 3e 2d 2d 20 6e 75 6d 62 65 72 20 6f 66 20  <i>-- number of 
eb90: 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
eba0: 65 29 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  e). The followin
ebb0: 67 20 74 77 6f 20 76 61 6c 75 65 73 20 61 72 65  g two values are
ebc0: 20 74 68 65 20 6c 65 6e 67 74 68 73 20 3c 2f 69   the lengths </i
ebd0: 3e 0a 20 20 3c 69 3e 2d 2d 20 6f 66 20 74 68 65  >.  <i>-- of the
ebe0: 20 6c 6f 6e 67 65 73 74 20 63 6f 6d 6d 6f 6e 20   longest common 
ebf0: 73 75 62 73 65 71 75 65 6e 63 65 20 6f 66 20 70  subsequence of p
ec00: 68 72 61 73 65 20 6d 61 74 63 68 65 73 20 69 6e  hrase matches in
ec10: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 3c 2f 69   each column.</i
ec20: 3e 0a 20 20 53 45 4c 45 43 54 20 6d 61 74 63 68  >.  SELECT match
ec30: 69 6e 66 6f 28 74 31 2c 20 27 6e 6c 27 29 20 46  info(t1, 'nl') F
ec40: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 74 31 20  ROM t1 WHERE t1 
ec50: 4d 41 54 43 48 20 27 64 65 66 61 75 6c 74 20 74  MATCH 'default t
ec60: 72 61 6e 73 61 63 74 69 6f 6e 27 3b 0a 3c 2f 63  ransaction';.</c
ec70: 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20  odeblock>..<p>. 
ec80: 20 54 68 65 20 6d 61 74 63 68 69 6e 66 6f 20 66   The matchinfo f
ec90: 75 6e 63 74 69 6f 6e 20 69 73 20 6d 75 63 68 20  unction is much 
eca0: 66 61 73 74 65 72 20 74 68 61 6e 20 65 69 74 68  faster than eith
ecb0: 65 72 20 74 68 65 20 73 6e 69 70 70 65 74 20 6f  er the snippet o
ecc0: 72 20 6f 66 66 73 65 74 73 0a 20 20 66 75 6e 63  r offsets.  func
ecd0: 74 69 6f 6e 73 2e 20 54 68 69 73 20 69 73 20 62  tions. This is b
ece0: 65 63 61 75 73 65 20 74 68 65 20 69 6d 70 6c 65  ecause the imple
ecf0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 62 6f 74  mentation of bot
ed00: 68 20 73 6e 69 70 70 65 74 20 61 6e 64 20 6f 66  h snippet and of
ed10: 66 73 65 74 73 0a 20 20 69 73 20 72 65 71 75 69  fsets.  is requi
ed20: 72 65 64 20 74 6f 20 72 65 74 72 69 65 76 65 20  red to retrieve 
ed30: 74 68 65 20 64 6f 63 75 6d 65 6e 74 73 20 62 65  the documents be
ed40: 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 66 72 6f  ing analyzed fro
ed50: 6d 20 64 69 73 6b 2c 20 77 68 65 72 65 61 73 0a  m disk, whereas.
ed60: 20 20 61 6c 6c 20 64 61 74 61 20 72 65 71 75 69    all data requi
ed70: 72 65 64 20 62 79 20 6d 61 74 63 68 69 6e 66 6f  red by matchinfo
ed80: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 61 73   is available as
ed90: 20 70 61 72 74 20 6f 66 20 74 68 65 20 73 61 6d   part of the sam
eda0: 65 20 70 6f 72 74 69 6f 6e 73 0a 20 20 6f 66 20  e portions.  of 
edb0: 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e  the full-text in
edc0: 64 65 78 20 74 68 61 74 20 61 72 65 20 72 65 71  dex that are req
edd0: 75 69 72 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65  uired to impleme
ede0: 6e 74 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74  nt the full-text
edf0: 20 71 75 65 72 79 0a 20 20 69 74 73 65 6c 66 2e   query.  itself.
ee00: 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
ee10: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
ee20: 67 20 74 77 6f 20 71 75 65 72 69 65 73 2c 20 74  g two queries, t
ee30: 68 65 20 66 69 72 73 74 20 6d 61 79 20 62 65 0a  he first may be.
ee40: 20 20 61 6e 20 6f 72 64 65 72 20 6f 66 20 6d 61    an order of ma
ee50: 67 6e 69 74 75 64 65 20 66 61 73 74 65 72 20 74  gnitude faster t
ee60: 68 61 6e 20 74 68 65 20 73 65 63 6f 6e 64 3a 0a  han the second:.
ee70: 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 53  .<codeblock>.  S
ee80: 45 4c 45 43 54 20 64 6f 63 69 64 2c 20 6d 61 74  ELECT docid, mat
ee90: 63 68 69 6e 66 6f 28 74 62 6c 29 20 46 52 4f 4d  chinfo(tbl) FROM
eea0: 20 74 62 6c 20 57 48 45 52 45 20 74 62 6c 20 4d   tbl WHERE tbl M
eeb0: 41 54 43 48 20 26 6c 74 3b 71 75 65 72 79 20 65  ATCH &lt;query e
eec0: 78 70 72 65 73 73 69 6f 6e 26 67 74 3b 3b 0a 20  xpression&gt;;. 
eed0: 20 53 45 4c 45 43 54 20 64 6f 63 69 64 2c 20 6f   SELECT docid, o
eee0: 66 66 73 65 74 73 28 74 62 6c 29 20 46 52 4f 4d  ffsets(tbl) FROM
eef0: 20 74 62 6c 20 57 48 45 52 45 20 74 62 6c 20 4d   tbl WHERE tbl M
ef00: 41 54 43 48 20 26 6c 74 3b 71 75 65 72 79 20 65  ATCH &lt;query e
ef10: 78 70 72 65 73 73 69 6f 6e 26 67 74 3b 3b 0a 3c  xpression&gt;;.<
ef20: 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e  /codeblock>..<p>
ef30: 0a 20 20 54 68 65 20 6d 61 74 63 68 69 6e 66 6f  .  The matchinfo
ef40: 20 66 75 6e 63 74 69 6f 6e 20 70 72 6f 76 69 64   function provid
ef50: 65 73 20 61 6c 6c 20 74 68 65 20 69 6e 66 6f 72  es all the infor
ef60: 6d 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20  mation required 
ef70: 74 6f 20 63 61 6c 63 75 6c 61 74 65 0a 20 20 70  to calculate.  p
ef80: 72 6f 62 61 62 69 6c 69 73 74 69 63 20 22 62 61  robabilistic "ba
ef90: 67 2d 6f 66 2d 77 6f 72 64 73 22 20 72 65 6c 65  g-of-words" rele
efa0: 76 61 6e 63 79 20 73 63 6f 72 65 73 20 73 75 63  vancy scores suc
efb0: 68 20 61 73 20 0a 20 20 3c 61 20 68 72 65 66 3d  h as .  <a href=
efc0: 68 74 74 70 3a 2f 2f 65 6e 2e 77 69 6b 69 70 65  http://en.wikipe
efd0: 64 69 61 2e 6f 72 67 2f 77 69 6b 69 2f 4f 6b 61  dia.org/wiki/Oka
efe0: 70 69 5f 42 4d 32 35 3e 4f 6b 61 70 69 20 42 4d  pi_BM25>Okapi BM
eff0: 32 35 2f 42 4d 32 35 46 3c 2f 61 3e 20 74 68 61  25/BM25F</a> tha
f000: 74 20 6d 61 79 0a 20 20 62 65 20 75 73 65 64 20  t may.  be used 
f010: 74 6f 20 6f 72 64 65 72 20 72 65 73 75 6c 74 73  to order results
f020: 20 69 6e 20 61 20 66 75 6c 6c 2d 74 65 78 74 20   in a full-text 
f030: 73 65 61 72 63 68 20 61 70 70 6c 69 63 61 74 69  search applicati
f040: 6f 6e 2e 20 41 70 70 65 6e 64 69 78 20 41 20 6f  on. Appendix A o
f050: 66 20 74 68 69 73 20 0a 20 20 64 6f 63 75 6d 65  f this .  docume
f060: 6e 74 2c 20 22 5b 73 65 61 72 63 68 20 61 70 70  nt, "[search app
f070: 6c 69 63 61 74 69 6f 6e 20 74 69 70 73 5d 22 2c  lication tips]",
f080: 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 65 78 61   contains an exa
f090: 6d 70 6c 65 20 6f 66 20 75 73 69 6e 67 20 74 68  mple of using th
f0a0: 65 0a 20 20 6d 61 74 63 68 69 6e 66 6f 28 29 20  e.  matchinfo() 
f0b0: 66 75 6e 63 74 69 6f 6e 20 65 66 66 69 63 69 65  function efficie
f0c0: 6e 74 6c 79 2e 0a 0a 3c 68 31 20 69 64 3d 66 74  ntly...<h1 id=ft
f0d0: 73 34 61 75 78 20 74 61 67 73 3d 22 66 74 73 34  s4aux tags="fts4
f0e0: 61 75 78 22 3e 46 74 73 34 61 75 78 20 2d 20 44  aux">Fts4aux - D
f0f0: 69 72 65 63 74 20 41 63 63 65 73 73 20 74 6f 20  irect Access to 
f100: 74 68 65 20 46 75 6c 6c 2d 54 65 78 74 20 49 6e  the Full-Text In
f110: 64 65 78 3c 2f 68 31 3e 0a 0a 3c 70 3e 0a 20 20  dex</h1>..<p>.  
f120: 41 73 20 6f 66 20 76 65 72 73 69 6f 6e 20 33 2e  As of version 3.
f130: 37 2e 36 2c 20 53 51 4c 69 74 65 20 69 6e 63 6c  7.6, SQLite incl
f140: 75 64 65 73 20 61 20 6e 65 77 20 76 69 72 74 75  udes a new virtu
f150: 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20  al table module 
f160: 63 61 6c 6c 65 64 20 0a 20 20 22 66 74 73 34 61  called .  "fts4a
f170: 75 78 22 2c 20 77 68 69 63 68 20 63 61 6e 20 62  ux", which can b
f180: 65 20 75 73 65 64 20 74 6f 20 69 6e 73 70 65 63  e used to inspec
f190: 74 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20  t the full-text 
f1a0: 69 6e 64 65 78 20 6f 66 20 61 6e 20 65 78 69 74  index of an exit
f1b0: 69 6e 67 0a 20 20 46 54 53 20 74 61 62 6c 65 20  ing.  FTS table 
f1c0: 64 69 72 65 63 74 6c 79 2e 20 44 65 73 70 69 74  directly. Despit
f1d0: 65 20 69 74 73 20 6e 61 6d 65 2c 20 66 74 73 34  e its name, fts4
f1e0: 61 75 78 20 77 6f 72 6b 73 20 6a 75 73 74 20 61  aux works just a
f1f0: 73 20 77 65 6c 6c 20 77 69 74 68 20 46 54 53 33  s well with FTS3
f200: 0a 20 20 74 61 62 6c 65 73 20 61 73 20 69 74 20  .  tables as it 
f210: 64 6f 65 73 20 77 69 74 68 20 46 54 53 34 20 74  does with FTS4 t
f220: 61 62 6c 65 73 2e 20 46 74 73 34 61 75 78 20 74  ables. Fts4aux t
f230: 61 62 6c 65 73 20 61 72 65 20 72 65 61 64 2d 6f  ables are read-o
f240: 6e 6c 79 2e 20 54 68 65 20 6f 6e 6c 79 0a 20 20  nly. The only.  
f250: 77 61 79 20 74 6f 20 6d 6f 64 69 66 79 20 74 68  way to modify th
f260: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 6e  e contents of an
f270: 20 66 74 73 34 61 75 78 20 74 61 62 6c 65 20 69   fts4aux table i
f280: 73 20 62 79 20 6d 6f 64 69 66 79 69 6e 67 20 74  s by modifying t
f290: 68 65 0a 20 20 63 6f 6e 74 65 6e 74 73 20 6f 66  he.  contents of
f2a0: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
f2b0: 46 54 53 20 74 61 62 6c 65 2e 20 54 68 65 20 66  FTS table. The f
f2c0: 74 73 34 61 75 78 20 6d 6f 64 75 6c 65 20 69 73  ts4aux module is
f2d0: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 20   automatically. 
f2e0: 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 61 6c 6c   included in all
f2f0: 20 5b 63 6f 6d 70 69 6c 65 20 66 74 73 7c 62 75   [compile fts|bu
f300: 69 6c 64 73 20 74 68 61 74 20 69 6e 63 6c 75 64  ilds that includ
f310: 65 20 46 54 53 5d 2e 0a 0a 3c 70 3e 0a 20 20 41  e FTS]...<p>.  A
f320: 6e 20 66 74 73 34 61 75 78 20 76 69 72 74 75 61  n fts4aux virtua
f330: 6c 20 74 61 62 6c 65 20 69 73 20 63 6f 6e 73 74  l table is const
f340: 72 75 63 74 65 64 20 77 69 74 68 20 61 20 73 69  ructed with a si
f350: 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 2d 20  ngle argument - 
f360: 74 68 65 20 0a 20 20 75 6e 71 75 61 6c 69 66 69  the .  unqualifi
f370: 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 46  ed name of the F
f380: 54 53 20 74 61 62 6c 65 20 74 68 61 74 20 69 74  TS table that it
f390: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f   will be used to
f3a0: 20 61 63 63 65 73 73 2e 0a 20 20 46 6f 72 20 65   access..  For e
f3b0: 78 61 6d 70 6c 65 3a 0a 0a 3c 63 6f 64 65 62 6c  xample:..<codebl
f3c0: 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d 20 43 72 65  ock>.  <i>-- Cre
f3d0: 61 74 65 20 61 6e 20 46 54 53 34 20 74 61 62 6c  ate an FTS4 tabl
f3e0: 65 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45 20 56  e</i>.  CREATE V
f3f0: 49 52 54 55 41 4c 20 54 41 42 4c 45 20 66 74 20  IRTUAL TABLE ft 
f400: 55 53 49 4e 47 20 66 74 73 34 28 78 2c 20 79 29  USING fts4(x, y)
f410: 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 43 72 65 61 74  ;..  <i>-- Creat
f420: 65 20 61 6e 20 66 74 73 34 61 75 78 20 74 61 62  e an fts4aux tab
f430: 6c 65 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  le to access the
f440: 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78   full-text index
f450: 20 66 6f 72 20 74 61 62 6c 65 20 22 66 74 22 3c   for table "ft"<
f460: 2f 69 3e 0a 20 20 43 52 45 41 54 45 20 56 49 52  /i>.  CREATE VIR
f470: 54 55 41 4c 20 54 41 42 4c 45 20 66 74 5f 74 65  TUAL TABLE ft_te
f480: 72 6d 73 20 55 53 49 4e 47 20 66 74 73 34 61 75  rms USING fts4au
f490: 78 28 66 74 29 3b 0a 3c 2f 63 6f 64 65 62 6c 6f  x(ft);.</codeblo
f4a0: 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 46 6f 72 20 65  ck>..<p>.  For e
f4b0: 61 63 68 20 74 65 72 6d 20 70 72 65 73 65 6e 74  ach term present
f4c0: 20 69 6e 20 74 68 65 20 46 54 53 20 74 61 62 6c   in the FTS tabl
f4d0: 65 2c 20 74 68 65 72 65 20 61 72 65 20 62 65 74  e, there are bet
f4e0: 77 65 65 6e 20 32 20 61 6e 64 20 4e 2b 31 20 72  ween 2 and N+1 r
f4f0: 6f 77 73 0a 20 20 69 6e 20 74 68 65 20 66 74 73  ows.  in the fts
f500: 34 61 75 78 20 74 61 62 6c 65 2c 20 77 68 65 72  4aux table, wher
f510: 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  e N is the numbe
f520: 72 20 6f 66 20 75 73 65 72 2d 64 65 66 69 6e 65  r of user-define
f530: 64 20 63 6f 6c 75 6d 6e 73 20 69 6e 0a 20 20 74  d columns in.  t
f540: 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 46 54  he associated FT
f550: 53 20 74 61 62 6c 65 2e 20 41 6e 20 66 74 73 34  S table. An fts4
f560: 61 75 78 20 74 61 62 6c 65 20 61 6c 77 61 79 73  aux table always
f570: 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 66 6f   has the same fo
f580: 75 72 20 63 6f 6c 75 6d 6e 73 2c 20 0a 20 20 61  ur columns, .  a
f590: 73 20 66 6f 6c 6c 6f 77 73 2c 20 66 72 6f 6d 20  s follows, from 
f5a0: 6c 65 66 74 20 74 6f 20 72 69 67 68 74 3a 0a 0a  left to right:..
f5b0: 3c 74 61 62 6c 65 20 73 74 72 69 70 65 64 3d 31  <table striped=1
f5c0: 3e 0a 20 20 3c 74 72 3e 3c 74 68 3e 43 6f 6c 75  >.  <tr><th>Colu
f5d0: 6d 6e 20 4e 61 6d 65 3c 74 68 3e 43 6f 6c 75 6d  mn Name<th>Colum
f5e0: 6e 20 43 6f 6e 74 65 6e 74 73 0a 20 20 3c 74 72  n Contents.  <tr
f5f0: 3e 3c 74 64 3e 74 65 72 6d 3c 74 64 3e 20 0a 20  ><td>term<td> . 
f600: 20 20 20 43 6f 6e 74 61 69 6e 73 20 74 68 65 20     Contains the 
f610: 74 65 78 74 20 6f 66 20 74 68 65 20 74 65 72 6d  text of the term
f620: 20 66 6f 72 20 74 68 69 73 20 72 6f 77 2e 0a 20   for this row.. 
f630: 20 3c 74 72 3e 3c 74 64 3e 63 6f 6c 3c 74 64 3e   <tr><td>col<td>
f640: 20 0a 20 20 20 20 54 68 69 73 20 63 6f 6c 75 6d   .    This colum
f650: 6e 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65 69  n may contain ei
f660: 74 68 65 72 20 74 68 65 20 74 65 78 74 20 76 61  ther the text va
f670: 6c 75 65 20 27 2a 27 20 28 69 2e 65 2e 20 61 20  lue '*' (i.e. a 
f680: 73 69 6e 67 6c 65 20 0a 20 20 20 20 63 68 61 72  single .    char
f690: 61 63 74 65 72 2c 20 55 54 46 20 63 6f 64 65 70  acter, UTF codep
f6a0: 6f 69 6e 74 20 34 32 29 20 6f 72 20 61 6e 20 69  oint 42) or an i
f6b0: 6e 74 65 67 65 72 20 62 65 74 77 65 65 6e 20 30  nteger between 0
f6c0: 20 61 6e 64 20 4e 2d 31 2c 20 77 68 65 72 65 20   and N-1, where 
f6d0: 4e 20 69 73 0a 20 20 20 20 61 67 61 69 6e 20 74  N is.    again t
f6e0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 73 65  he number of use
f6f0: 72 2d 64 65 66 69 6e 65 64 20 63 6f 6c 75 6d 6e  r-defined column
f700: 73 20 69 6e 20 74 68 65 20 63 6f 72 72 65 73 70  s in the corresp
f710: 6f 6e 64 69 6e 67 20 46 54 53 20 74 61 62 6c 65  onding FTS table
f720: 2e 0a 0a 20 20 3c 74 72 3e 3c 74 64 3e 64 6f 63  ...  <tr><td>doc
f730: 75 6d 65 6e 74 73 3c 74 64 3e 0a 20 20 20 20 54  uments<td>.    T
f740: 68 69 73 20 63 6f 6c 75 6d 6e 20 61 6c 77 61 79  his column alway
f750: 73 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e  s contains an in
f760: 74 65 67 65 72 20 76 61 6c 75 65 20 67 72 65 61  teger value grea
f770: 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e 0a 20  ter than zero.. 
f780: 20 20 20 3c 62 72 3e 3c 62 72 3e 0a 20 20 20 20     <br><br>.    
f790: 49 66 20 74 68 65 20 22 63 6f 6c 22 20 63 6f 6c  If the "col" col
f7a0: 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  umn contains the
f7b0: 20 76 61 6c 75 65 20 27 2a 27 2c 20 74 68 65 6e   value '*', then
f7c0: 20 74 68 69 73 20 63 6f 6c 75 6d 6e 0a 20 20 20   this column.   
f7d0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 75   contains the nu
f7e0: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6f 66 20  mber of rows of 
f7f0: 74 68 65 20 46 54 53 20 74 61 62 6c 65 20 74 68  the FTS table th
f800: 61 74 20 63 6f 6e 74 61 69 6e 20 61 74 20 6c 65  at contain at le
f810: 61 73 74 20 6f 6e 65 0a 20 20 20 20 69 6e 73 74  ast one.    inst
f820: 61 6e 63 65 20 6f 66 20 74 68 65 20 74 65 72 6d  ance of the term
f830: 20 28 69 6e 20 61 6e 79 20 63 6f 6c 75 6d 6e 29   (in any column)
f840: 2e 20 49 66 20 63 6f 6c 20 63 6f 6e 74 61 69 6e  . If col contain
f850: 73 20 61 6e 20 69 6e 74 65 67 65 72 0a 20 20 20  s an integer.   
f860: 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 69   value, then thi
f870: 73 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e  s column contain
f880: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
f890: 72 6f 77 73 20 6f 66 20 74 68 65 20 46 54 53 20  rows of the FTS 
f8a0: 74 61 62 6c 65 20 74 68 61 74 0a 20 20 20 20 63  table that.    c
f8b0: 6f 6e 74 61 69 6e 20 61 74 20 6c 65 61 73 74 20  ontain at least 
f8c0: 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  one instance of 
f8d0: 74 68 65 20 74 65 72 6d 20 69 6e 20 74 68 65 20  the term in the 
f8e0: 63 6f 6c 75 6d 6e 20 69 64 65 6e 74 69 66 69 65  column identifie
f8f0: 64 20 62 79 0a 20 20 20 20 74 68 65 20 63 6f 6c  d by.    the col
f900: 20 76 61 6c 75 65 2e 20 41 73 20 75 73 75 61 6c   value. As usual
f910: 2c 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66  , the columns of
f920: 20 74 68 65 20 46 54 53 20 74 61 62 6c 65 20 61   the FTS table a
f930: 72 65 20 6e 75 6d 62 65 72 65 64 0a 20 20 20 20  re numbered.    
f940: 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67  from left to rig
f950: 68 74 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74  ht, starting wit
f960: 68 20 7a 65 72 6f 2e 0a 0a 20 20 3c 74 72 3e 3c  h zero...  <tr><
f970: 74 64 3e 6f 63 63 75 72 72 65 6e 63 65 73 3c 74  td>occurrences<t
f980: 64 3e 0a 20 20 20 20 54 68 69 73 20 63 6f 6c 75  d>.    This colu
f990: 6d 6e 20 61 6c 73 6f 20 61 6c 77 61 79 73 20 63  mn also always c
f9a0: 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 74 65 67  ontains an integ
f9b0: 65 72 20 76 61 6c 75 65 20 67 72 65 61 74 65 72  er value greater
f9c0: 20 74 68 61 6e 20 7a 65 72 6f 2e 0a 20 20 20 20   than zero..    
f9d0: 3c 62 72 3e 3c 62 72 3e 0a 20 20 20 20 49 66 20  <br><br>.    If 
f9e0: 74 68 65 20 22 63 6f 6c 22 20 63 6f 6c 75 6d 6e  the "col" column
f9f0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61   contains the va
fa00: 6c 75 65 20 27 2a 27 2c 20 74 68 65 6e 20 74 68  lue '*', then th
fa10: 69 73 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 63 6f  is column.    co
fa20: 6e 74 61 69 6e 73 20 74 68 65 20 74 6f 74 61 6c  ntains the total
fa30: 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 73 74 61   number of insta
fa40: 6e 63 65 73 20 6f 66 20 74 68 65 20 74 65 72 6d  nces of the term
fa50: 20 69 6e 20 61 6c 6c 20 72 6f 77 73 20 6f 66 20   in all rows of 
fa60: 74 68 65 20 0a 20 20 20 20 46 54 53 20 74 61 62  the .    FTS tab
fa70: 6c 65 20 28 69 6e 20 61 6e 79 20 63 6f 6c 75 6d  le (in any colum
fa80: 6e 29 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  n). Otherwise, i
fa90: 66 20 63 6f 6c 20 63 6f 6e 74 61 69 6e 73 20 61  f col contains a
faa0: 6e 20 69 6e 74 65 67 65 72 0a 20 20 20 20 76 61  n integer.    va
fab0: 6c 75 65 2c 20 74 68 65 6e 20 74 68 69 73 20 63  lue, then this c
fac0: 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 74  olumn contains t
fad0: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
fae0: 6f 66 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20  of instances of 
faf0: 74 68 65 0a 20 20 20 20 74 65 72 6d 20 74 68 61  the.    term tha
fb00: 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  t appear in the 
fb10: 46 54 53 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  FTS table column
fb20: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74   identified by t
fb30: 68 65 20 63 6f 6c 0a 20 20 20 20 76 61 6c 75 65  he col.    value
fb40: 2e 0a 3c 2f 74 61 62 6c 65 3e 0a 0a 3c 70 3e 0a  ..</table>..<p>.
fb50: 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 75    For example, u
fb60: 73 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20  sing the tables 
fb70: 63 72 65 61 74 65 64 20 61 62 6f 76 65 3a 0a 0a  created above:..
fb80: 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 49 4e  <codeblock>.  IN
fb90: 53 45 52 54 20 49 4e 54 4f 20 66 74 28 78 2c 20  SERT INTO ft(x, 
fba0: 79 29 20 56 41 4c 55 45 53 28 27 41 70 70 6c 65  y) VALUES('Apple
fbb0: 20 62 61 6e 61 6e 61 27 2c 20 27 43 68 65 72 72   banana', 'Cherr
fbc0: 79 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  y');.  INSERT IN
fbd0: 54 4f 20 66 74 28 78 2c 20 79 29 20 56 41 4c 55  TO ft(x, y) VALU
fbe0: 45 53 28 27 42 61 6e 61 6e 61 20 44 61 74 65 20  ES('Banana Date 
fbf0: 44 61 74 65 27 2c 20 27 63 68 65 72 72 79 27 29  Date', 'cherry')
fc00: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
fc10: 66 74 28 78 2c 20 79 29 20 56 41 4c 55 45 53 28  ft(x, y) VALUES(
fc20: 27 43 68 65 72 72 79 20 45 6c 64 65 72 62 65 72  'Cherry Elderber
fc30: 72 79 27 2c 20 27 45 6c 64 65 72 62 65 72 72 79  ry', 'Elderberry
fc40: 27 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68 65  ');..  <i>-- The
fc50: 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72 79   following query
fc60: 20 72 65 74 75 72 6e 73 20 74 68 69 73 20 64 61   returns this da
fc70: 74 61 3a 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 3c  ta:</i>.  <i>--<
fc80: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20 20 20  /i>.  <i>--     
fc90: 61 70 70 6c 65 20 20 20 20 20 20 20 7c 20 20 2a  apple       |  *
fca0: 20 20 7c 20 20 31 20 20 7c 20 20 31 3c 2f 69 3e    |  1  |  1</i>
fcb0: 0a 20 20 3c 69 3e 2d 2d 20 20 20 20 20 61 70 70  .  <i>--     app
fcc0: 6c 65 20 20 20 20 20 20 20 7c 20 20 30 20 20 7c  le       |  0  |
fcd0: 20 20 31 20 20 7c 20 20 31 3c 2f 69 3e 0a 20 20    1  |  1</i>.  
fce0: 3c 69 3e 2d 2d 20 20 20 20 20 62 61 6e 61 6e 61  <i>--     banana
fcf0: 20 20 20 20 20 20 7c 20 20 2a 20 20 7c 20 20 32        |  *  |  2
fd00: 20 20 7c 20 20 32 3c 2f 69 3e 0a 20 20 3c 69 3e    |  2</i>.  <i>
fd10: 2d 2d 20 20 20 20 20 62 61 6e 61 6e 61 20 20 20  --     banana   
fd20: 20 20 20 7c 20 20 30 20 20 7c 20 20 32 20 20 7c     |  0  |  2  |
fd30: 20 20 32 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20    2</i>.  <i>-- 
fd40: 20 20 20 20 63 68 65 72 72 79 20 20 20 20 20 20      cherry      
fd50: 7c 20 20 2a 20 20 7c 20 20 33 20 20 7c 20 20 33  |  *  |  3  |  3
fd60: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20 20  </i>.  <i>--    
fd70: 20 63 68 65 72 72 79 20 20 20 20 20 20 7c 20 20   cherry      |  
fd80: 30 20 20 7c 20 20 31 20 20 7c 20 20 31 3c 2f 69  0  |  1  |  1</i
fd90: 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20 20 20 63 68  >.  <i>--     ch
fda0: 65 72 72 79 20 20 20 20 20 20 7c 20 20 31 20 20  erry      |  1  
fdb0: 7c 20 20 32 20 20 7c 20 20 32 3c 2f 69 3e 0a 20  |  2  |  2</i>. 
fdc0: 20 3c 69 3e 2d 2d 20 20 20 20 20 64 61 74 65 20   <i>--     date 
fdd0: 20 20 20 20 20 20 20 7c 20 20 2a 20 20 7c 20 20         |  *  |  
fde0: 31 20 20 7c 20 20 32 3c 2f 69 3e 0a 20 20 3c 69  1  |  2</i>.  <i
fdf0: 3e 2d 2d 20 20 20 20 20 64 61 74 65 20 20 20 20  >--     date    
fe00: 20 20 20 20 7c 20 20 30 20 20 7c 20 20 31 20 20      |  0  |  1  
fe10: 7c 20 20 32 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  |  2</i>.  <i>--
fe20: 20 20 20 20 20 65 6c 64 65 72 62 65 72 72 79 20       elderberry 
fe30: 20 7c 20 20 2a 20 20 7c 20 20 31 20 20 7c 20 20   |  *  |  1  |  
fe40: 32 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20  2</i>.  <i>--   
fe50: 20 20 65 6c 64 65 72 62 65 72 72 79 20 20 7c 20    elderberry  | 
fe60: 20 31 20 20 7c 20 20 31 20 20 7c 20 20 31 3c 2f   1  |  1  |  1</
fe70: 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20 20 20 65  i>.  <i>--     e
fe80: 6c 64 65 72 62 65 72 72 79 20 20 7c 20 20 31 20  lderberry  |  1 
fe90: 20 7c 20 20 31 20 20 7c 20 20 31 3c 2f 69 3e 0a   |  1  |  1</i>.
fea0: 20 20 3c 69 3e 2d 2d 3c 2f 69 3e 0a 20 20 53 45    <i>--</i>.  SE
feb0: 4c 45 43 54 20 74 65 72 6d 2c 20 63 6f 6c 2c 20  LECT term, col, 
fec0: 64 6f 63 75 6d 65 6e 74 73 2c 20 6f 63 63 75 72  documents, occur
fed0: 72 65 6e 63 65 73 20 46 52 4f 4d 20 66 74 5f 74  rences FROM ft_t
fee0: 65 72 6d 73 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63  erms;.</codebloc
fef0: 6b 3e 0a 0a 3c 70 3e 0a 20 20 49 6e 20 74 68 65  k>..<p>.  In the
ff00: 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 76 61   example, the va
ff10: 6c 75 65 73 20 69 6e 20 74 68 65 20 22 74 65 72  lues in the "ter
ff20: 6d 22 20 63 6f 6c 75 6d 6e 20 61 72 65 20 61 6c  m" column are al
ff30: 6c 20 6c 6f 77 65 72 20 63 61 73 65 2c 20 0a 20  l lower case, . 
ff40: 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65   even though the
ff50: 79 20 77 65 72 65 20 69 6e 73 65 72 74 65 64 20  y were inserted 
ff60: 69 6e 74 6f 20 74 61 62 6c 65 20 22 66 74 22 20  into table "ft" 
ff70: 69 6e 20 6d 69 78 65 64 20 63 61 73 65 2e 20 54  in mixed case. T
ff80: 68 69 73 20 69 73 20 62 65 63 61 75 73 65 0a 20  his is because. 
ff90: 20 61 6e 20 66 74 73 33 61 75 78 20 74 61 62 6c   an fts3aux tabl
ffa0: 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74  e contains the t
ffb0: 65 72 6d 73 20 61 73 20 65 78 74 72 61 63 74 65  erms as extracte
ffc0: 64 20 66 72 6f 6d 20 74 68 65 20 64 6f 63 75 6d  d from the docum
ffd0: 65 6e 74 20 74 65 78 74 0a 20 20 62 79 20 74 68  ent text.  by th
ffe0: 65 20 5b 74 6f 6b 65 6e 69 7a 65 72 5d 2e 20 49  e [tokenizer]. I
fff0: 6e 20 74 68 69 73 20 63 61 73 65 2c 20 73 69 6e  n this case, sin
10000 63 65 20 74 61 62 6c 65 20 22 66 74 22 20 75 73  ce table "ft" us
10010 65 73 20 74 68 65 20 0a 20 20 5b 74 6f 6b 65 6e  es the .  [token
10020 69 7a 65 72 7c 73 69 6d 70 6c 65 20 74 6f 6b 65  izer|simple toke
10030 6e 69 7a 65 72 5d 2c 20 74 68 69 73 20 6d 65 61  nizer], this mea
10040 6e 73 20 61 6c 6c 20 74 65 72 6d 73 20 68 61 76  ns all terms hav
10050 65 20 62 65 65 6e 20 66 6f 6c 64 65 64 20 74 6f  e been folded to
10060 0a 20 20 6c 6f 77 65 72 20 63 61 73 65 2e 20 41  .  lower case. A
10070 6c 73 6f 2c 20 74 68 65 72 65 20 69 73 20 28 66  lso, there is (f
10080 6f 72 20 65 78 61 6d 70 6c 65 29 20 6e 6f 20 72  or example) no r
10090 6f 77 20 77 69 74 68 20 63 6f 6c 75 6d 6e 20 22  ow with column "
100a0 74 65 72 6d 22 0a 20 20 73 65 74 20 74 6f 20 22  term".  set to "
100b0 61 70 70 6c 65 22 20 61 6e 64 20 63 6f 6c 75 6d  apple" and colum
100c0 6e 20 22 63 6f 6c 22 20 73 65 74 20 74 6f 20 31  n "col" set to 1
100d0 2e 20 53 69 6e 63 65 20 74 68 65 72 65 20 61 72  . Since there ar
100e0 65 20 6e 6f 20 69 6e 73 74 61 6e 63 65 73 0a 20  e no instances. 
100f0 20 6f 66 20 74 68 65 20 74 65 72 6d 20 22 61 70   of the term "ap
10100 70 6c 65 22 20 69 6e 20 63 6f 6c 75 6d 6e 20 31  ple" in column 1
10110 2c 20 6e 6f 20 72 6f 77 20 69 73 20 70 72 65 73  , no row is pres
10120 65 6e 74 20 69 6e 20 74 68 65 20 66 74 73 34 61  ent in the fts4a
10130 75 78 20 74 61 62 6c 65 2e 0a 0a 3c 70 3e 0a 20  ux table...<p>. 
10140 20 44 75 72 69 6e 67 20 61 20 74 72 61 6e 73 61   During a transa
10150 63 74 69 6f 6e 2c 20 73 6f 6d 65 20 6f 66 20 74  ction, some of t
10160 68 65 20 64 61 74 61 20 77 72 69 74 74 65 6e 20  he data written 
10170 74 6f 20 61 6e 20 46 54 53 20 74 61 62 6c 65 20  to an FTS table 
10180 6d 61 79 20 62 65 20 0a 20 20 63 61 63 68 65 64  may be .  cached
10190 20 69 6e 20 6d 65 6d 6f 72 79 20 61 6e 64 20 77   in memory and w
101a0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61  ritten to the da
101b0 74 61 62 61 73 65 20 6f 6e 6c 79 20 77 68 65 6e  tabase only when
101c0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
101d0 20 69 73 20 0a 20 20 63 6f 6d 6d 69 74 74 65 64   is .  committed
101e0 2e 20 48 6f 77 65 76 65 72 20 74 68 65 20 69 6d  . However the im
101f0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
10200 74 68 65 20 66 74 73 34 61 75 78 20 6d 6f 64 75  the fts4aux modu
10210 6c 65 20 69 73 20 6f 6e 6c 79 20 61 62 6c 65 20  le is only able 
10220 0a 20 20 74 6f 20 72 65 61 64 20 64 61 74 61 20  .  to read data 
10230 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
10240 65 2e 20 49 6e 20 70 72 61 63 74 69 63 65 20 74  e. In practice t
10250 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 69  his means that i
10260 66 20 61 6e 20 66 74 73 34 61 75 78 20 0a 20 20  f an fts4aux .  
10270 74 61 62 6c 65 20 69 73 20 71 75 65 72 69 65 64  table is queried
10280 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 20 74   from within a t
10290 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 77 68  ransaction in wh
102a0 69 63 68 20 74 68 65 20 61 73 73 6f 63 69 61 74  ich the associat
102b0 65 64 20 0a 20 20 46 54 53 20 74 61 62 6c 65 20  ed .  FTS table 
102c0 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  has been modifie
102d0 64 2c 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  d, the results o
102e0 66 20 74 68 65 20 71 75 65 72 79 20 61 72 65 20  f the query are 
102f0 6c 69 6b 65 6c 79 20 74 6f 20 72 65 66 6c 65 63  likely to reflec
10300 74 20 0a 20 20 6f 6e 6c 79 20 61 20 28 70 6f 73  t .  only a (pos
10310 73 69 62 6c 79 20 65 6d 70 74 79 29 20 73 75 62  sibly empty) sub
10320 73 65 74 20 6f 66 20 74 68 65 20 63 68 61 6e 67  set of the chang
10330 65 73 20 6d 61 64 65 2e 0a 0a 3c 68 31 20 69 64  es made...<h1 id
10340 3d 74 6f 6b 65 6e 69 7a 65 72 20 74 61 67 73 3d  =tokenizer tags=
10350 22 74 6f 6b 65 6e 69 7a 65 72 22 3e 54 6f 6b 65  "tokenizer">Toke
10360 6e 69 7a 65 72 73 3c 2f 68 31 3e 0a 0a 3c 70 3e  nizers</h1>..<p>
10370 0a 20 20 41 6e 20 46 54 53 20 74 6f 6b 65 6e 69  .  An FTS tokeni
10380 7a 65 72 20 69 73 20 61 20 73 65 74 20 6f 66 20  zer is a set of 
10390 72 75 6c 65 73 20 66 6f 72 20 65 78 74 72 61 63  rules for extrac
103a0 74 69 6e 67 20 74 65 72 6d 73 20 66 72 6f 6d 20  ting terms from 
103b0 61 20 64 6f 63 75 6d 65 6e 74 20 0a 20 20 6f 72  a document .  or
103c0 20 62 61 73 69 63 20 46 54 53 20 66 75 6c 6c 2d   basic FTS full-
103d0 74 65 78 74 20 71 75 65 72 79 2e 20 0a 0a 3c 70  text query. ..<p
103e0 3e 0a 20 20 55 6e 6c 65 73 73 20 61 20 73 70 65  >.  Unless a spe
103f0 63 69 66 69 63 20 74 6f 6b 65 6e 69 7a 65 72 20  cific tokenizer 
10400 69 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20  is specified as 
10410 70 61 72 74 20 6f 66 20 74 68 65 20 43 52 45 41  part of the CREA
10420 54 45 20 0a 20 20 56 49 52 54 55 41 4c 20 54 41  TE .  VIRTUAL TA
10430 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 75 73  BLE statement us
10440 65 64 20 74 6f 20 63 72 65 61 74 65 20 74 68 65  ed to create the
10450 20 46 54 53 20 74 61 62 6c 65 2c 20 74 68 65 20   FTS table, the 
10460 64 65 66 61 75 6c 74 20 0a 20 20 74 6f 6b 65 6e  default .  token
10470 69 7a 65 72 2c 20 22 73 69 6d 70 6c 65 22 2c 20  izer, "simple", 
10480 69 73 20 75 73 65 64 2e 20 54 68 65 20 73 69 6d  is used. The sim
10490 70 6c 65 20 74 6f 6b 65 6e 69 7a 65 72 20 65 78  ple tokenizer ex
104a0 74 72 61 63 74 73 20 74 6f 6b 65 6e 73 20 66 72  tracts tokens fr
104b0 6f 6d 0a 20 20 61 20 64 6f 63 75 6d 65 6e 74 20  om.  a document 
104c0 6f 72 20 62 61 73 69 63 20 46 54 53 20 66 75 6c  or basic FTS ful
104d0 6c 2d 74 65 78 74 20 71 75 65 72 79 20 61 63 63  l-text query acc
104e0 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 66 6f  ording to the fo
104f0 6c 6c 6f 77 69 6e 67 20 0a 20 20 72 75 6c 65 73  llowing .  rules
10500 3a 0a 0a 3c 75 6c 3e 0a 20 20 3c 6c 69 3e 3c 70  :..<ul>.  <li><p
10510 3e 20 41 20 74 65 72 6d 20 69 73 20 61 20 63 6f  > A term is a co
10520 6e 74 69 67 75 6f 75 73 20 73 65 71 75 65 6e 63  ntiguous sequenc
10530 65 20 6f 66 20 65 6c 69 67 69 62 6c 65 20 63 68  e of eligible ch
10540 61 72 61 63 74 65 72 73 2c 20 77 68 65 72 65 20  aracters, where 
10550 0a 20 20 20 20 65 6c 69 67 69 62 6c 65 20 63 68  .    eligible ch
10560 61 72 61 63 74 65 72 73 20 61 72 65 20 61 6c 6c  aracters are all
10570 20 61 6c 70 68 61 6e 75 6d 65 72 69 63 20 63 68   alphanumeric ch
10580 61 72 61 63 74 65 72 73 2c 20 74 68 65 20 22 5f  aracters, the "_
10590 22 20 63 68 61 72 61 63 74 65 72 2c 0a 20 20 20  " character,.   
105a0 20 61 6e 64 20 61 6c 6c 20 63 68 61 72 61 63 74   and all charact
105b0 65 72 73 20 77 69 74 68 20 55 54 46 20 63 6f 64  ers with UTF cod
105c0 65 70 6f 69 6e 74 73 20 67 72 65 61 74 65 72 20  epoints greater 
105d0 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
105e0 20 31 32 38 2e 0a 20 20 20 20 41 6c 6c 20 6f 74   128..    All ot
105f0 68 65 72 20 63 68 61 72 61 63 74 65 72 73 20 61  her characters a
10600 72 65 20 64 69 73 63 61 72 64 65 64 20 77 68 65  re discarded whe
10610 6e 20 73 70 6c 69 74 74 69 6e 67 20 61 20 64 6f  n splitting a do
10620 63 75 6d 65 6e 74 20 69 6e 74 6f 20 74 65 72 6d  cument into term
10630 73 2e 0a 20 20 20 20 54 68 65 69 72 20 6f 6e 6c  s..    Their onl
10640 79 20 63 6f 6e 74 72 69 62 75 74 69 6f 6e 20 69  y contribution i
10650 73 20 74 6f 20 73 65 70 61 72 61 74 65 20 61 64  s to separate ad
10660 6a 61 63 65 6e 74 20 74 65 72 6d 73 2e 0a 0a 20  jacent terms... 
10670 20 3c 6c 69 3e 3c 70 3e 20 41 6c 6c 20 75 70 70   <li><p> All upp
10680 65 72 63 61 73 65 20 63 68 61 72 61 63 74 65 72  ercase character
10690 73 20 77 69 74 68 69 6e 20 74 68 65 20 41 53 43  s within the ASC
106a0 49 49 20 72 61 6e 67 65 20 28 55 54 46 20 63 6f  II range (UTF co
106b0 64 65 70 6f 69 6e 74 73 20 6c 65 73 73 20 0a 20  depoints less . 
106c0 20 20 20 74 68 61 6e 20 31 32 38 29 2c 20 61 72     than 128), ar
106d0 65 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f  e transformed to
106e0 20 74 68 65 69 72 20 6c 6f 77 65 72 63 61 73 65   their lowercase
106f0 20 65 71 75 69 76 61 6c 65 6e 74 73 20 61 73 20   equivalents as 
10700 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20 20 20  part of the.    
10710 74 6f 6b 65 6e 69 7a 61 74 69 6f 6e 20 70 72 6f  tokenization pro
10720 63 65 73 73 2e 20 54 68 75 73 2c 20 66 75 6c 6c  cess. Thus, full
10730 2d 74 65 78 74 20 71 75 65 72 69 65 73 20 61 72  -text queries ar
10740 65 20 63 61 73 65 2d 69 6e 73 65 6e 73 69 74 69  e case-insensiti
10750 76 65 20 77 68 65 6e 0a 20 20 20 20 75 73 69 6e  ve when.    usin
10760 67 20 74 68 65 20 73 69 6d 70 6c 65 20 74 6f 6b  g the simple tok
10770 65 6e 69 7a 65 72 2e 0a 3c 2f 75 6c 3e 0a 0a 3c  enizer..</ul>..<
10780 70 3e 0a 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  p>.  For example
10790 2c 20 77 68 65 6e 20 61 20 64 6f 63 75 6d 65 6e  , when a documen
107a0 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  t containing the
107b0 20 74 65 78 74 20 22 52 69 67 68 74 20 6e 6f 77   text "Right now
107c0 2c 20 74 68 65 79 27 72 65 20 76 65 72 79 0a 20  , they're very. 
107d0 20 66 72 75 73 74 72 61 74 65 64 2e 22 2c 20 74   frustrated.", t
107e0 68 65 20 74 65 72 6d 73 20 65 78 74 72 61 63 74  he terms extract
107f0 65 64 20 66 72 6f 6d 20 74 68 65 20 64 6f 63 75  ed from the docu
10800 6d 65 6e 74 20 61 6e 64 20 61 64 64 65 64 20 74  ment and added t
10810 6f 20 74 68 65 20 0a 20 20 66 75 6c 6c 2d 74 65  o the .  full-te
10820 78 74 20 69 6e 64 65 78 20 61 72 65 2c 20 69 6e  xt index are, in
10830 20 6f 72 64 65 72 2c 20 22 72 69 67 68 74 20 6e   order, "right n
10840 6f 77 20 74 68 65 79 20 72 65 20 76 65 72 79 20  ow they re very 
10850 66 72 75 73 74 72 61 74 65 64 22 2e 20 53 75 63  frustrated". Suc
10860 68 0a 20 20 61 20 64 6f 63 75 6d 65 6e 74 20 77  h.  a document w
10870 6f 75 6c 64 20 6d 61 74 63 68 20 61 20 66 75 6c  ould match a ful
10880 6c 2d 74 65 78 74 20 71 75 65 72 79 20 73 75 63  l-text query suc
10890 68 20 61 73 20 22 4d 41 54 43 48 20 27 46 72 75  h as "MATCH 'Fru
108a0 73 74 72 61 74 65 64 27 22 2c 20 0a 20 20 61 73  strated'", .  as
108b0 20 74 68 65 20 73 69 6d 70 6c 65 20 74 6f 6b 65   the simple toke
108c0 6e 69 7a 65 72 20 74 72 61 6e 73 66 6f 72 6d 73  nizer transforms
108d0 20 74 68 65 20 74 65 72 6d 20 69 6e 20 74 68 65   the term in the
108e0 20 71 75 65 72 79 20 74 6f 20 6c 6f 77 65 72 63   query to lowerc
108f0 61 73 65 0a 20 20 62 65 66 6f 72 65 20 73 65 61  ase.  before sea
10900 72 63 68 69 6e 67 20 74 68 65 20 66 75 6c 6c 2d  rching the full-
10910 74 65 78 74 20 69 6e 64 65 78 2e 0a 0a 3c 70 3e  text index...<p>
10920 0a 20 20 41 73 20 77 65 6c 6c 20 61 73 20 74 68  .  As well as th
10930 65 20 22 73 69 6d 70 6c 65 22 20 74 6f 6b 65 6e  e "simple" token
10940 69 7a 65 72 2c 20 74 68 65 20 46 54 53 20 73 6f  izer, the FTS so
10950 75 72 63 65 20 63 6f 64 65 20 66 65 61 74 75 72  urce code featur
10960 65 73 20 61 20 74 6f 6b 65 6e 69 7a 65 72 20 0a  es a tokenizer .
10970 20 20 74 68 61 74 20 75 73 65 73 20 74 68 65 20    that uses the 
10980 3c 61 20 68 72 65 66 3d 22 68 74 74 70 3a 2f 2f  <a href="http://
10990 74 61 72 74 61 72 75 73 2e 6f 72 67 2f 7e 6d 61  tartarus.org/~ma
109a0 72 74 69 6e 2f 50 6f 72 74 65 72 53 74 65 6d 6d  rtin/PorterStemm
109b0 65 72 2f 22 3e 50 6f 72 74 65 72 20 0a 20 20 53  er/">Porter .  S
109c0 74 65 6d 6d 69 6e 67 20 61 6c 67 6f 72 69 74 68  temming algorith
109d0 6d 3c 2f 61 3e 2e 20 54 68 69 73 20 74 6f 6b 65  m</a>. This toke
109e0 6e 69 7a 65 72 20 75 73 65 73 20 74 68 65 20 73  nizer uses the s
109f0 61 6d 65 20 72 75 6c 65 73 20 74 6f 20 73 65 70  ame rules to sep
10a00 61 72 61 74 65 0a 20 20 74 68 65 20 69 6e 70 75  arate.  the inpu
10a10 74 20 64 6f 63 75 6d 65 6e 74 20 69 6e 74 6f 20  t document into 
10a20 74 65 72 6d 73 2c 20 62 75 74 20 61 73 20 77 65  terms, but as we
10a30 6c 6c 20 61 73 20 66 6f 6c 64 69 6e 67 20 61 6c  ll as folding al
10a40 6c 20 74 65 72 6d 73 20 74 6f 20 6c 6f 77 65 72  l terms to lower
10a50 0a 20 20 63 61 73 65 20 69 74 20 75 73 65 73 20  .  case it uses 
10a60 74 68 65 20 50 6f 72 74 65 72 20 53 74 65 6d 6d  the Porter Stemm
10a70 69 6e 67 20 61 6c 67 6f 72 69 74 68 6d 20 74 6f  ing algorithm to
10a80 20 72 65 64 75 63 65 20 72 65 6c 61 74 65 64 20   reduce related 
10a90 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65  English language
10aa0 0a 20 20 77 6f 72 64 73 20 74 6f 20 61 20 63 6f  .  words to a co
10ab0 6d 6d 6f 6e 20 72 6f 6f 74 2e 20 46 6f 72 20 65  mmon root. For e
10ac0 78 61 6d 70 6c 65 2c 20 75 73 69 6e 67 20 74 68  xample, using th
10ad0 65 20 73 61 6d 65 20 69 6e 70 75 74 20 64 6f 63  e same input doc
10ae0 75 6d 65 6e 74 20 61 73 20 69 6e 20 74 68 65 0a  ument as in the.
10af0 20 20 70 61 72 61 67 72 61 70 68 20 61 62 6f 76    paragraph abov
10b00 65 2c 20 74 68 65 20 70 6f 72 74 65 72 20 74 6f  e, the porter to
10b10 6b 65 6e 69 7a 65 72 20 65 78 74 72 61 63 74 73  kenizer extracts
10b20 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
10b30 6f 6b 65 6e 73 3a 0a 20 20 22 72 69 67 68 74 20  okens:.  "right 
10b40 6e 6f 77 20 74 68 65 69 20 76 65 72 69 20 66 72  now thei veri fr
10b50 75 73 74 72 61 74 22 2e 20 45 76 65 6e 20 74 68  ustrat". Even th
10b60 6f 75 67 68 20 73 6f 6d 65 20 6f 66 20 74 68 65  ough some of the
10b70 73 65 20 74 65 72 6d 73 20 61 72 65 20 6e 6f 74  se terms are not
10b80 20 65 76 65 6e 0a 20 20 45 6e 67 6c 69 73 68 20   even.  English 
10b90 77 6f 72 64 73 2c 20 69 6e 20 73 6f 6d 65 20 63  words, in some c
10ba0 61 73 65 73 20 75 73 69 6e 67 20 74 68 65 6d 20  ases using them 
10bb0 74 6f 20 62 75 69 6c 64 20 74 68 65 20 66 75 6c  to build the ful
10bc0 6c 2d 74 65 78 74 20 69 6e 64 65 78 20 69 73 20  l-text index is 
10bd0 6d 6f 72 65 0a 20 20 75 73 65 66 75 6c 20 74 68  more.  useful th
10be0 61 6e 20 74 68 65 20 6d 6f 72 65 20 69 6e 74 65  an the more inte
10bf0 6c 6c 69 67 69 62 6c 65 20 6f 75 74 70 75 74 20  lligible output 
10c00 70 72 6f 64 75 63 65 64 20 62 79 20 74 68 65 20  produced by the 
10c10 73 69 6d 70 6c 65 20 74 6f 6b 65 6e 69 7a 65 72  simple tokenizer
10c20 2e 0a 20 20 55 73 69 6e 67 20 74 68 65 20 70 6f  ..  Using the po
10c30 72 74 65 72 20 74 6f 6b 65 6e 69 7a 65 72 2c 20  rter tokenizer, 
10c40 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 6e 6f 74  the document not
10c50 20 6f 6e 6c 79 20 6d 61 74 63 68 65 73 20 66 75   only matches fu
10c60 6c 6c 2d 74 65 78 74 20 71 75 65 72 69 65 73 0a  ll-text queries.
10c70 20 20 73 75 63 68 20 61 73 20 22 4d 41 54 43 48    such as "MATCH
10c80 20 27 46 72 75 73 74 72 61 74 65 64 27 22 2c 20   'Frustrated'", 
10c90 62 75 74 20 61 6c 73 6f 20 71 75 65 72 69 65 73  but also queries
10ca0 20 73 75 63 68 20 61 73 20 22 4d 41 54 43 48 20   such as "MATCH 
10cb0 27 46 72 75 73 74 72 61 74 69 6f 6e 27 22 2c 0a  'Frustration'",.
10cc0 20 20 61 73 20 74 68 65 20 74 65 72 6d 20 22 46    as the term "F
10cd0 72 75 73 74 72 61 74 69 6f 6e 22 20 69 73 20 72  rustration" is r
10ce0 65 64 75 63 65 64 20 62 79 20 74 68 65 20 50 6f  educed by the Po
10cf0 72 74 65 72 20 73 74 65 6d 6d 65 72 20 61 6c 67  rter stemmer alg
10d00 6f 72 69 74 68 6d 20 74 6f 20 0a 20 20 22 66 72  orithm to .  "fr
10d10 75 73 74 72 61 74 22 20 2d 20 6a 75 73 74 20 61  ustrat" - just a
10d20 73 20 22 46 72 75 73 74 72 61 74 65 64 22 20 69  s "Frustrated" i
10d30 73 2e 20 53 6f 2c 20 77 68 65 6e 20 75 73 69 6e  s. So, when usin
10d40 67 20 74 68 65 20 70 6f 72 74 65 72 20 74 6f 6b  g the porter tok
10d50 65 6e 69 7a 65 72 2c 0a 20 20 46 54 53 20 69 73  enizer,.  FTS is
10d60 20 61 62 6c 65 20 74 6f 20 66 69 6e 64 20 6e 6f   able to find no
10d70 74 20 6a 75 73 74 20 65 78 61 63 74 20 6d 61 74  t just exact mat
10d80 63 68 65 73 20 66 6f 72 20 71 75 65 72 69 65 64  ches for queried
10d90 20 74 65 72 6d 73 2c 20 62 75 74 20 6d 61 74 63   terms, but matc
10da0 68 65 73 0a 20 20 61 67 61 69 6e 73 74 20 73 69  hes.  against si
10db0 6d 69 6c 61 72 20 45 6e 67 6c 69 73 68 20 6c 61  milar English la
10dc0 6e 67 75 61 67 65 20 74 65 72 6d 73 2e 20 46 6f  nguage terms. Fo
10dd0 72 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69  r more informati
10de0 6f 6e 20 6f 6e 20 74 68 65 20 0a 20 20 50 6f 72  on on the .  Por
10df0 74 65 72 20 53 74 65 6d 6d 65 72 20 61 6c 67 6f  ter Stemmer algo
10e00 72 69 74 68 6d 2c 20 70 6c 65 61 73 65 20 72 65  rithm, please re
10e10 66 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  fer to the page 
10e20 6c 69 6e 6b 65 64 20 61 62 6f 76 65 2e 0a 0a 3c  linked above...<
10e30 70 3e 0a 20 20 45 78 61 6d 70 6c 65 20 69 6c 6c  p>.  Example ill
10e40 75 73 74 72 61 74 69 6e 67 20 74 68 65 20 64 69  ustrating the di
10e50 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
10e60 20 74 68 65 20 22 73 69 6d 70 6c 65 22 20 61 6e   the "simple" an
10e70 64 20 22 70 6f 72 74 65 72 22 0a 20 20 74 6f 6b  d "porter".  tok
10e80 65 6e 69 7a 65 72 73 3a 0a 0a 3c 63 6f 64 65 62  enizers:..<codeb
10e90 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d 20 43 72  lock>.  <i>-- Cr
10ea0 65 61 74 65 20 61 20 74 61 62 6c 65 20 75 73 69  eate a table usi
10eb0 6e 67 20 74 68 65 20 73 69 6d 70 6c 65 20 74 6f  ng the simple to
10ec0 6b 65 6e 69 7a 65 72 2e 20 49 6e 73 65 72 74 20  kenizer. Insert 
10ed0 61 20 64 6f 63 75 6d 65 6e 74 20 69 6e 74 6f 20  a document into 
10ee0 69 74 2e 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45  it.</i>.  CREATE
10ef0 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 73   VIRTUAL TABLE s
10f00 69 6d 70 6c 65 20 55 53 49 4e 47 20 66 74 73 33  imple USING fts3
10f10 28 74 6f 6b 65 6e 69 7a 65 3d 73 69 6d 70 6c 65  (tokenize=simple
10f20 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
10f30 20 73 69 6d 70 6c 65 20 56 41 4c 55 45 53 28 27   simple VALUES('
10f40 52 69 67 68 74 20 6e 6f 77 20 74 68 65 79 27 27  Right now they''
10f50 72 65 20 76 65 72 79 20 66 72 75 73 74 72 61 74  re very frustrat
10f60 65 64 27 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 54  ed');..  <i>-- T
10f70 68 65 20 66 69 72 73 74 20 6f 66 20 74 68 65 20  he first of the 
10f80 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 71 75  following two qu
10f90 65 72 69 65 73 20 6d 61 74 63 68 65 73 20 74 68  eries matches th
10fa0 65 20 64 6f 63 75 6d 65 6e 74 20 73 74 6f 72 65  e document store
10fb0 64 20 69 6e 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  d in</i>.  <i>--
10fc0 20 74 61 62 6c 65 20 22 73 69 6d 70 6c 65 22 2e   table "simple".
10fd0 20 54 68 65 20 73 65 63 6f 6e 64 20 64 6f 65 73   The second does
10fe0 20 6e 6f 74 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45   not.</i>.  SELE
10ff0 43 54 20 2a 20 46 52 4f 4d 20 73 69 6d 70 6c 65  CT * FROM simple
11000 20 57 48 45 52 45 20 73 69 6d 70 6c 65 20 4d 41   WHERE simple MA
11010 54 43 48 20 27 46 72 75 73 74 72 61 74 65 64 27  TCH 'Frustrated'
11020 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  ;.  SELECT * FRO
11030 4d 20 73 69 6d 70 6c 65 20 57 48 45 52 45 20 73  M simple WHERE s
11040 69 6d 70 6c 65 20 4d 41 54 43 48 20 27 46 72 75  imple MATCH 'Fru
11050 73 74 72 61 74 69 6f 6e 27 3b 0a 0a 20 20 3c 69  stration';..  <i
11060 3e 2d 2d 20 43 72 65 61 74 65 20 61 20 74 61 62  >-- Create a tab
11070 6c 65 20 75 73 69 6e 67 20 74 68 65 20 70 6f 72  le using the por
11080 74 65 72 20 74 6f 6b 65 6e 69 7a 65 72 2e 20 49  ter tokenizer. I
11090 6e 73 65 72 74 20 74 68 65 20 73 61 6d 65 20 64  nsert the same d
110a0 6f 63 75 6d 65 6e 74 20 69 6e 74 6f 20 69 74 3c  ocument into it<
110b0 2f 69 3e 0a 20 20 43 52 45 41 54 45 20 56 49 52  /i>.  CREATE VIR
110c0 54 55 41 4c 20 54 41 42 4c 45 20 70 6f 72 74 65  TUAL TABLE porte
110d0 72 20 55 53 49 4e 47 20 66 74 73 33 28 74 6f 6b  r USING fts3(tok
110e0 65 6e 69 7a 65 3d 70 6f 72 74 65 72 29 3b 0a 20  enize=porter);. 
110f0 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 6f 72   INSERT INTO por
11100 74 65 72 20 56 41 4c 55 45 53 28 27 52 69 67 68  ter VALUES('Righ
11110 74 20 6e 6f 77 20 74 68 65 79 27 27 72 65 20 76  t now they''re v
11120 65 72 79 20 66 72 75 73 74 72 61 74 65 64 27 29  ery frustrated')
11130 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 42 6f 74 68 20  ;..  <i>-- Both 
11140 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
11150 20 71 75 65 72 69 65 73 20 6d 61 74 63 68 20 74   queries match t
11160 68 65 20 64 6f 63 75 6d 65 6e 74 20 73 74 6f 72  he document stor
11170 65 64 20 69 6e 20 74 61 62 6c 65 20 22 70 6f 72  ed in table "por
11180 74 65 72 22 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45  ter".</i>.  SELE
11190 43 54 20 2a 20 46 52 4f 4d 20 70 6f 72 74 65 72  CT * FROM porter
111a0 20 57 48 45 52 45 20 70 6f 72 74 65 72 20 4d 41   WHERE porter MA
111b0 54 43 48 20 27 46 72 75 73 74 72 61 74 65 64 27  TCH 'Frustrated'
111c0 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  ;.  SELECT * FRO
111d0 4d 20 70 6f 72 74 65 72 20 57 48 45 52 45 20 70  M porter WHERE p
111e0 6f 72 74 65 72 20 4d 41 54 43 48 20 27 46 72 75  orter MATCH 'Fru
111f0 73 74 72 61 74 69 6f 6e 27 3b 0a 3c 2f 63 6f 64  stration';.</cod
11200 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 49  eblock>..<p>.  I
11210 66 20 74 68 69 73 20 65 78 74 65 6e 73 69 6f 6e  f this extension
11220 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   is compiled wit
11230 68 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41  h the SQLITE_ENA
11240 42 4c 45 5f 49 43 55 20 70 72 65 2d 70 72 6f 63  BLE_ICU pre-proc
11250 65 73 73 6f 72 0a 20 20 73 79 6d 62 6f 6c 20 64  essor.  symbol d
11260 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 74 68 65  efined, then the
11270 72 65 20 65 78 69 73 74 73 20 61 20 62 75 69 6c  re exists a buil
11280 74 2d 69 6e 20 74 6f 6b 65 6e 69 7a 65 72 20 6e  t-in tokenizer n
11290 61 6d 65 64 20 22 69 63 75 22 0a 20 20 69 6d 70  amed "icu".  imp
112a0 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 74  lemented using t
112b0 68 65 20 49 43 55 20 6c 69 62 72 61 72 79 2e 20  he ICU library. 
112c0 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
112d0 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  nt passed to the
112e0 0a 20 20 78 43 72 65 61 74 65 28 29 20 6d 65 74  .  xCreate() met
112f0 68 6f 64 20 28 73 65 65 20 66 74 73 33 5f 74 6f  hod (see fts3_to
11300 6b 65 6e 69 7a 65 72 2e 68 29 20 6f 66 20 74 68  kenizer.h) of th
11310 69 73 20 74 6f 6b 65 6e 69 7a 65 72 20 6d 61 79  is tokenizer may
11320 20 62 65 0a 20 20 61 6e 20 49 43 55 20 6c 6f 63   be.  an ICU loc
11330 61 6c 65 20 69 64 65 6e 74 69 66 69 65 72 2e 20  ale identifier. 
11340 46 6f 72 20 65 78 61 6d 70 6c 65 20 22 74 72 5f  For example "tr_
11350 54 52 22 20 66 6f 72 20 54 75 72 6b 69 73 68 20  TR" for Turkish 
11360 61 73 20 75 73 65 64 0a 20 20 69 6e 20 54 75 72  as used.  in Tur
11370 6b 65 79 2c 20 6f 72 20 22 65 6e 5f 41 55 22 20  key, or "en_AU" 
11380 66 6f 72 20 45 6e 67 6c 69 73 68 20 61 73 20 75  for English as u
11390 73 65 64 20 69 6e 20 41 75 73 74 72 61 6c 69 61  sed in Australia
113a0 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 0a  . For example:..
113b0 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 20 20  <codeblock>.    
113c0 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
113d0 41 42 4c 45 20 74 68 61 69 5f 74 65 78 74 20 55  ABLE thai_text U
113e0 53 49 4e 47 20 66 74 73 33 28 74 65 78 74 2c 20  SING fts3(text, 
113f0 74 6f 6b 65 6e 69 7a 65 3d 69 63 75 20 74 68 5f  tokenize=icu th_
11400 54 48 29 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e  TH).</codeblock>
11410 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 49 43 55 20  ..<p>.  The ICU 
11420 74 6f 6b 65 6e 69 7a 65 72 20 69 6d 70 6c 65 6d  tokenizer implem
11430 65 6e 74 61 74 69 6f 6e 20 69 73 20 76 65 72 79  entation is very
11440 20 73 69 6d 70 6c 65 2e 20 49 74 20 73 70 6c 69   simple. It spli
11450 74 73 20 74 68 65 20 69 6e 70 75 74 0a 20 20 74  ts the input.  t
11460 65 78 74 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ext according to
11470 20 74 68 65 20 49 43 55 20 72 75 6c 65 73 20 66   the ICU rules f
11480 6f 72 20 66 69 6e 64 69 6e 67 20 77 6f 72 64 20  or finding word 
11490 62 6f 75 6e 64 61 72 69 65 73 20 61 6e 64 20 64  boundaries and d
114a0 69 73 63 61 72 64 73 0a 20 20 61 6e 79 20 74 6f  iscards.  any to
114b0 6b 65 6e 73 20 74 68 61 74 20 63 6f 6e 73 69 73  kens that consis
114c0 74 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 77 68  t entirely of wh
114d0 69 74 65 2d 73 70 61 63 65 2e 20 54 68 69 73 20  ite-space. This 
114e0 6d 61 79 20 62 65 20 73 75 69 74 61 62 6c 65 0a  may be suitable.
114f0 20 20 66 6f 72 20 73 6f 6d 65 20 61 70 70 6c 69    for some appli
11500 63 61 74 69 6f 6e 73 20 69 6e 20 73 6f 6d 65 20  cations in some 
11510 6c 6f 63 61 6c 65 73 2c 20 62 75 74 20 6e 6f 74  locales, but not
11520 20 61 6c 6c 2e 20 49 66 20 6d 6f 72 65 20 63 6f   all. If more co
11530 6d 70 6c 65 78 0a 20 20 70 72 6f 63 65 73 73 69  mplex.  processi
11540 6e 67 20 69 73 20 72 65 71 75 69 72 65 64 2c 20  ng is required, 
11550 66 6f 72 20 65 78 61 6d 70 6c 65 20 74 6f 20 69  for example to i
11560 6d 70 6c 65 6d 65 6e 74 20 73 74 65 6d 6d 69 6e  mplement stemmin
11570 67 20 6f 72 0a 20 20 64 69 73 63 61 72 64 20 70  g or.  discard p
11580 75 6e 63 74 75 61 74 69 6f 6e 2c 20 74 68 69 73  unctuation, this
11590 20 63 61 6e 20 62 65 20 64 6f 6e 65 20 62 79 20   can be done by 
115a0 63 72 65 61 74 69 6e 67 20 61 20 74 6f 6b 65 6e  creating a token
115b0 69 7a 65 72 0a 20 20 69 6d 70 6c 65 6d 65 6e 74  izer.  implement
115c0 61 74 69 6f 6e 20 74 68 61 74 20 75 73 65 73 20  ation that uses 
115d0 74 68 65 20 49 43 55 20 74 6f 6b 65 6e 69 7a 65  the ICU tokenize
115e0 72 20 61 73 20 70 61 72 74 20 6f 66 20 69 74 73  r as part of its
115f0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e   implementation.
11600 0a 0a 3c 68 32 3e 43 75 73 74 6f 6d 20 28 55 73  ..<h2>Custom (Us
11610 65 72 20 49 6d 70 6c 65 6d 65 6e 74 65 64 29 20  er Implemented) 
11620 54 6f 6b 65 6e 69 7a 65 72 73 3c 2f 68 32 3e 0a  Tokenizers</h2>.
11630 0a 3c 70 3e 0a 20 20 41 73 20 77 65 6c 6c 20 61  .<p>.  As well a
11640 73 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 22  s the built-in "
11650 73 69 6d 70 6c 65 22 2c 20 22 70 6f 72 74 65 72  simple", "porter
11660 22 20 61 6e 64 20 28 70 6f 73 73 69 62 6c 79 29  " and (possibly)
11670 20 22 69 63 75 22 20 74 6f 6b 65 6e 69 7a 65 72   "icu" tokenizer
11680 73 2c 0a 20 20 46 54 53 20 65 78 70 6f 72 74 73  s,.  FTS exports
11690 20 61 6e 20 69 6e 74 65 72 66 61 63 65 20 74 68   an interface th
116a0 61 74 20 61 6c 6c 6f 77 73 20 75 73 65 72 73 20  at allows users 
116b0 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 63 75 73  to implement cus
116c0 74 6f 6d 20 74 6f 6b 65 6e 69 7a 65 72 73 0a 20  tom tokenizers. 
116d0 20 75 73 69 6e 67 20 43 2e 20 54 68 65 20 69 6e   using C. The in
116e0 74 65 72 66 61 63 65 20 75 73 65 64 20 74 6f 20  terface used to 
116f0 63 72 65 61 74 65 20 61 20 6e 65 77 20 74 6f 6b  create a new tok
11700 65 6e 69 7a 65 72 20 69 73 20 64 65 66 69 6e 65  enizer is define
11710 64 20 61 6e 64 20 0a 20 20 64 65 73 63 72 69 62  d and .  describ
11720 65 64 20 69 6e 20 74 68 65 20 66 74 73 33 5f 74  ed in the fts3_t
11730 6f 6b 65 6e 69 7a 65 72 2e 68 20 73 6f 75 72 63  okenizer.h sourc
11740 65 20 66 69 6c 65 2e 0a 0a 3c 70 3e 0a 20 20 52  e file...<p>.  R
11750 65 67 69 73 74 65 72 69 6e 67 20 61 20 6e 65 77  egistering a new
11760 20 46 54 53 20 74 6f 6b 65 6e 69 7a 65 72 20 69   FTS tokenizer i
11770 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 72 65 67  s similar to reg
11780 69 73 74 65 72 69 6e 67 20 61 20 6e 65 77 0a 20  istering a new. 
11790 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d   virtual table m
117a0 6f 64 75 6c 65 20 77 69 74 68 20 53 51 4c 69 74  odule with SQLit
117b0 65 2e 20 54 68 65 20 75 73 65 72 20 70 61 73 73  e. The user pass
117c0 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  es a pointer to 
117d0 61 0a 20 20 73 74 72 75 63 74 75 72 65 20 63 6f  a.  structure co
117e0 6e 74 61 69 6e 69 6e 67 20 70 6f 69 6e 74 65 72  ntaining pointer
117f0 73 20 74 6f 20 76 61 72 69 6f 75 73 20 63 61 6c  s to various cal
11800 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 73 20  lback functions 
11810 74 68 61 74 0a 20 20 6d 61 6b 65 20 75 70 20 74  that.  make up t
11820 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
11830 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 74 6f 6b  n of the new tok
11840 65 6e 69 7a 65 72 20 74 79 70 65 2e 20 46 6f 72  enizer type. For
11850 20 74 6f 6b 65 6e 69 7a 65 72 73 2c 0a 20 20 74   tokenizers,.  t
11860 68 65 20 73 74 72 75 63 74 75 72 65 20 28 64 65  he structure (de
11870 66 69 6e 65 64 20 69 6e 20 66 74 73 33 5f 74 6f  fined in fts3_to
11880 6b 65 6e 69 7a 65 72 2e 68 29 20 69 73 20 63 61  kenizer.h) is ca
11890 6c 6c 65 64 0a 20 20 22 73 71 6c 69 74 65 33 5f  lled.  "sqlite3_
118a0 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65  tokenizer_module
118b0 22 2e 0a 0a 3c 70 3e 0a 20 20 46 54 53 20 64 6f  "...<p>.  FTS do
118c0 65 73 20 6e 6f 74 20 65 78 70 6f 73 65 20 61 20  es not expose a 
118d0 43 2d 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  C-function that 
118e0 75 73 65 72 73 20 63 61 6c 6c 20 74 6f 20 72 65  users call to re
118f0 67 69 73 74 65 72 20 6e 65 77 0a 20 20 74 6f 6b  gister new.  tok
11900 65 6e 69 7a 65 72 20 74 79 70 65 73 20 77 69 74  enizer types wit
11910 68 20 61 20 64 61 74 61 62 61 73 65 20 68 61 6e  h a database han
11920 64 6c 65 2e 20 49 6e 73 74 65 61 64 2c 20 74 68  dle. Instead, th
11930 65 20 70 6f 69 6e 74 65 72 20 6d 75 73 74 0a 20  e pointer must. 
11940 20 62 65 20 65 6e 63 6f 64 65 64 20 61 73 20 61   be encoded as a
11950 6e 20 53 51 4c 20 62 6c 6f 62 20 76 61 6c 75 65  n SQL blob value
11960 20 61 6e 64 20 70 61 73 73 65 64 20 74 6f 20 46   and passed to F
11970 54 53 20 74 68 72 6f 75 67 68 20 74 68 65 20 53  TS through the S
11980 51 4c 0a 20 20 65 6e 67 69 6e 65 20 62 79 20 65  QL.  engine by e
11990 76 61 6c 75 61 74 69 6e 67 20 61 20 73 70 65 63  valuating a spec
119a0 69 61 6c 20 73 63 61 6c 61 72 20 66 75 6e 63 74  ial scalar funct
119b0 69 6f 6e 2c 20 22 66 74 73 33 5f 74 6f 6b 65 6e  ion, "fts3_token
119c0 69 7a 65 72 28 29 22 2e 0a 20 20 54 68 65 20 66  izer()"..  The f
119d0 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72 28 29 20  ts3_tokenizer() 
119e0 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20  function may be 
119f0 63 61 6c 6c 65 64 20 77 69 74 68 20 6f 6e 65 20  called with one 
11a00 6f 72 20 74 77 6f 20 61 72 67 75 6d 65 6e 74 73  or two arguments
11a10 2c 0a 20 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ,.  as follows:.
11a20 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 20  .<codeblock>.   
11a30 20 53 45 4c 45 43 54 20 66 74 73 33 5f 74 6f 6b   SELECT fts3_tok
11a40 65 6e 69 7a 65 72 28 26 6c 74 3b 74 6f 6b 65 6e  enizer(&lt;token
11a50 69 7a 65 72 2d 6e 61 6d 65 26 67 74 3b 29 3b 0a  izer-name&gt;);.
11a60 20 20 20 20 53 45 4c 45 43 54 20 66 74 73 33 5f      SELECT fts3_
11a70 74 6f 6b 65 6e 69 7a 65 72 28 26 6c 74 3b 74 6f  tokenizer(&lt;to
11a80 6b 65 6e 69 7a 65 72 2d 6e 61 6d 65 26 67 74 3b  kenizer-name&gt;
11a90 2c 20 26 6c 74 3b 73 71 6c 69 74 65 33 5f 74 6f  , &lt;sqlite3_to
11aa0 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65 20 70  kenizer_module p
11ab0 74 72 26 67 74 3b 29 3b 0a 3c 2f 63 6f 64 65 62  tr&gt;);.</codeb
11ac0 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 57 68 65  lock>..<p>.  Whe
11ad0 72 65 20 3c 74 6f 6b 65 6e 69 7a 65 72 2d 6e 61  re <tokenizer-na
11ae0 6d 65 3e 20 69 73 20 61 20 73 74 72 69 6e 67 20  me> is a string 
11af0 69 64 65 6e 74 69 66 79 69 6e 67 20 74 68 65 20  identifying the 
11b00 74 6f 6b 65 6e 69 7a 65 72 20 61 6e 64 0a 20 20  tokenizer and.  
11b10 3c 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a  <sqlite3_tokeniz
11b20 65 72 5f 6d 6f 64 75 6c 65 20 70 74 72 3e 20 69  er_module ptr> i
11b30 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
11b40 6e 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69  n sqlite3_tokeni
11b50 7a 65 72 5f 6d 6f 64 75 6c 65 0a 20 20 73 74 72  zer_module.  str
11b60 75 63 74 75 72 65 20 65 6e 63 6f 64 65 64 20 61  ucture encoded a
11b70 73 20 61 6e 20 53 51 4c 20 62 6c 6f 62 2e 20 49  s an SQL blob. I
11b80 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
11b90 75 6d 65 6e 74 20 69 73 20 70 72 65 73 65 6e 74  ument is present
11ba0 2c 0a 20 20 69 74 20 69 73 20 72 65 67 69 73 74  ,.  it is regist
11bb0 65 72 65 64 20 61 73 20 74 6f 6b 65 6e 69 7a 65  ered as tokenize
11bc0 72 20 3c 74 6f 6b 65 6e 69 7a 65 72 2d 6e 61 6d  r <tokenizer-nam
11bd0 65 3e 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66  e> and a copy of
11be0 20 69 74 0a 20 20 72 65 74 75 72 6e 65 64 2e 20   it.  returned. 
11bf0 49 66 20 6f 6e 6c 79 20 6f 6e 65 20 61 72 67 75  If only one argu
11c00 6d 65 6e 74 20 69 73 20 70 61 73 73 65 64 2c 20  ment is passed, 
11c10 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
11c20 20 74 6f 6b 65 6e 69 7a 65 72 0a 20 20 69 6d 70   tokenizer.  imp
11c30 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 63 75 72 72  lementation curr
11c40 65 6e 74 6c 79 20 72 65 67 69 73 74 65 72 65 64  ently registered
11c50 20 61 73 20 3c 74 6f 6b 65 6e 69 7a 65 72 2d 6e   as <tokenizer-n
11c60 61 6d 65 3e 20 69 73 20 72 65 74 75 72 6e 65 64  ame> is returned
11c70 2c 0a 20 20 65 6e 63 6f 64 65 64 20 61 73 20 61  ,.  encoded as a
11c80 20 62 6c 6f 62 2e 20 4f 72 2c 20 69 66 20 6e 6f   blob. Or, if no
11c90 20 73 75 63 68 20 74 6f 6b 65 6e 69 7a 65 72 20   such tokenizer 
11ca0 65 78 69 73 74 73 2c 20 61 6e 20 53 51 4c 20 65  exists, an SQL e
11cb0 78 63 65 70 74 69 6f 6e 0a 20 20 28 65 72 72 6f  xception.  (erro
11cc0 72 29 20 69 73 20 72 61 69 73 65 64 2e 0a 0a 3c  r) is raised...<
11cd0 70 3e 0a 20 20 3c 62 3e 53 45 43 55 52 49 54 59  p>.  <b>SECURITY
11ce0 20 57 41 52 4e 49 4e 47 3c 2f 62 3e 3a 20 49 66   WARNING</b>: If
11cf0 20 74 68 65 20 66 74 73 33 2f 34 20 65 78 74 65   the fts3/4 exte
11d00 6e 73 69 6f 6e 20 69 73 20 75 73 65 64 20 69 6e  nsion is used in
11d10 20 61 6e 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 0a   an environment.
11d20 20 20 77 68 65 72 65 20 70 6f 74 65 6e 74 69 61    where potentia
11d30 6c 6c 79 20 6d 61 6c 69 63 69 6f 75 73 20 75 73  lly malicious us
11d40 65 72 73 20 6d 61 79 20 65 78 65 63 75 74 65 20  ers may execute 
11d50 61 72 62 69 74 72 61 72 79 20 53 51 4c 2c 20 74  arbitrary SQL, t
11d60 68 65 79 20 73 68 6f 75 6c 64 20 0a 20 20 62 65  hey should .  be
11d70 20 70 72 65 76 65 6e 74 65 64 20 66 72 6f 6d 20   prevented from 
11d80 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 66 74 73  invoking the fts
11d90 33 5f 74 6f 6b 65 6e 69 7a 65 72 28 29 20 66 75  3_tokenizer() fu
11da0 6e 63 74 69 6f 6e 2c 20 70 6f 73 73 69 62 6c 79  nction, possibly
11db0 20 75 73 69 6e 67 20 0a 20 20 74 68 65 20 5b 73   using .  the [s
11dc0 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68 6f  qlite3_set_autho
11dd0 72 69 7a 65 72 28 29 7c 61 75 74 68 6f 72 69 73  rizer()|authoris
11de0 61 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 5d 2e  ation callback].
11df0 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 66 6f 6c 6c  ..<p>.  The foll
11e00 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 63 6f 6e 74  owing block cont
11e10 61 69 6e 73 20 61 6e 20 65 78 61 6d 70 6c 65 20  ains an example 
11e20 6f 66 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 66  of calling the f
11e30 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72 28 29 0a  ts3_tokenizer().
11e40 20 20 66 75 6e 63 74 69 6f 6e 20 66 72 6f 6d 20    function from 
11e50 43 20 63 6f 64 65 3a 0a 0a 3c 63 6f 64 65 62 6c  C code:..<codebl
11e60 6f 63 6b 3e 0a 20 20 3c 69 3e 2f 2a 0a 20 20 2a  ock>.  <i>/*.  *
11e70 2a 20 52 65 67 69 73 74 65 72 20 61 20 74 6f 6b  * Register a tok
11e80 65 6e 69 7a 65 72 20 69 6d 70 6c 65 6d 65 6e 74  enizer implement
11e90 61 74 69 6f 6e 20 77 69 74 68 20 46 54 53 33 20  ation with FTS3 
11ea0 6f 72 20 46 54 53 34 2e 0a 20 20 2a 2f 3c 2f 69  or FTS4..  */</i
11eb0 3e 0a 20 20 69 6e 74 20 72 65 67 69 73 74 65 72  >.  int register
11ec0 54 6f 6b 65 6e 69 7a 65 72 28 0a 20 20 20 20 73  Tokenizer(.    s
11ed0 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 20 20  qlite3 *db,.    
11ee0 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 20  char *zName,.   
11ef0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 74   const sqlite3_t
11f00 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65 20  okenizer_module 
11f10 2a 70 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20  *p.  ){.    int 
11f20 72 63 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  rc;.    sqlite3_
11f30 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 20  stmt *pStmt;.   
11f40 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
11f50 6c 20 3d 20 22 53 45 4c 45 43 54 20 66 74 73 33  l = "SELECT fts3
11f60 5f 74 6f 6b 65 6e 69 7a 65 72 28 3f 2c 20 3f 29  _tokenizer(?, ?)
11f70 22 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ";..    rc = sql
11f80 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
11f90 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
11fa0 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66  Stmt, 0);.    if
11fb0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11fc0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
11fd0 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73  rc;.    }..    s
11fe0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
11ff0 28 70 53 74 6d 74 2c 20 31 2c 20 7a 4e 61 6d 65  (pStmt, 1, zName
12000 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41  , -1, SQLITE_STA
12010 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  TIC);.    sqlite
12020 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d  3_bind_blob(pStm
12030 74 2c 20 32 2c 20 26 70 2c 20 73 69 7a 65 6f 66  t, 2, &p, sizeof
12040 28 70 29 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  (p), SQLITE_STAT
12050 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  IC);.    sqlite3
12060 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 0a 20  _step(pStmt);.. 
12070 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
12080 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
12090 29 3b 0a 20 20 7d 0a 0a 20 20 3c 69 3e 2f 2a 0a  );.  }..  <i>/*.
120a0 20 20 2a 2a 20 51 75 65 72 79 20 46 54 53 20 66    ** Query FTS f
120b0 6f 72 20 74 68 65 20 74 6f 6b 65 6e 69 7a 65 72  or the tokenizer
120c0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
120d0 6e 61 6d 65 64 20 7a 4e 61 6d 65 2e 0a 20 20 2a  named zName..  *
120e0 2f 3c 2f 69 3e 0a 20 20 69 6e 74 20 71 75 65 72  /</i>.  int quer
120f0 79 54 6f 6b 65 6e 69 7a 65 72 28 0a 20 20 20 20  yTokenizer(.    
12100 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 20  sqlite3 *db,.   
12110 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20   char *zName,.  
12120 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f    const sqlite3_
12130 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65  tokenizer_module
12140 20 2a 2a 70 70 0a 20 20 29 7b 0a 20 20 20 20 69   **pp.  ){.    i
12150 6e 74 20 72 63 3b 0a 20 20 20 20 73 71 6c 69 74  nt rc;.    sqlit
12160 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
12170 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
12180 7a 53 71 6c 20 3d 20 22 53 45 4c 45 43 54 20 66  zSql = "SELECT f
12190 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72 28 3f 29  ts3_tokenizer(?)
121a0 22 3b 0a 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b  ";..    *pp = 0;
121b0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
121c0 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c  3_prepare_v2(db,
121d0 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
121e0 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  t, 0);.    if( r
121f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
12200 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
12210 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69  .    }..    sqli
12220 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53  te3_bind_text(pS
12230 74 6d 74 2c 20 31 2c 20 7a 4e 61 6d 65 2c 20 2d  tmt, 1, zName, -
12240 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  1, SQLITE_STATIC
12250 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  );.    if( SQLIT
12260 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
12270 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20  tep(pStmt) ){.  
12280 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
12290 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d  column_type(pStm
122a0 74 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 42 4c  t, 0)==SQLITE_BL
122b0 4f 42 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  OB ){.        me
122c0 6d 63 70 79 28 70 70 2c 20 73 71 6c 69 74 65 33  mcpy(pp, sqlite3
122d0 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74  _column_blob(pSt
122e0 6d 74 2c 20 30 29 2c 20 73 69 7a 65 6f 66 28 2a  mt, 0), sizeof(*
122f0 70 70 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pp));.      }.  
12300 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20    }..    return 
12310 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
12320 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 3c 2f 63  (pStmt);.  }.</c
12330 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 20 20 0a 3c 68  odeblock>..  .<h
12340 31 20 74 61 67 73 3d 22 73 65 67 6d 65 6e 74 20  1 tags="segment 
12350 62 74 72 65 65 22 3e 44 61 74 61 20 53 74 72 75  btree">Data Stru
12360 63 74 75 72 65 73 3c 2f 68 31 3e 0a 0a 3c 70 3e  ctures</h1>..<p>
12370 0a 20 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20  .  This section 
12380 64 65 73 63 72 69 62 65 73 20 61 74 20 61 20 68  describes at a h
12390 69 67 68 2d 6c 65 76 65 6c 20 74 68 65 20 77 61  igh-level the wa
123a0 79 20 74 68 65 20 46 54 53 20 6d 6f 64 75 6c 65  y the FTS module
123b0 20 73 74 6f 72 65 73 20 69 74 73 0a 20 20 69 6e   stores its.  in
123c0 64 65 78 20 61 6e 64 20 63 6f 6e 74 65 6e 74 20  dex and content 
123d0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
123e0 20 49 74 20 69 73 20 3c 62 3e 6e 6f 74 20 6e 65   It is <b>not ne
123f0 63 65 73 73 61 72 79 20 74 6f 20 72 65 61 64 20  cessary to read 
12400 6f 72 20 0a 20 20 75 6e 64 65 72 73 74 61 6e 64  or .  understand
12410 20 74 68 65 20 6d 61 74 65 72 69 61 6c 20 69 6e   the material in
12420 20 74 68 69 73 20 73 65 63 74 69 6f 6e 20 69 6e   this section in
12430 20 6f 72 64 65 72 20 74 6f 20 75 73 65 20 46 54   order to use FT
12440 53 3c 2f 62 3e 20 69 6e 20 61 6e 20 0a 20 20 61  S</b> in an .  a
12450 70 70 6c 69 63 61 74 69 6f 6e 2e 20 48 6f 77 65  pplication. Howe
12460 76 65 72 2c 20 69 74 20 6d 61 79 20 62 65 20 75  ver, it may be u
12470 73 65 66 75 6c 20 74 6f 20 61 70 70 6c 69 63 61  seful to applica
12480 74 69 6f 6e 20 64 65 76 65 6c 6f 70 65 72 73 20  tion developers 
12490 61 74 74 65 6d 70 74 69 6e 67 20 0a 20 20 74 6f  attempting .  to
124a0 20 61 6e 61 6c 79 7a 65 20 61 6e 64 20 75 6e 64   analyze and und
124b0 65 72 73 74 61 6e 64 20 46 54 53 20 70 65 72 66  erstand FTS perf
124c0 6f 72 6d 61 6e 63 65 20 63 68 61 72 61 63 74 65  ormance characte
124d0 72 69 73 74 69 63 73 2c 20 6f 72 20 74 6f 20 64  ristics, or to d
124e0 65 76 65 6c 6f 70 65 72 73 20 0a 20 20 63 6f 6e  evelopers .  con
124f0 74 65 6d 70 6c 61 74 69 6e 67 20 65 6e 68 61 6e  templating enhan
12500 63 65 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 65  cements to the e
12510 78 69 73 74 69 6e 67 20 46 54 53 20 66 65 61 74  xisting FTS feat
12520 75 72 65 20 73 65 74 2e 0a 0a 3c 74 63 6c 3e 68  ure set...<tcl>h
12530 64 5f 66 72 61 67 6d 65 6e 74 20 2a 73 68 61 64  d_fragment *shad
12540 6f 77 74 61 62 20 7b 46 54 53 20 73 68 61 64 6f  owtab {FTS shado
12550 77 20 74 61 62 6c 65 73 7d 3c 2f 74 63 6c 3e 0a  w tables}</tcl>.
12560 3c 70 3e 0a 20 20 46 6f 72 20 65 61 63 68 20 46  <p>.  For each F
12570 54 53 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  TS virtual table
12580 20 69 6e 20 61 20 64 61 74 61 62 61 73 65 2c 20   in a database, 
12590 74 68 72 65 65 20 74 6f 20 66 69 76 65 20 72 65  three to five re
125a0 61 6c 20 28 6e 6f 6e 2d 76 69 72 74 75 61 6c 29  al (non-virtual)
125b0 20 74 61 62 6c 65 73 0a 20 20 61 72 65 20 63 72   tables.  are cr
125c0 65 61 74 65 64 20 74 6f 20 73 74 6f 72 65 20 74  eated to store t
125d0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61  he underlying da
125e0 74 61 2e 20 20 54 68 65 73 65 20 72 65 61 6c 20  ta.  These real 
125f0 74 61 62 6c 65 73 20 61 72 65 20 63 61 6c 6c 65  tables are calle
12600 64 20 22 73 68 61 64 6f 77 20 74 61 62 6c 65 73  d "shadow tables
12610 22 2e 0a 20 20 54 68 65 20 72 65 61 6c 20 74 61  "..  The real ta
12620 62 6c 65 73 20 61 72 65 20 6e 61 6d 65 64 20 22  bles are named "
12630 25 5f 63 6f 6e 74 65 6e 74 22 2c 0a 20 20 22 25  %_content",.  "%
12640 5f 73 65 67 64 69 72 22 2c 20 22 25 5f 73 65 67  _segdir", "%_seg
12650 6d 65 6e 74 73 22 2c 20 22 25 5f 73 74 61 74 22  ments", "%_stat"
12660 2c 20 61 6e 64 20 22 25 5f 64 6f 63 73 69 7a 65  , and "%_docsize
12670 22 2c 20 77 68 65 72 65 20 22 25 22 20 69 73 20  ", where "%" is 
12680 72 65 70 6c 61 63 65 64 20 62 79 20 74 68 65 20  replaced by the 
12690 6e 61 6d 65 0a 20 20 6f 66 20 74 68 65 20 46 54  name.  of the FT
126a0 53 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  S virtual table.
126b0 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 6c 65 66 74  ..<p>.  The left
126c0 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  most column of t
126d0 68 65 20 22 25 5f 63 6f 6e 74 65 6e 74 22 20 74  he "%_content" t
126e0 61 62 6c 65 20 69 73 20 61 6e 20 49 4e 54 45 47  able is an INTEG
126f0 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 66  ER PRIMARY KEY f
12700 69 65 6c 64 0a 20 20 6e 61 6d 65 64 20 22 64 6f  ield.  named "do
12710 63 69 64 22 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20  cid". Following 
12720 74 68 69 73 20 69 73 20 6f 6e 65 20 63 6f 6c 75  this is one colu
12730 6d 6e 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  mn for each colu
12740 6d 6e 20 6f 66 20 74 68 65 20 46 54 53 0a 20 20  mn of the FTS.  
12750 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 61 73  virtual table as
12760 20 64 65 63 6c 61 72 65 64 20 62 79 20 74 68 65   declared by the
12770 20 75 73 65 72 2c 20 6e 61 6d 65 64 20 62 79 20   user, named by 
12780 70 72 65 70 65 6e 64 69 6e 67 20 74 68 65 20 63  prepending the c
12790 6f 6c 75 6d 6e 20 6e 61 6d 65 0a 20 20 73 75 70  olumn name.  sup
127a0 70 6c 69 65 64 20 62 79 20 74 68 65 20 75 73 65  plied by the use
127b0 72 20 77 69 74 68 20 22 63 3c 69 3e 4e 3c 2f 69  r with "c<i>N</i
127c0 3e 22 2c 20 77 68 65 72 65 20 3c 69 3e 4e 3c 2f  >", where <i>N</
127d0 69 3e 20 69 73 20 74 68 65 20 69 6e 64 65 78 20  i> is the index 
127e0 6f 66 20 74 68 65 20 0a 20 20 63 6f 6c 75 6d 6e  of the .  column
127f0 20 77 69 74 68 69 6e 20 74 68 65 20 74 61 62 6c   within the tabl
12800 65 2c 20 6e 75 6d 62 65 72 65 64 20 66 72 6f 6d  e, numbered from
12810 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 20 73   left to right s
12820 74 61 72 74 69 6e 67 20 77 69 74 68 20 30 2e 20  tarting with 0. 
12830 44 61 74 61 0a 20 20 74 79 70 65 73 20 73 75 70  Data.  types sup
12840 70 6c 69 65 64 20 61 73 20 70 61 72 74 20 6f 66  plied as part of
12850 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
12860 6c 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 61  le declaration a
12870 72 65 20 6e 6f 74 20 75 73 65 64 20 61 73 0a 20  re not used as. 
12880 20 70 61 72 74 20 6f 66 20 74 68 65 20 25 5f 63   part of the %_c
12890 6f 6e 74 65 6e 74 20 74 61 62 6c 65 20 64 65 63  ontent table dec
128a0 6c 61 72 61 74 69 6f 6e 2e 20 46 6f 72 20 65 78  laration. For ex
128b0 61 6d 70 6c 65 3a 0a 0a 3c 63 6f 64 65 62 6c 6f  ample:..<codeblo
128c0 63 6b 3e 0a 20 20 3c 69 3e 2d 2d 20 56 69 72 74  ck>.  <i>-- Virt
128d0 75 61 6c 20 74 61 62 6c 65 20 64 65 63 6c 61 72  ual table declar
128e0 61 74 69 6f 6e 3c 2f 69 3e 0a 20 20 43 52 45 41  ation</i>.  CREA
128f0 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
12900 20 61 62 63 20 55 53 49 4e 47 20 66 74 73 34 28   abc USING fts4(
12910 61 20 4e 55 4d 42 45 52 2c 20 62 20 54 45 58 54  a NUMBER, b TEXT
12920 2c 20 63 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 43  , c);..  <i>-- C
12930 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 25 5f 63  orresponding %_c
12940 6f 6e 74 65 6e 74 20 74 61 62 6c 65 20 64 65 63  ontent table dec
12950 6c 61 72 61 74 69 6f 6e 3c 2f 69 3e 0a 20 20 43  laration</i>.  C
12960 52 45 41 54 45 20 54 41 42 4c 45 20 61 62 63 5f  REATE TABLE abc_
12970 63 6f 6e 74 65 6e 74 28 64 6f 63 69 64 20 49 4e  content(docid IN
12980 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
12990 59 2c 20 63 30 61 2c 20 63 31 62 2c 20 63 32 63  Y, c0a, c1b, c2c
129a0 29 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a  );.</codeblock>.
129b0 0a 3c 70 3e 0a 20 20 54 68 65 20 25 5f 63 6f 6e  .<p>.  The %_con
129c0 74 65 6e 74 20 74 61 62 6c 65 20 63 6f 6e 74 61  tent table conta
129d0 69 6e 73 20 74 68 65 20 75 6e 61 64 75 6c 74 65  ins the unadulte
129e0 72 61 74 65 64 20 64 61 74 61 20 69 6e 73 65 72  rated data inser
129f0 74 65 64 20 62 79 20 74 68 65 20 75 73 65 72 20  ted by the user 
12a00 0a 20 20 69 6e 74 6f 20 74 68 65 20 46 54 53 20  .  into the FTS 
12a10 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 62 79  virtual table by
12a20 20 74 68 65 20 75 73 65 72 2e 20 49 66 20 74 68   the user. If th
12a30 65 20 75 73 65 72 20 64 6f 65 73 20 6e 6f 74 20  e user does not 
12a40 65 78 70 6c 69 63 69 74 6c 79 0a 20 20 73 75 70  explicitly.  sup
12a50 70 6c 79 20 61 20 22 64 6f 63 69 64 22 20 76 61  ply a "docid" va
12a60 6c 75 65 20 77 68 65 6e 20 69 6e 73 65 72 74 69  lue when inserti
12a70 6e 67 20 72 65 63 6f 72 64 73 2c 20 6f 6e 65 20  ng records, one 
12a80 69 73 20 73 65 6c 65 63 74 65 64 20 61 75 74 6f  is selected auto
12a90 6d 61 74 69 63 61 6c 6c 79 0a 20 20 62 79 20 74  matically.  by t
12aa0 68 65 20 73 79 73 74 65 6d 2e 0a 0a 3c 70 3e 0a  he system...<p>.
12ab0 20 20 54 68 65 20 25 5f 73 74 61 74 20 61 6e 64    The %_stat and
12ac0 20 25 5f 64 6f 63 73 69 7a 65 20 74 61 62 6c 65   %_docsize table
12ad0 73 20 61 72 65 20 6f 6e 6c 79 20 63 72 65 61 74  s are only creat
12ae0 65 64 20 69 66 20 74 68 65 20 46 54 53 20 74 61  ed if the FTS ta
12af0 62 6c 65 20 75 73 65 73 20 74 68 65 0a 20 20 46  ble uses the.  F
12b00 54 53 34 20 6d 6f 64 75 6c 65 2c 20 6e 6f 74 20  TS4 module, not 
12b10 46 54 53 33 2e 20 46 75 72 74 68 65 72 6d 6f 72  FTS3. Furthermor
12b20 65 2c 20 74 68 65 20 25 5f 64 6f 63 73 69 7a 65  e, the %_docsize
12b30 20 74 61 62 6c 65 20 69 73 20 6f 6d 69 74 74 65   table is omitte
12b40 64 20 69 66 20 74 68 65 0a 20 20 46 54 53 34 20  d if the.  FTS4 
12b50 74 61 62 6c 65 20 69 73 20 63 72 65 61 74 65 64  table is created
12b60 20 77 69 74 68 20 74 68 65 20 5b 6d 61 74 63 68   with the [match
12b70 69 6e 66 6f 5f 66 74 73 33 7c 22 6d 61 74 63 68  info_fts3|"match
12b80 69 6e 66 6f 3d 66 74 73 33 22 5d 20 64 69 72 65  info=fts3"] dire
12b90 63 74 69 76 65 0a 20 20 73 70 65 63 69 66 69 65  ctive.  specifie
12ba0 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
12bb0 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
12bc0 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
12bd0 20 49 66 20 74 68 65 79 20 61 72 65 20 63 72 65   If they are cre
12be0 61 74 65 64 2c 0a 20 20 74 68 65 20 73 63 68 65  ated,.  the sche
12bf0 6d 61 20 6f 66 20 74 68 65 20 74 77 6f 20 74 61  ma of the two ta
12c00 62 6c 65 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f  bles is as follo
12c10 77 73 3a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a  ws:.<codeblock>.
12c20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 25    CREATE TABLE %
12c30 5f 73 74 61 74 28 0a 20 20 20 20 69 64 20 49 4e  _stat(.    id IN
12c40 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
12c50 59 2c 20 0a 20 20 20 20 76 61 6c 75 65 20 42 4c  Y, .    value BL
12c60 4f 42 0a 20 20 29 3b 0a 0a 20 20 43 52 45 41 54  OB.  );..  CREAT
12c70 45 20 54 41 42 4c 45 20 25 5f 64 6f 63 73 69 7a  E TABLE %_docsiz
12c80 65 28 0a 20 20 20 20 64 6f 63 69 64 20 49 4e 54  e(.    docid INT
12c90 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
12ca0 2c 0a 20 20 20 20 73 69 7a 65 20 42 4c 4f 42 0a  ,.    size BLOB.
12cb0 20 20 29 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b    );.</codeblock
12cc0 3e 0a 0a 3c 70 3e 0a 20 20 46 6f 72 20 65 61 63  >..<p>.  For eac
12cd0 68 20 72 6f 77 20 69 6e 20 74 68 65 20 46 54 53  h row in the FTS
12ce0 20 74 61 62 6c 65 2c 20 74 68 65 20 25 5f 64 6f   table, the %_do
12cf0 63 73 69 7a 65 20 74 61 62 6c 65 20 63 6f 6e 74  csize table cont
12d00 61 69 6e 73 20 61 20 63 6f 72 72 65 73 70 6f 6e  ains a correspon
12d10 64 69 6e 67 0a 20 20 72 6f 77 20 77 69 74 68 20  ding.  row with 
12d20 74 68 65 20 73 61 6d 65 20 22 64 6f 63 69 64 22  the same "docid"
12d30 20 76 61 6c 75 65 2e 20 54 68 65 20 22 73 69 7a   value. The "siz
12d40 65 22 20 66 69 65 6c 64 20 63 6f 6e 74 61 69 6e  e" field contain
12d50 73 20 61 20 62 6c 6f 62 20 63 6f 6e 73 69 73 74  s a blob consist
12d60 69 6e 67 0a 20 20 6f 66 20 3c 69 3e 4e 3c 2f 69  ing.  of <i>N</i
12d70 3e 20 46 54 53 20 76 61 72 69 6e 74 73 2c 20 77  > FTS varints, w
12d80 68 65 72 65 20 3c 69 3e 4e 3c 2f 69 3e 20 69 73  here <i>N</i> is
12d90 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 75   the number of u
12da0 73 65 72 2d 64 65 66 69 6e 65 64 20 63 6f 6c 75  ser-defined colu
12db0 6d 6e 73 0a 20 20 69 6e 20 74 68 65 20 74 61 62  mns.  in the tab
12dc0 6c 65 2e 20 45 61 63 68 20 76 61 72 69 6e 74 20  le. Each varint 
12dd0 69 6e 20 74 68 65 20 22 73 69 7a 65 22 20 62 6c  in the "size" bl
12de0 6f 62 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ob is the number
12df0 20 6f 66 20 74 6f 6b 65 6e 73 20 69 6e 20 74 68   of tokens in th
12e00 65 0a 20 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  e.  correspondin
12e10 67 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  g column of the 
12e20 61 73 73 6f 63 69 61 74 65 64 20 72 6f 77 20 69  associated row i
12e30 6e 20 74 68 65 20 46 54 53 20 74 61 62 6c 65 2e  n the FTS table.
12e40 20 54 68 65 20 25 5f 73 74 61 74 20 74 61 62 6c   The %_stat tabl
12e50 65 0a 20 20 61 6c 77 61 79 73 20 63 6f 6e 74 61  e.  always conta
12e60 69 6e 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  ins a single row
12e70 20 77 69 74 68 20 74 68 65 20 22 69 64 22 20 63   with the "id" c
12e80 6f 6c 75 6d 6e 20 73 65 74 20 74 6f 20 30 2e 20  olumn set to 0. 
12e90 54 68 65 20 22 76 61 6c 75 65 22 20 0a 20 20 63  The "value" .  c
12ea0 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61  olumn contains a
12eb0 20 62 6c 6f 62 20 63 6f 6e 73 69 73 74 69 6e 67   blob consisting
12ec0 20 6f 66 20 3c 69 3e 4e 2b 31 3c 2f 69 3e 20 46   of <i>N+1</i> F
12ed0 54 53 20 76 61 72 69 6e 74 73 2c 20 77 68 65 72  TS varints, wher
12ee0 65 20 3c 69 3e 4e 3c 2f 69 3e 0a 20 20 69 73 20  e <i>N</i>.  is 
12ef0 61 67 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72  again the number
12f00 20 6f 66 20 75 73 65 72 2d 64 65 66 69 6e 65 64   of user-defined
12f10 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
12f20 46 54 53 20 74 61 62 6c 65 2e 20 54 68 65 20 66  FTS table. The f
12f30 69 72 73 74 0a 20 20 76 61 72 69 6e 74 20 69 6e  irst.  varint in
12f40 20 74 68 65 20 62 6c 6f 62 20 69 73 20 73 65 74   the blob is set
12f50 20 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   to the total nu
12f60 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
12f70 74 68 65 20 46 54 53 20 74 61 62 6c 65 2e 20 54  the FTS table. T
12f80 68 65 0a 20 20 73 65 63 6f 6e 64 20 61 6e 64 20  he.  second and 
12f90 73 75 62 73 65 71 75 65 6e 74 20 76 61 72 69 6e  subsequent varin
12fa0 74 73 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 74  ts contain the t
12fb0 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 74  otal number of t
12fc0 6f 6b 65 6e 73 20 73 74 6f 72 65 64 20 69 6e 0a  okens stored in.
12fd0 20 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64    the correspond
12fe0 69 6e 67 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 61  ing column for a
12ff0 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68 65 20 46  ll rows of the F
13000 54 53 20 74 61 62 6c 65 2e 0a 0a 3c 70 3e 0a 20  TS table...<p>. 
13010 20 54 68 65 20 74 77 6f 20 72 65 6d 61 69 6e 69   The two remaini
13020 6e 67 20 74 61 62 6c 65 73 2c 20 25 5f 73 65 67  ng tables, %_seg
13030 6d 65 6e 74 73 20 61 6e 64 20 25 5f 73 65 67 64  ments and %_segd
13040 69 72 2c 20 61 72 65 20 75 73 65 64 20 74 6f 20  ir, are used to 
13050 73 74 6f 72 65 20 74 68 65 20 0a 20 20 66 75 6c  store the .  ful
13060 6c 2d 74 65 78 74 20 69 6e 64 65 78 2e 20 43 6f  l-text index. Co
13070 6e 63 65 70 74 75 61 6c 6c 79 2c 20 74 68 69 73  nceptually, this
13080 20 69 6e 64 65 78 20 69 73 20 61 20 6c 6f 6f 6b   index is a look
13090 75 70 20 74 61 62 6c 65 20 74 68 61 74 20 6d 61  up table that ma
130a0 70 73 20 65 61 63 68 20 0a 20 20 74 65 72 6d 20  ps each .  term 
130b0 28 77 6f 72 64 29 20 74 6f 20 74 68 65 20 73 65  (word) to the se
130c0 74 20 6f 66 20 64 6f 63 69 64 20 76 61 6c 75 65  t of docid value
130d0 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  s corresponding 
130e0 74 6f 20 72 65 63 6f 72 64 73 20 69 6e 20 74 68  to records in th
130f0 65 20 0a 20 20 25 5f 63 6f 6e 74 65 6e 74 20 74  e .  %_content t
13100 61 62 6c 65 20 74 68 61 74 20 63 6f 6e 74 61 69  able that contai
13110 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 63  n one or more oc
13120 63 75 72 72 65 6e 63 65 73 20 6f 66 20 74 68 65  currences of the
13130 20 74 65 72 6d 2e 20 54 6f 0a 20 20 72 65 74 72   term. To.  retr
13140 69 65 76 65 20 61 6c 6c 20 64 6f 63 75 6d 65 6e  ieve all documen
13150 74 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20  ts that contain 
13160 61 20 73 70 65 63 69 66 69 65 64 20 74 65 72 6d  a specified term
13170 2c 20 74 68 65 20 46 54 53 20 6d 6f 64 75 6c 65  , the FTS module
13180 0a 20 20 71 75 65 72 69 65 73 20 74 68 69 73 20  .  queries this 
13190 69 6e 64 65 78 20 74 6f 20 64 65 74 65 72 6d 69  index to determi
131a0 6e 65 20 74 68 65 20 73 65 74 20 6f 66 20 64 6f  ne the set of do
131b0 63 69 64 20 76 61 6c 75 65 73 20 66 6f 72 20 72  cid values for r
131c0 65 63 6f 72 64 73 20 74 68 61 74 0a 20 20 63 6f  ecords that.  co
131d0 6e 74 61 69 6e 20 74 68 65 20 74 65 72 6d 2c 20  ntain the term, 
131e0 74 68 65 6e 20 72 65 74 72 69 65 76 65 73 20 74  then retrieves t
131f0 68 65 20 72 65 71 75 69 72 65 64 20 64 6f 63 75  he required docu
13200 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 25  ments from the %
13210 5f 63 6f 6e 74 65 6e 74 0a 20 20 74 61 62 6c 65  _content.  table
13220 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  . Regardless of 
13230 74 68 65 20 73 63 68 65 6d 61 20 6f 66 20 74 68  the schema of th
13240 65 20 46 54 53 20 76 69 72 74 75 61 6c 20 74 61  e FTS virtual ta
13250 62 6c 65 2c 20 74 68 65 20 25 5f 73 65 67 6d 65  ble, the %_segme
13260 6e 74 73 0a 20 20 61 6e 64 20 25 5f 73 65 67 64  nts.  and %_segd
13270 69 72 20 74 61 62 6c 65 73 20 61 72 65 20 61 6c  ir tables are al
13280 77 61 79 73 20 63 72 65 61 74 65 64 20 61 73 20  ways created as 
13290 66 6f 6c 6c 6f 77 73 3a 0a 0a 3c 63 6f 64 65 62  follows:..<codeb
132a0 6c 6f 63 6b 3e 0a 20 20 43 52 45 41 54 45 20 54  lock>.  CREATE T
132b0 41 42 4c 45 20 25 5f 73 65 67 6d 65 6e 74 73 28  ABLE %_segments(
132c0 0a 20 20 20 20 62 6c 6f 63 6b 69 64 20 49 4e 54  .    blockid INT
132d0 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
132e0 2c 20 20 20 20 20 20 20 3c 69 3e 2d 2d 20 42 2d  ,       <i>-- B-
132f0 74 72 65 65 20 6e 6f 64 65 20 69 64 3c 2f 69 3e  tree node id</i>
13300 0a 20 20 20 20 62 6c 6f 63 6b 20 62 6c 6f 62 20  .    block blob 
13310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13320 20 20 20 20 20 20 20 20 3c 69 3e 2d 2d 20 42 2d          <i>-- B-
13330 74 72 65 65 20 6e 6f 64 65 20 64 61 74 61 3c 2f  tree node data</
13340 69 3e 0a 20 20 29 3b 0a 0a 20 20 43 52 45 41 54  i>.  );..  CREAT
13350 45 20 54 41 42 4c 45 20 25 5f 73 65 67 64 69 72  E TABLE %_segdir
13360 28 0a 20 20 20 20 6c 65 76 65 6c 20 49 4e 54 45  (.    level INTE
13370 47 45 52 2c 0a 20 20 20 20 69 64 78 20 49 4e 54  GER,.    idx INT
13380 45 47 45 52 2c 0a 20 20 20 20 73 74 61 72 74 5f  EGER,.    start_
13390 62 6c 6f 63 6b 20 49 4e 54 45 47 45 52 2c 20 20  block INTEGER,  
133a0 20 20 20 20 20 20 20 20 20 20 20 20 20 3c 69 3e               <i>
133b0 2d 2d 20 42 6c 6f 63 6b 69 64 20 6f 66 20 66 69  -- Blockid of fi
133c0 72 73 74 20 6e 6f 64 65 20 69 6e 20 25 5f 73 65  rst node in %_se
133d0 67 6d 65 6e 74 73 3c 2f 69 3e 0a 20 20 20 20 6c  gments</i>.    l
133e0 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 20  eaves_end_block 
133f0 49 4e 54 45 47 45 52 2c 20 20 20 20 20 20 20 20  INTEGER,        
13400 20 20 3c 69 3e 2d 2d 20 42 6c 6f 63 6b 69 64 20    <i>-- Blockid 
13410 6f 66 20 6c 61 73 74 20 6c 65 61 66 20 6e 6f 64  of last leaf nod
13420 65 20 69 6e 20 25 5f 73 65 67 6d 65 6e 74 73 3c  e in %_segments<
13430 2f 69 3e 0a 20 20 20 20 65 6e 64 5f 62 6c 6f 63  /i>.    end_bloc
13440 6b 20 49 4e 54 45 47 45 52 2c 20 20 20 20 20 20  k INTEGER,      
13450 20 20 20 20 20 20 20 20 20 20 20 3c 69 3e 2d 2d             <i>--
13460 20 42 6c 6f 63 6b 69 64 20 6f 66 20 6c 61 73 74   Blockid of last
13470 20 6e 6f 64 65 20 69 6e 20 25 5f 73 65 67 6d 65   node in %_segme
13480 6e 74 73 3c 2f 69 3e 0a 20 20 20 20 72 6f 6f 74  nts</i>.    root
13490 20 42 4c 4f 42 2c 20 20 20 20 20 20 20 20 20 20   BLOB,          
134a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3c                 <
134b0 69 3e 2d 2d 20 42 2d 74 72 65 65 20 72 6f 6f 74  i>-- B-tree root
134c0 20 6e 6f 64 65 3c 2f 69 3e 0a 20 20 20 20 50 52   node</i>.    PR
134d0 49 4d 41 52 59 20 4b 45 59 28 6c 65 76 65 6c 2c  IMARY KEY(level,
134e0 20 69 64 78 29 0a 20 20 29 3b 0a 3c 2f 63 6f 64   idx).  );.</cod
134f0 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 54  eblock>..<p>.  T
13500 68 65 20 73 63 68 65 6d 61 20 64 65 70 69 63 74  he schema depict
13510 65 64 20 61 62 6f 76 65 20 69 73 20 6e 6f 74 20  ed above is not 
13520 64 65 73 69 67 6e 65 64 20 74 6f 20 73 74 6f 72  designed to stor
13530 65 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20  e the full-text 
13540 69 6e 64 65 78 20 0a 20 20 64 69 72 65 63 74 6c  index .  directl
13550 79 2e 20 49 6e 73 74 65 61 64 2c 20 69 74 20 69  y. Instead, it i
13560 73 20 75 73 65 64 20 74 6f 20 6f 6e 65 20 6f 72  s used to one or
13570 20 6d 6f 72 65 20 62 2d 74 72 65 65 20 73 74 72   more b-tree str
13580 75 63 74 75 72 65 73 2e 20 54 68 65 72 65 0a 20  uctures. There. 
13590 20 69 73 20 6f 6e 65 20 62 2d 74 72 65 65 20 66   is one b-tree f
135a0 6f 72 20 65 61 63 68 20 72 6f 77 20 69 6e 20 74  or each row in t
135b0 68 65 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c  he %_segdir tabl
135c0 65 2e 20 54 68 65 20 25 5f 73 65 67 64 69 72 20  e. The %_segdir 
135d0 74 61 62 6c 65 0a 20 20 72 6f 77 20 63 6f 6e 74  table.  row cont
135e0 61 69 6e 73 20 74 68 65 20 72 6f 6f 74 20 6e 6f  ains the root no
135f0 64 65 20 61 6e 64 20 76 61 72 69 6f 75 73 20 6d  de and various m
13600 65 74 61 2d 64 61 74 61 20 61 73 73 6f 63 69 61  eta-data associa
13610 74 65 64 20 77 69 74 68 20 74 68 65 0a 20 20 62  ted with the.  b
13620 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2c  -tree structure,
13630 20 61 6e 64 20 74 68 65 20 25 5f 73 65 67 6d 65   and the %_segme
13640 6e 74 73 20 74 61 62 6c 65 20 63 6f 6e 74 61 69  nts table contai
13650 6e 73 20 61 6c 6c 20 6f 74 68 65 72 20 28 6e 6f  ns all other (no
13660 6e 2d 72 6f 6f 74 29 0a 20 20 62 2d 74 72 65 65  n-root).  b-tree
13670 20 6e 6f 64 65 73 2e 20 45 61 63 68 20 62 2d 74   nodes. Each b-t
13680 72 65 65 20 69 73 20 72 65 66 65 72 72 65 64 20  ree is referred 
13690 74 6f 20 61 73 20 61 20 22 73 65 67 6d 65 6e 74  to as a "segment
136a0 22 2e 20 4f 6e 63 65 20 69 74 20 68 61 73 0a 20  ". Once it has. 
136b0 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20 61   been created, a
136c0 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 20   segment b-tree 
136d0 69 73 20 6e 65 76 65 72 20 75 70 64 61 74 65 64  is never updated
136e0 20 28 61 6c 74 68 6f 75 67 68 20 69 74 20 6d 61   (although it ma
136f0 79 20 62 65 0a 20 20 64 65 6c 65 74 65 64 20 61  y be.  deleted a
13700 6c 74 6f 67 65 74 68 65 72 29 2e 0a 0a 3c 70 3e  ltogether)...<p>
13710 0a 20 20 54 68 65 20 6b 65 79 73 20 75 73 65 64  .  The keys used
13720 20 62 79 20 65 61 63 68 20 73 65 67 6d 65 6e 74   by each segment
13730 20 62 2d 74 72 65 65 20 61 72 65 20 74 65 72 6d   b-tree are term
13740 73 20 28 77 6f 72 64 73 29 2e 20 41 73 20 77 65  s (words). As we
13750 6c 6c 20 61 73 20 74 68 65 0a 20 20 6b 65 79 2c  ll as the.  key,
13760 20 65 61 63 68 20 73 65 67 6d 65 6e 74 20 62 2d   each segment b-
13770 74 72 65 65 20 65 6e 74 72 79 20 68 61 73 20 61  tree entry has a
13780 6e 20 61 73 73 6f 63 69 61 74 65 64 20 22 64 6f  n associated "do
13790 63 6c 69 73 74 22 20 28 64 6f 63 75 6d 65 6e 74  clist" (document
137a0 20 6c 69 73 74 29 2e 0a 20 20 41 20 64 6f 63 6c   list)..  A docl
137b0 69 73 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ist consists of 
137c0 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 65 6e 74  zero or more ent
137d0 72 69 65 73 2c 20 77 68 65 72 65 20 65 61 63 68  ries, where each
137e0 20 65 6e 74 72 79 20 63 6f 6e 73 69 73 74 73 20   entry consists 
137f0 6f 66 3a 0a 0a 3c 75 6c 3e 0a 20 20 3c 6c 69 3e  of:..<ul>.  <li>
13800 20 41 20 64 6f 63 69 64 20 28 64 6f 63 75 6d 65   A docid (docume
13810 6e 74 20 69 64 29 2c 20 61 6e 64 0a 20 20 3c 6c  nt id), and.  <l
13820 69 3e 20 41 20 6c 69 73 74 20 6f 66 20 74 65 72  i> A list of ter
13830 6d 20 6f 66 66 73 65 74 73 2c 20 6f 6e 65 20 66  m offsets, one f
13840 6f 72 20 65 61 63 68 20 6f 63 63 75 72 72 65 6e  or each occurren
13850 63 65 20 6f 66 20 74 68 65 20 74 65 72 6d 20 77  ce of the term w
13860 69 74 68 69 6e 0a 20 20 20 20 20 20 20 74 68 65  ithin.       the
13870 20 64 6f 63 75 6d 65 6e 74 2e 20 41 20 74 65 72   document. A ter
13880 6d 20 6f 66 66 73 65 74 20 69 6e 64 69 63 61 74  m offset indicat
13890 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  es the number of
138a0 20 74 6f 6b 65 6e 73 20 28 77 6f 72 64 73 29 0a   tokens (words).
138b0 20 20 20 20 20 20 20 74 68 61 74 20 6f 63 63 75         that occu
138c0 72 20 62 65 66 6f 72 65 20 74 68 65 20 74 65 72  r before the ter
138d0 6d 20 69 6e 20 71 75 65 73 74 69 6f 6e 2c 20 6e  m in question, n
138e0 6f 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ot the number of
138f0 20 63 68 61 72 61 63 74 65 72 73 0a 20 20 20 20   characters.    
13900 20 20 20 6f 72 20 62 79 74 65 73 2e 20 46 6f 72     or bytes. For
13910 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 74 65   example, the te
13920 72 6d 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65  rm offset of the
13930 20 74 65 72 6d 20 22 77 61 72 22 20 69 6e 20 74   term "war" in t
13940 68 65 0a 20 20 20 20 20 20 20 70 68 72 61 73 65  he.       phrase
13950 20 22 41 6e 63 65 73 74 72 61 6c 20 76 6f 69 63   "Ancestral voic
13960 65 73 20 70 72 6f 70 68 65 73 79 69 6e 67 20 77  es prophesying w
13970 61 72 21 22 20 69 73 20 33 2e 0a 3c 2f 75 6c 3e  ar!" is 3..</ul>
13980 0a 0a 3c 70 3e 0a 20 20 45 6e 74 72 69 65 73 20  ..<p>.  Entries 
13990 77 69 74 68 69 6e 20 61 20 64 6f 63 6c 69 73 74  within a doclist
139a0 20 61 72 65 20 73 6f 72 74 65 64 20 62 79 20 64   are sorted by d
139b0 6f 63 69 64 2e 20 50 6f 73 69 74 69 6f 6e 73 20  ocid. Positions 
139c0 77 69 74 68 69 6e 20 61 20 64 6f 63 6c 69 73 74  within a doclist
139d0 0a 20 20 65 6e 74 72 79 20 61 72 65 20 73 74 6f  .  entry are sto
139e0 72 65 64 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  red in ascending
139f0 20 6f 72 64 65 72 2e 0a 0a 3c 70 3e 0a 20 20 54   order...<p>.  T
13a00 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
13a10 68 65 20 6c 6f 67 69 63 61 6c 20 66 75 6c 6c 2d  he logical full-
13a20 74 65 78 74 20 69 6e 64 65 78 20 69 73 20 66 6f  text index is fo
13a30 75 6e 64 20 62 79 20 6d 65 72 67 69 6e 67 20 74  und by merging t
13a40 68 65 0a 20 20 63 6f 6e 74 65 6e 74 73 20 6f 66  he.  contents of
13a50 20 61 6c 6c 20 73 65 67 6d 65 6e 74 20 62 2d 74   all segment b-t
13a60 72 65 65 73 2e 20 49 66 20 61 20 74 65 72 6d 20  rees. If a term 
13a70 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 6d 6f  is present in mo
13a80 72 65 20 74 68 61 6e 20 6f 6e 65 0a 20 20 73 65  re than one.  se
13a90 67 6d 65 6e 74 20 62 2d 74 72 65 65 2c 20 74 68  gment b-tree, th
13aa0 65 6e 20 69 74 20 6d 61 70 73 20 74 6f 20 74 68  en it maps to th
13ab0 65 20 75 6e 69 6f 6e 20 6f 66 20 65 61 63 68 20  e union of each 
13ac0 69 6e 64 69 76 69 64 75 61 6c 20 64 6f 63 6c 69  individual docli
13ad0 73 74 2e 20 49 66 2c 0a 20 20 66 6f 72 20 61 20  st. If,.  for a 
13ae0 73 69 6e 67 6c 65 20 74 65 72 6d 2c 20 74 68 65  single term, the
13af0 20 73 61 6d 65 20 64 6f 63 69 64 20 6f 63 63 75   same docid occu
13b00 72 73 20 69 6e 20 6d 6f 72 65 20 74 68 61 6e 20  rs in more than 
13b10 6f 6e 65 20 64 6f 63 6c 69 73 74 2c 20 74 68 65  one doclist, the
13b20 6e 20 6f 6e 6c 79 0a 20 20 74 68 65 20 64 6f 63  n only.  the doc
13b30 6c 69 73 74 20 74 68 61 74 20 69 73 20 70 61 72  list that is par
13b40 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  t of the most re
13b50 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20 73  cently created s
13b60 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 20 69 73  egment b-tree is
13b70 20 0a 20 20 63 6f 6e 73 69 64 65 72 65 64 20 76   .  considered v
13b80 61 6c 69 64 2e 20 0a 0a 3c 70 3e 0a 20 20 4d 75  alid. ..<p>.  Mu
13b90 6c 74 69 70 6c 65 20 62 2d 74 72 65 65 20 73 74  ltiple b-tree st
13ba0 72 75 63 74 75 72 65 73 20 61 72 65 20 75 73 65  ructures are use
13bb0 64 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 73  d instead of a s
13bc0 69 6e 67 6c 65 20 62 2d 74 72 65 65 20 74 6f 20  ingle b-tree to 
13bd0 72 65 64 75 63 65 0a 20 20 74 68 65 20 63 6f 73  reduce.  the cos
13be0 74 20 6f 66 20 69 6e 73 65 72 74 69 6e 67 20 72  t of inserting r
13bf0 65 63 6f 72 64 73 20 69 6e 74 6f 20 46 54 53 20  ecords into FTS 
13c00 74 61 62 6c 65 73 2e 20 57 68 65 6e 20 61 20 6e  tables. When a n
13c10 65 77 20 72 65 63 6f 72 64 20 69 73 20 0a 20 20  ew record is .  
13c20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 61 6e  inserted into an
13c30 20 46 54 53 20 74 61 62 6c 65 20 74 68 61 74 20   FTS table that 
13c40 61 6c 72 65 61 64 79 20 63 6f 6e 74 61 69 6e 73  already contains
13c50 20 61 20 6c 6f 74 20 6f 66 20 64 61 74 61 2c 20   a lot of data, 
13c60 69 74 20 69 73 0a 20 20 6c 69 6b 65 6c 79 20 74  it is.  likely t
13c70 68 61 74 20 6d 61 6e 79 20 6f 66 20 74 68 65 20  hat many of the 
13c80 74 65 72 6d 73 20 69 6e 20 74 68 65 20 6e 65 77  terms in the new
13c90 20 72 65 63 6f 72 64 20 61 72 65 20 61 6c 72 65   record are alre
13ca0 61 64 79 20 70 72 65 73 65 6e 74 20 69 6e 0a 20  ady present in. 
13cb0 20 61 20 6c 61 72 67 65 20 6e 75 6d 62 65 72 20   a large number 
13cc0 6f 66 20 65 78 69 73 74 69 6e 67 20 72 65 63 6f  of existing reco
13cd0 72 64 73 2e 20 49 66 20 61 20 73 69 6e 67 6c 65  rds. If a single
13ce0 20 62 2d 74 72 65 65 20 77 65 72 65 20 75 73 65   b-tree were use
13cf0 64 2c 20 74 68 65 6e 0a 20 20 6c 61 72 67 65 20  d, then.  large 
13d00 64 6f 63 6c 69 73 74 20 73 74 72 75 63 74 75 72  doclist structur
13d10 65 73 20 77 6f 75 6c 64 20 68 61 76 65 20 74 6f  es would have to
13d20 20 62 65 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20   be loaded from 
13d30 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a 20 20  the database,.  
13d40 61 6d 65 6e 64 65 64 20 74 6f 20 69 6e 63 6c 75  amended to inclu
13d50 64 65 20 74 68 65 20 6e 65 77 20 64 6f 63 69 64  de the new docid
13d60 20 61 6e 64 20 74 65 72 6d 2d 6f 66 66 73 65 74   and term-offset
13d70 20 6c 69 73 74 2c 20 74 68 65 6e 20 77 72 69 74   list, then writ
13d80 74 65 6e 20 62 61 63 6b 0a 20 20 74 6f 20 74 68  ten back.  to th
13d90 65 20 64 61 74 61 62 61 73 65 2e 20 55 73 69 6e  e database. Usin
13da0 67 20 6d 75 6c 74 69 70 6c 65 20 62 2d 74 72 65  g multiple b-tre
13db0 65 20 74 61 62 6c 65 73 20 61 6c 6c 6f 77 73 20  e tables allows 
13dc0 74 68 69 73 20 74 6f 20 62 65 20 61 76 6f 69 64  this to be avoid
13dd0 65 64 0a 20 20 62 79 20 63 72 65 61 74 69 6e 67  ed.  by creating
13de0 20 61 20 6e 65 77 20 62 2d 74 72 65 65 20 77 68   a new b-tree wh
13df0 69 63 68 20 63 61 6e 20 62 65 20 6d 65 72 67 65  ich can be merge
13e00 64 20 77 69 74 68 20 74 68 65 20 65 78 69 73 74  d with the exist
13e10 69 6e 67 20 62 2d 74 72 65 65 0a 20 20 28 6f 72  ing b-tree.  (or
13e20 20 62 2d 74 72 65 65 73 29 20 6c 61 74 65 72 20   b-trees) later 
13e30 6f 6e 2e 20 4d 65 72 67 69 6e 67 20 6f 66 20 62  on. Merging of b
13e40 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 73  -tree structures
13e50 20 63 61 6e 20 62 65 20 70 65 72 66 6f 72 6d 65   can be performe
13e60 64 20 61 73 0a 20 20 61 20 62 61 63 6b 67 72 6f  d as.  a backgro
13e70 75 6e 64 20 74 61 73 6b 2c 20 6f 72 20 6f 6e 63  und task, or onc
13e80 65 20 61 20 63 65 72 74 61 69 6e 20 6e 75 6d 62  e a certain numb
13e90 65 72 20 6f 66 20 73 65 70 61 72 61 74 65 20 62  er of separate b
13ea0 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 73  -tree structures
13eb0 0a 20 20 68 61 76 65 20 62 65 65 6e 20 61 63 63  .  have been acc
13ec0 75 6d 75 6c 61 74 65 64 2e 20 4f 66 20 63 6f 75  umulated. Of cou
13ed0 72 73 65 2c 20 74 68 69 73 20 73 63 68 65 6d 65  rse, this scheme
13ee0 20 6d 61 6b 65 73 20 71 75 65 72 69 65 73 20 6d   makes queries m
13ef0 6f 72 65 20 65 78 70 65 6e 73 69 76 65 0a 20 20  ore expensive.  
13f00 28 61 73 20 74 68 65 20 46 54 53 20 63 6f 64 65  (as the FTS code
13f10 20 6d 61 79 20 68 61 76 65 20 74 6f 20 6c 6f 6f   may have to loo
13f20 6b 20 75 70 20 69 6e 64 69 76 69 64 75 61 6c 20  k up individual 
13f30 74 65 72 6d 73 20 69 6e 20 6d 6f 72 65 20 74 68  terms in more th
13f40 61 6e 20 6f 6e 65 0a 20 20 62 2d 74 72 65 65 20  an one.  b-tree 
13f50 61 6e 64 20 6d 65 72 67 65 20 74 68 65 20 72 65  and merge the re
13f60 73 75 6c 74 73 29 2c 20 62 75 74 20 69 74 20 68  sults), but it h
13f70 61 73 20 62 65 65 6e 20 66 6f 75 6e 64 20 74 68  as been found th
13f80 61 74 20 69 6e 20 70 72 61 63 74 69 63 65 20 74  at in practice t
13f90 68 69 73 0a 20 20 6f 76 65 72 68 65 61 64 20 69  his.  overhead i
13fa0 73 20 6f 66 74 65 6e 20 6e 65 67 6c 69 67 69 62  s often negligib
13fb0 6c 65 2e 0a 20 20 0a 3c 68 32 3e 56 61 72 69 61  le..  .<h2>Varia
13fc0 62 6c 65 20 4c 65 6e 67 74 68 20 49 6e 74 65 67  ble Length Integ
13fd0 65 72 20 28 76 61 72 69 6e 74 29 20 46 6f 72 6d  er (varint) Form
13fe0 61 74 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a 20 20 49  at</h2>..<p>.  I
13ff0 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20 73 74  nteger values st
14000 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  ored as part of 
14010 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 20 6e  segment b-tree n
14020 6f 64 65 73 20 61 72 65 20 65 6e 63 6f 64 65 64  odes are encoded
14030 20 75 73 69 6e 67 20 74 68 65 0a 20 20 46 54 53   using the.  FTS
14040 20 76 61 72 69 6e 74 20 66 6f 72 6d 61 74 2e 20   varint format. 
14050 54 68 69 73 20 65 6e 63 6f 64 69 6e 67 20 69 73  This encoding is
14060 20 73 69 6d 69 6c 61 72 2c 20 62 75 74 20 3c 62   similar, but <b
14070 3e 6e 6f 74 20 69 64 65 6e 74 69 63 61 6c 3c 2f  >not identical</
14080 62 3e 2c 20 74 6f 20 74 68 65 0a 20 20 74 68 65  b>, to the.  the
14090 20 3c 61 20 68 72 65 66 3d 22 66 69 6c 65 66 6f   <a href="filefo
140a0 72 6d 61 74 2e 68 74 6d 6c 23 76 61 72 69 6e 74  rmat.html#varint
140b0 5f 66 6f 72 6d 61 74 22 3e 53 51 4c 69 74 65 20  _format">SQLite 
140c0 76 61 72 69 6e 74 20 66 6f 72 6d 61 74 3c 2f 61  varint format</a
140d0 3e 2e 0a 0a 3c 70 3e 0a 20 20 41 6e 20 65 6e 63  >...<p>.  An enc
140e0 6f 64 65 64 20 46 54 53 20 76 61 72 69 6e 74 20  oded FTS varint 
140f0 63 6f 6e 73 75 6d 65 73 20 62 65 74 77 65 65 6e  consumes between
14100 20 6f 6e 65 20 61 6e 64 20 74 65 6e 20 62 79 74   one and ten byt
14110 65 73 20 6f 66 20 73 70 61 63 65 2e 20 54 68 65  es of space. The
14120 0a 20 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  .  number of byt
14130 65 73 20 72 65 71 75 69 72 65 64 20 69 73 20 64  es required is d
14140 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
14150 20 73 69 67 6e 20 61 6e 64 20 6d 61 67 6e 69 74   sign and magnit
14160 75 64 65 20 6f 66 20 74 68 65 0a 20 20 69 6e 74  ude of the.  int
14170 65 67 65 72 20 76 61 6c 75 65 20 65 6e 63 6f 64  eger value encod
14180 65 64 2e 20 4d 6f 72 65 20 61 63 63 75 72 61 74  ed. More accurat
14190 65 6c 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20  ely, the number 
141a0 6f 66 20 62 79 74 65 73 20 75 73 65 64 20 74 6f  of bytes used to
141b0 20 73 74 6f 72 65 0a 20 20 74 68 65 20 65 6e 63   store.  the enc
141c0 6f 64 65 64 20 69 6e 74 65 67 65 72 20 64 65 70  oded integer dep
141d0 65 6e 64 73 20 6f 6e 20 74 68 65 20 70 6f 73 69  ends on the posi
141e0 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74  tion of the most
141f0 20 73 69 67 6e 69 66 69 63 61 6e 74 20 73 65 74   significant set
14200 20 62 69 74 0a 20 20 69 6e 20 74 68 65 20 36 34   bit.  in the 64
14210 2d 62 69 74 20 74 77 6f 73 2d 63 6f 6d 70 6c 65  -bit twos-comple
14220 6d 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74  ment representat
14230 69 6f 6e 20 6f 66 20 74 68 65 20 69 6e 74 65 67  ion of the integ
14240 65 72 20 76 61 6c 75 65 2e 20 4e 65 67 61 74 69  er value. Negati
14250 76 65 0a 20 20 76 61 6c 75 65 73 20 61 6c 77 61  ve.  values alwa
14260 79 73 20 68 61 76 65 20 74 68 65 20 6d 6f 73 74  ys have the most
14270 20 73 69 67 6e 69 66 69 63 61 6e 74 20 62 69 74   significant bit
14280 20 73 65 74 20 28 74 68 65 20 73 69 67 6e 20 62   set (the sign b
14290 69 74 29 2c 20 61 6e 64 20 73 6f 20 61 72 65 0a  it), and so are.
142a0 20 20 61 6c 77 61 79 73 20 73 74 6f 72 65 64 20    always stored 
142b0 75 73 69 6e 67 20 74 68 65 20 66 75 6c 6c 20 74  using the full t
142c0 65 6e 20 62 79 74 65 73 2e 20 50 6f 73 69 74 69  en bytes. Positi
142d0 76 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  ve integer value
142e0 73 20 6d 61 79 20 62 65 0a 20 20 73 74 6f 72 65  s may be.  store
142f0 64 20 75 73 69 6e 67 20 6c 65 73 73 20 73 70 61  d using less spa
14300 63 65 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 66  ce...<p>.  The f
14310 69 6e 61 6c 20 62 79 74 65 20 6f 66 20 61 6e 20  inal byte of an 
14320 65 6e 63 6f 64 65 64 20 46 54 53 20 76 61 72 69  encoded FTS vari
14330 6e 74 20 68 61 73 20 69 74 73 20 6d 6f 73 74 20  nt has its most 
14340 73 69 67 6e 69 66 69 63 61 6e 74 20 62 69 74 20  significant bit 
14350 0a 20 20 63 6c 65 61 72 65 64 2e 20 41 6c 6c 20  .  cleared. All 
14360 70 72 65 63 65 64 69 6e 67 20 62 79 74 65 73 20  preceding bytes 
14370 68 61 76 65 20 74 68 65 20 6d 6f 73 74 20 73 69  have the most si
14380 67 6e 69 66 69 63 61 6e 74 20 62 69 74 20 73 65  gnificant bit se
14390 74 2e 20 44 61 74 61 0a 20 20 69 73 20 73 74 6f  t. Data.  is sto
143a0 72 65 64 20 69 6e 20 74 68 65 20 72 65 6d 61 69  red in the remai
143b0 6e 69 6e 67 20 73 65 76 65 6e 20 6c 65 61 73 74  ning seven least
143c0 20 73 69 67 6e 69 66 69 63 61 6e 74 20 62 69 74   significant bit
143d0 73 20 6f 66 20 65 61 63 68 20 62 79 74 65 2e 0a  s of each byte..
143e0 20 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65    The first byte
143f0 20 6f 66 20 74 68 65 20 65 6e 63 6f 64 65 64 20   of the encoded 
14400 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 63  representation c
14410 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 65 61 73  ontains the leas
14420 74 20 73 69 67 6e 69 66 69 63 61 6e 74 0a 20 20  t significant.  
14430 73 65 76 65 6e 20 62 69 74 73 20 6f 66 20 74 68  seven bits of th
14440 65 20 65 6e 63 6f 64 65 64 20 69 6e 74 65 67 65  e encoded intege
14450 72 20 76 61 6c 75 65 2e 20 54 68 65 20 73 65 63  r value. The sec
14460 6f 6e 64 20 62 79 74 65 20 6f 66 20 74 68 65 20  ond byte of the 
14470 65 6e 63 6f 64 65 64 0a 20 20 72 65 70 72 65 73  encoded.  repres
14480 65 6e 74 61 74 69 6f 6e 2c 20 69 66 20 69 74 20  entation, if it 
14490 69 73 20 70 72 65 73 65 6e 74 2c 20 63 6f 6e 74  is present, cont
144a0 61 69 6e 73 20 74 68 65 20 73 65 76 65 6e 20 6e  ains the seven n
144b0 65 78 74 20 6c 65 61 73 74 20 73 69 67 6e 69 66  ext least signif
144c0 69 63 61 6e 74 0a 20 20 62 69 74 73 20 6f 66 20  icant.  bits of 
144d0 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75  the integer valu
144e0 65 2c 20 61 6e 64 20 73 6f 20 6f 6e 2e 20 54 68  e, and so on. Th
144f0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c  e following tabl
14500 65 20 63 6f 6e 74 61 69 6e 73 20 65 78 61 6d 70  e contains examp
14510 6c 65 73 0a 20 20 6f 66 20 65 6e 63 6f 64 65 64  les.  of encoded
14520 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73 3a   integer values:
14530 0a 0a 3c 74 61 62 6c 65 20 73 74 72 69 70 65 64  ..<table striped
14540 3d 31 3e 0a 20 20 3c 74 72 3e 3c 74 68 3e 44 65  =1>.  <tr><th>De
14550 63 69 6d 61 6c 3c 74 68 3e 48 65 78 61 64 65 63  cimal<th>Hexadec
14560 69 6d 61 6c 3c 74 68 20 77 69 64 74 68 3d 31 30  imal<th width=10
14570 30 25 3e 45 6e 63 6f 64 65 64 20 52 65 70 72 65  0%>Encoded Repre
14580 73 65 6e 74 61 74 69 6f 6e 0a 20 20 3c 74 72 3e  sentation.  <tr>
14590 3c 74 64 3e 34 33 3c 74 64 3e 30 78 30 30 30 30  <td>43<td>0x0000
145a0 30 30 30 30 30 30 30 30 30 30 32 42 3c 74 64 3e  00000000002B<td>
145b0 30 78 32 42 20 0a 20 20 3c 74 72 3e 3c 74 64 3e  0x2B .  <tr><td>
145c0 32 30 30 38 31 35 3c 74 64 3e 30 78 30 30 30 30  200815<td>0x0000
145d0 30 30 30 30 30 30 30 33 31 30 36 46 3c 74 64 3e  00000003106F<td>
145e0 30 78 39 43 20 30 78 41 30 20 30 78 30 43 0a 20  0x9C 0xA0 0x0C. 
145f0 20 3c 74 72 3e 3c 74 64 3e 2d 31 3c 74 64 3e 30   <tr><td>-1<td>0
14600 78 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46  xFFFFFFFFFFFFFFF
14610 46 3c 74 64 3e 30 78 46 46 20 30 78 46 46 20 30  F<td>0xFF 0xFF 0
14620 78 46 46 20 30 78 46 46 20 30 78 46 46 20 30 78  xFF 0xFF 0xFF 0x
14630 46 46 20 30 78 46 46 20 30 78 46 46 20 30 78 46  FF 0xFF 0xFF 0xF
14640 46 20 30 78 30 31 0a 3c 2f 74 61 62 6c 65 3e 0a  F 0x01.</table>.
14650 20 20 0a 0a 3c 68 32 3e 53 65 67 6d 65 6e 74 20    ..<h2>Segment 
14660 42 2d 54 72 65 65 20 46 6f 72 6d 61 74 3c 2f 68  B-Tree Format</h
14670 32 3e 0a 0a 3c 70 3e 0a 20 20 53 65 67 6d 65 6e  2>..<p>.  Segmen
14680 74 20 62 2d 74 72 65 65 73 20 61 72 65 20 70 72  t b-trees are pr
14690 65 66 69 78 2d 63 6f 6d 70 72 65 73 73 65 64 20  efix-compressed 
146a0 62 2b 2d 74 72 65 65 73 2e 20 54 68 65 72 65 20  b+-trees. There 
146b0 69 73 20 6f 6e 65 20 73 65 67 6d 65 6e 74 20 62  is one segment b
146c0 2d 74 72 65 65 0a 20 20 66 6f 72 20 65 61 63 68  -tree.  for each
146d0 20 72 6f 77 20 69 6e 20 74 68 65 20 25 5f 73 65   row in the %_se
146e0 67 64 69 72 20 74 61 62 6c 65 20 28 73 65 65 20  gdir table (see 
146f0 61 62 6f 76 65 29 2e 20 54 68 65 20 72 6f 6f 74  above). The root
14700 20 6e 6f 64 65 20 6f 66 20 74 68 65 20 73 65 67   node of the seg
14710 6d 65 6e 74 0a 20 20 62 2d 74 72 65 65 20 69 73  ment.  b-tree is
14720 20 73 74 6f 72 65 64 20 61 73 20 61 20 62 6c 6f   stored as a blo
14730 62 20 69 6e 20 74 68 65 20 22 72 6f 6f 74 22 20  b in the "root" 
14740 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 6f 72  field of the cor
14750 72 65 73 70 6f 6e 64 69 6e 67 20 72 6f 77 0a 20  responding row. 
14760 20 6f 66 20 74 68 65 20 25 5f 73 65 67 64 69 72   of the %_segdir
14770 20 74 61 62 6c 65 2e 20 41 6c 6c 20 6f 74 68 65   table. All othe
14780 72 20 6e 6f 64 65 73 20 28 69 66 20 61 6e 79 20  r nodes (if any 
14790 65 78 69 73 74 29 20 61 72 65 20 73 74 6f 72 65  exist) are store
147a0 64 20 69 6e 20 74 68 65 20 0a 20 20 22 62 6c 6f  d in the .  "blo
147b0 62 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  b" column of the
147c0 20 25 5f 73 65 67 6d 65 6e 74 73 20 74 61 62 6c   %_segments tabl
147d0 65 2e 20 4e 6f 64 65 73 20 77 69 74 68 69 6e 20  e. Nodes within 
147e0 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 74  the %_segments t
147f0 61 62 6c 65 20 61 72 65 0a 20 20 69 64 65 6e 74  able are.  ident
14800 69 66 69 65 64 20 62 79 20 74 68 65 20 69 6e 74  ified by the int
14810 65 67 65 72 20 76 61 6c 75 65 20 69 6e 20 74 68  eger value in th
14820 65 20 62 6c 6f 63 6b 69 64 20 66 69 65 6c 64 20  e blockid field 
14830 6f 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  of the correspon
14840 64 69 6e 67 0a 20 20 72 6f 77 2e 20 54 68 65 20  ding.  row. The 
14850 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20  following table 
14860 64 65 73 63 72 69 62 65 73 20 74 68 65 20 66 69  describes the fi
14870 65 6c 64 73 20 6f 66 20 74 68 65 20 25 5f 73 65  elds of the %_se
14880 67 64 69 72 20 74 61 62 6c 65 3a 0a 0a 3c 74 61  gdir table:..<ta
14890 62 6c 65 20 73 74 72 69 70 65 64 3d 31 3e 0a 20  ble striped=1>. 
148a0 20 3c 74 72 3e 3c 74 68 3e 43 6f 6c 75 6d 6e 20   <tr><th>Column 
148b0 20 20 20 20 20 20 20 20 20 20 3c 74 68 20 77 69            <th wi
148c0 64 74 68 3d 31 30 30 25 3e 49 6e 74 65 72 70 72  dth=100%>Interpr
148d0 65 74 61 74 69 6f 6e 0a 20 20 3c 74 72 3e 3c 74  etation.  <tr><t
148e0 64 3e 6c 65 76 65 6c 20 20 20 20 20 20 20 20 20  d>level         
148f0 20 20 20 3c 74 64 3e 20 0a 20 20 20 20 42 65 74     <td> .    Bet
14900 77 65 65 6e 20 74 68 65 6d 2c 20 74 68 65 20 63  ween them, the c
14910 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 22  ontents of the "
14920 6c 65 76 65 6c 22 20 61 6e 64 20 22 69 64 78 22  level" and "idx"
14930 20 66 69 65 6c 64 73 20 64 65 66 69 6e 65 20 74   fields define t
14940 68 65 0a 20 20 20 20 72 65 6c 61 74 69 76 65 20  he.    relative 
14950 61 67 65 20 6f 66 20 74 68 65 20 73 65 67 6d 65  age of the segme
14960 6e 74 20 62 2d 74 72 65 65 2e 20 54 68 65 20 73  nt b-tree. The s
14970 6d 61 6c 6c 65 72 20 74 68 65 20 76 61 6c 75 65  maller the value
14980 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 0a 20   stored in the. 
14990 20 20 20 22 6c 65 76 65 6c 22 20 66 69 65 6c 64     "level" field
149a0 2c 20 74 68 65 20 6d 6f 72 65 20 72 65 63 65 6e  , the more recen
149b0 74 6c 79 20 74 68 65 20 73 65 67 6d 65 6e 74 20  tly the segment 
149c0 62 2d 74 72 65 65 20 77 61 73 20 63 72 65 61 74  b-tree was creat
149d0 65 64 2e 20 49 66 20 74 77 6f 0a 20 20 20 20 73  ed. If two.    s
149e0 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 73 20 61  egment b-trees a
149f0 72 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 22  re of the same "
14a00 6c 65 76 65 6c 22 2c 20 74 68 65 20 73 65 67 6d  level", the segm
14a10 65 6e 74 20 77 69 74 68 20 74 68 65 20 6c 61 72  ent with the lar
14a20 67 65 72 0a 20 20 20 20 76 61 6c 75 65 20 73 74  ger.    value st
14a30 6f 72 65 64 20 69 6e 20 74 68 65 20 22 69 64 78  ored in the "idx
14a40 22 20 63 6f 6c 75 6d 6e 20 69 73 20 6d 6f 72 65  " column is more
14a50 20 72 65 63 65 6e 74 2e 20 54 68 65 20 50 52 49   recent. The PRI
14a60 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61  MARY KEY constra
14a70 69 6e 74 0a 20 20 20 20 6f 6e 20 74 68 65 20 25  int.    on the %
14a80 5f 73 65 67 64 69 72 20 74 61 62 6c 65 20 70 72  _segdir table pr
14a90 65 76 65 6e 74 73 20 61 6e 79 20 74 77 6f 20 73  events any two s
14aa0 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20 68 61 76  egments from hav
14ab0 69 6e 67 20 74 68 65 20 73 61 6d 65 20 76 61 6c  ing the same val
14ac0 75 65 0a 20 20 20 20 66 6f 72 20 62 6f 74 68 20  ue.    for both 
14ad0 74 68 65 20 22 6c 65 76 65 6c 22 20 61 6e 64 20  the "level" and 
14ae0 22 69 64 78 22 20 66 69 65 6c 64 73 2e 0a 20 20  "idx" fields..  
14af0 3c 74 72 3e 3c 74 64 3e 69 64 78 20 20 20 20 20  <tr><td>idx     
14b00 20 20 20 20 20 20 20 20 20 3c 74 64 3e 20 53 65           <td> Se
14b10 65 20 61 62 6f 76 65 2e 0a 20 20 3c 74 72 3e 3c  e above..  <tr><
14b20 74 64 3e 73 74 61 72 74 5f 62 6c 6f 63 6b 20 20  td>start_block  
14b30 20 20 20 20 3c 74 64 3e 0a 20 20 20 20 54 68 65      <td>.    The
14b40 20 62 6c 6f 63 6b 69 64 20 74 68 61 74 20 63 6f   blockid that co
14b50 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65  rresponds to the
14b60 20 6e 6f 64 65 20 77 69 74 68 20 74 68 65 20 73   node with the s
14b70 6d 61 6c 6c 65 73 74 20 62 6c 6f 63 6b 69 64 20  mallest blockid 
14b80 74 68 61 74 20 0a 20 20 20 20 62 65 6c 6f 6e 67  that .    belong
14b90 73 20 74 6f 20 74 68 69 73 20 73 65 67 6d 65 6e  s to this segmen
14ba0 74 20 62 2d 74 72 65 65 2e 20 4f 72 20 7a 65 72  t b-tree. Or zer
14bb0 6f 20 69 66 20 74 68 65 20 65 6e 74 69 72 65 20  o if the entire 
14bc0 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 0a 20  segment b-tree. 
14bd0 20 20 20 66 69 74 73 20 6f 6e 20 74 68 65 20 72     fits on the r
14be0 6f 6f 74 20 6e 6f 64 65 2e 20 49 66 20 69 74 20  oot node. If it 
14bf0 65 78 69 73 74 73 2c 20 74 68 69 73 20 6e 6f 64  exists, this nod
14c00 65 20 69 73 20 61 6c 77 61 79 73 20 61 20 6c 65  e is always a le
14c10 61 66 20 6e 6f 64 65 2e 0a 20 20 3c 74 72 3e 3c  af node..  <tr><
14c20 74 64 3e 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c  td>leaves_end_bl
14c30 6f 63 6b 20 3c 74 64 3e 0a 20 20 20 20 54 68 65  ock <td>.    The
14c40 20 62 6c 6f 63 6b 69 64 20 74 68 61 74 20 63 6f   blockid that co
14c50 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65  rresponds to the
14c60 20 6c 65 61 66 20 6e 6f 64 65 20 77 69 74 68 20   leaf node with 
14c70 74 68 65 20 6c 61 72 67 65 73 74 20 62 6c 6f 63  the largest bloc
14c80 6b 69 64 20 0a 20 20 20 20 74 68 61 74 20 62 65  kid .    that be
14c90 6c 6f 6e 67 73 20 74 6f 20 74 68 69 73 20 73 65  longs to this se
14ca0 67 6d 65 6e 74 20 62 2d 74 72 65 65 2e 20 4f 72  gment b-tree. Or
14cb0 20 7a 65 72 6f 20 69 66 20 74 68 65 20 65 6e 74   zero if the ent
14cc0 69 72 65 20 73 65 67 6d 65 6e 74 20 62 2d 74 72  ire segment b-tr
14cd0 65 65 0a 20 20 20 20 66 69 74 73 20 6f 6e 20 74  ee.    fits on t
14ce0 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2e 0a 20 20  he root node..  
14cf0 3c 74 72 3e 3c 74 64 3e 65 6e 64 5f 62 6c 6f 63  <tr><td>end_bloc
14d00 6b 20 3c 74 64 3e 0a 20 20 20 20 54 68 65 20 62  k <td>.    The b
14d10 6c 6f 63 6b 69 64 20 74 68 61 74 20 63 6f 72 72  lockid that corr
14d20 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 69  esponds to the i
14d30 6e 74 65 72 69 6f 72 20 6e 6f 64 65 20 77 69 74  nterior node wit
14d40 68 20 74 68 65 20 6c 61 72 67 65 73 74 20 0a 20  h the largest . 
14d50 20 20 20 62 6c 6f 63 6b 69 64 20 74 68 61 74 20     blockid that 
14d60 62 65 6c 6f 6e 67 73 20 74 6f 20 74 68 69 73 20  belongs to this 
14d70 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 2e 20  segment b-tree. 
14d80 20 4f 72 20 7a 65 72 6f 20 69 66 20 74 68 65 20   Or zero if the 
14d90 65 6e 74 69 72 65 20 73 65 67 6d 65 6e 74 0a 20  entire segment. 
14da0 20 20 20 62 2d 74 72 65 65 20 66 69 74 73 20 6f     b-tree fits o
14db0 6e 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2e  n the root node.
14dc0 20 49 66 20 69 74 20 65 78 69 73 74 73 2c 20 74   If it exists, t
14dd0 68 69 73 20 6e 6f 64 65 20 69 73 20 61 6c 77 61  his node is alwa
14de0 79 73 20 61 6e 0a 20 20 20 20 69 6e 74 65 72 69  ys an.    interi
14df0 6f 72 20 6e 6f 64 65 2e 0a 20 20 3c 74 72 3e 3c  or node..  <tr><
14e00 74 64 3e 72 6f 6f 74 20 20 20 20 20 20 20 20 20  td>root         
14e10 20 20 20 20 3c 74 64 3e 0a 20 20 20 20 42 6c 6f      <td>.    Blo
14e20 62 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  b containing the
14e30 20 72 6f 6f 74 20 6e 6f 64 65 20 6f 66 20 74 68   root node of th
14e40 65 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65  e segment b-tree
14e50 2e 0a 3c 2f 74 61 62 6c 65 3e 0a 0a 3c 70 3e 0a  ..</table>..<p>.
14e60 20 20 41 70 61 72 74 20 66 72 6f 6d 20 74 68 65    Apart from the
14e70 20 72 6f 6f 74 20 6e 6f 64 65 2c 20 74 68 65 20   root node, the 
14e80 6e 6f 64 65 73 20 74 68 61 74 20 6d 61 6b 65 20  nodes that make 
14e90 75 70 20 61 20 73 69 6e 67 6c 65 20 73 65 67 6d  up a single segm
14ea0 65 6e 74 20 62 2d 74 72 65 65 20 61 72 65 0a 20  ent b-tree are. 
14eb0 20 61 6c 77 61 79 73 20 73 74 6f 72 65 64 20 75   always stored u
14ec0 73 69 6e 67 20 61 20 63 6f 6e 74 69 67 75 6f 75  sing a contiguou
14ed0 73 20 73 65 71 75 65 6e 63 65 20 6f 66 20 62 6c  s sequence of bl
14ee0 6f 63 6b 69 64 73 2e 20 46 75 72 74 68 65 72 6d  ockids. Furtherm
14ef0 6f 72 65 2c 20 74 68 65 0a 20 20 6e 6f 64 65 73  ore, the.  nodes
14f00 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20 61 20   that make up a 
14f10 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 6f 66 20  single level of 
14f20 74 68 65 20 62 2d 74 72 65 65 20 61 72 65 20 74  the b-tree are t
14f30 68 65 6d 73 65 6c 76 65 73 20 73 74 6f 72 65 64  hemselves stored
14f40 20 61 73 0a 20 20 61 20 63 6f 6e 74 69 67 75 6f   as.  a contiguo
14f50 75 73 20 62 6c 6f 63 6b 2c 20 69 6e 20 62 2d 74  us block, in b-t
14f60 72 65 65 20 6f 72 64 65 72 2e 20 54 68 65 20 63  ree order. The c
14f70 6f 6e 74 69 67 75 6f 75 73 20 73 65 71 75 65 6e  ontiguous sequen
14f80 63 65 20 6f 66 20 62 6c 6f 63 6b 69 64 73 0a 20  ce of blockids. 
14f90 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74   used to store t
14fa0 68 65 20 62 2d 74 72 65 65 20 6c 65 61 76 65 73  he b-tree leaves
14fb0 20 61 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 73   are allocated s
14fc0 74 61 72 74 69 6e 67 20 77 69 74 68 20 74 68 65  tarting with the
14fd0 20 62 6c 6f 63 6b 69 64 0a 20 20 76 61 6c 75 65   blockid.  value
14fe0 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 22   stored in the "
14ff0 73 74 61 72 74 5f 62 6c 6f 63 6b 22 20 63 6f 6c  start_block" col
15000 75 6d 6e 20 6f 66 20 74 68 65 20 63 6f 72 72 65  umn of the corre
15010 73 70 6f 6e 64 69 6e 67 20 25 5f 73 65 67 64 69  sponding %_segdi
15020 72 20 72 6f 77 2c 0a 20 20 61 6e 64 20 66 69 6e  r row,.  and fin
15030 69 73 68 69 6e 67 20 61 74 20 74 68 65 20 62 6c  ishing at the bl
15040 6f 63 6b 69 64 20 76 61 6c 75 65 20 73 74 6f 72  ockid value stor
15050 65 64 20 69 6e 20 74 68 65 20 22 6c 65 61 76 65  ed in the "leave
15060 73 5f 65 6e 64 5f 62 6c 6f 63 6b 22 0a 20 20 66  s_end_block".  f
15070 69 65 6c 64 20 6f 66 20 74 68 65 20 73 61 6d 65  ield of the same
15080 20 72 6f 77 2e 20 49 74 20 69 73 20 74 68 65 72   row. It is ther
15090 65 66 6f 72 65 20 70 6f 73 73 69 62 6c 65 20 74  efore possible t
150a0 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
150b0 68 20 61 6c 6c 20 74 68 65 0a 20 20 6c 65 61 76  h all the.  leav
150c0 65 73 20 6f 66 20 61 20 73 65 67 6d 65 6e 74 20  es of a segment 
150d0 62 2d 74 72 65 65 2c 20 69 6e 20 6b 65 79 20 6f  b-tree, in key o
150e0 72 64 65 72 2c 20 62 79 20 74 72 61 76 65 72 73  rder, by travers
150f0 69 6e 67 20 74 68 65 20 25 5f 73 65 67 6d 65 6e  ing the %_segmen
15100 74 73 20 0a 20 20 74 61 62 6c 65 20 69 6e 20 62  ts .  table in b
15110 6c 6f 63 6b 69 64 20 6f 72 64 65 72 20 66 72 6f  lockid order fro
15120 6d 20 22 73 74 61 72 74 5f 62 6c 6f 63 6b 22 20  m "start_block" 
15130 74 6f 20 22 6c 65 61 76 65 73 5f 65 6e 64 5f 62  to "leaves_end_b
15140 6c 6f 63 6b 22 2e 20 20 0a 0a 3c 68 33 3e 53 65  lock".  ..<h3>Se
15150 67 6d 65 6e 74 20 42 2d 54 72 65 65 20 4c 65 61  gment B-Tree Lea
15160 66 20 4e 6f 64 65 73 3c 2f 68 33 3e 0a 0a 3c 70  f Nodes</h3>..<p
15170 3e 0a 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  >.  The followin
15180 67 20 64 69 61 67 72 61 6d 20 64 65 70 69 63 74  g diagram depict
15190 73 20 74 68 65 20 66 6f 72 6d 61 74 20 6f 66 20  s the format of 
151a0 61 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65  a segment b-tree
151b0 20 6c 65 61 66 20 6e 6f 64 65 2e 0a 0a 3c 63 65   leaf node...<ce
151c0 6e 74 65 72 3e 0a 20 20 3c 69 6d 67 20 73 72 63  nter>.  <img src
151d0 3d 69 6d 61 67 65 73 2f 66 74 73 33 5f 6c 65 61  =images/fts3_lea
151e0 66 5f 6e 6f 64 65 2e 70 6e 67 3e 0a 20 20 3c 70  f_node.png>.  <p
151f0 3e 20 53 65 67 6d 65 6e 74 20 42 2d 54 72 65 65  > Segment B-Tree
15200 20 4c 65 61 66 20 4e 6f 64 65 20 46 6f 72 6d 61   Leaf Node Forma
15210 74 0a 3c 2f 63 65 6e 74 65 72 3e 0a 0a 3c 70 3e  t.</center>..<p>
15220 0a 20 20 54 68 65 20 66 69 72 73 74 20 74 65 72  .  The first ter
15230 6d 20 73 74 6f 72 65 64 20 6f 6e 20 65 61 63 68  m stored on each
15240 20 6e 6f 64 65 20 28 22 54 65 72 6d 20 31 22 20   node ("Term 1" 
15250 69 6e 20 74 68 65 20 66 69 67 75 72 65 20 61 62  in the figure ab
15260 6f 76 65 29 20 69 73 0a 20 20 73 74 6f 72 65 64  ove) is.  stored
15270 20 76 65 72 62 61 74 69 6d 2e 20 45 61 63 68 20   verbatim. Each 
15280 73 75 62 73 65 71 75 65 6e 74 20 74 65 72 6d 20  subsequent term 
15290 69 73 20 70 72 65 66 69 78 2d 63 6f 6d 70 72 65  is prefix-compre
152a0 73 73 65 64 20 77 69 74 68 20 72 65 73 70 65 63  ssed with respec
152b0 74 0a 20 20 74 6f 20 69 74 73 20 70 72 65 64 65  t.  to its prede
152c0 63 65 73 73 6f 72 2e 20 54 65 72 6d 73 20 61 72  cessor. Terms ar
152d0 65 20 73 74 6f 72 65 64 20 77 69 74 68 69 6e 20  e stored within 
152e0 61 20 70 61 67 65 20 69 6e 20 73 6f 72 74 65 64  a page in sorted
152f0 20 28 6d 65 6d 63 6d 70 29 0a 20 20 6f 72 64 65   (memcmp).  orde
15300 72 2e 0a 0a 3c 68 33 3e 53 65 67 6d 65 6e 74 20  r...<h3>Segment 
15310 42 2d 54 72 65 65 20 49 6e 74 65 72 69 6f 72 20  B-Tree Interior 
15320 4e 6f 64 65 73 3c 2f 68 33 3e 0a 0a 3c 70 3e 0a  Nodes</h3>..<p>.
15330 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
15340 64 69 61 67 72 61 6d 20 64 65 70 69 63 74 73 20  diagram depicts 
15350 74 68 65 20 66 6f 72 6d 61 74 20 6f 66 20 61 20  the format of a 
15360 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 20 69  segment b-tree i
15370 6e 74 65 72 69 6f 72 20 0a 20 20 28 6e 6f 6e 2d  nterior .  (non-
15380 6c 65 61 66 29 20 6e 6f 64 65 2e 0a 0a 3c 63 65  leaf) node...<ce
15390 6e 74 65 72 3e 0a 20 20 3c 69 6d 67 20 73 72 63  nter>.  <img src
153a0 3d 69 6d 61 67 65 73 2f 66 74 73 33 5f 69 6e 74  =images/fts3_int
153b0 65 72 69 6f 72 5f 6e 6f 64 65 2e 70 6e 67 3e 0a  erior_node.png>.
153c0 20 20 3c 70 3e 20 53 65 67 6d 65 6e 74 20 42 2d    <p> Segment B-
153d0 54 72 65 65 20 49 6e 74 65 72 69 6f 72 20 4e 6f  Tree Interior No
153e0 64 65 20 46 6f 72 6d 61 74 0a 3c 2f 63 65 6e 74  de Format.</cent
153f0 65 72 3e 0a 0a 0a 3c 68 32 3e 44 6f 63 6c 69 73  er>...<h2>Doclis
15400 74 20 46 6f 72 6d 61 74 3c 2f 68 32 3e 0a 0a 3c  t Format</h2>..<
15410 70 3e 0a 20 20 41 20 64 6f 63 6c 69 73 74 20 63  p>.  A doclist c
15420 6f 6e 73 69 73 74 73 20 6f 66 20 61 6e 20 61 72  onsists of an ar
15430 72 61 79 20 6f 66 20 36 34 2d 62 69 74 20 73 69  ray of 64-bit si
15440 67 6e 65 64 20 69 6e 74 65 67 65 72 73 2c 20 73  gned integers, s
15450 65 72 69 61 6c 69 7a 65 64 20 75 73 69 6e 67 0a  erialized using.
15460 20 20 74 68 65 20 46 54 53 20 76 61 72 69 6e 74    the FTS varint
15470 20 66 6f 72 6d 61 74 2e 20 45 61 63 68 20 64 6f   format. Each do
15480 63 6c 69 73 74 20 65 6e 74 72 79 20 69 73 20 6d  clist entry is m
15490 61 64 65 20 75 70 20 6f 66 20 61 20 73 65 72 69  ade up of a seri
154a0 65 73 20 6f 66 20 74 77 6f 20 0a 20 20 6f 72 20  es of two .  or 
154b0 6d 6f 72 65 20 69 6e 74 65 67 65 72 73 2c 20 61  more integers, a
154c0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 0a 3c 6f 6c 3e  s follows:..<ol>
154d0 0a 20 20 3c 6c 69 3e 20 54 68 65 20 64 6f 63 69  .  <li> The doci
154e0 64 20 76 61 6c 75 65 2e 20 54 68 65 20 66 69 72  d value. The fir
154f0 73 74 20 65 6e 74 72 79 20 69 6e 20 61 20 64 6f  st entry in a do
15500 63 6c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 74  clist contains t
15510 68 65 20 6c 69 74 65 72 61 6c 20 64 6f 63 69 64  he literal docid
15520 0a 20 20 20 20 20 20 20 76 61 6c 75 65 2e 20 54  .       value. T
15530 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 6f  he first field o
15540 66 20 65 61 63 68 20 73 75 62 73 65 71 75 65 6e  f each subsequen
15550 74 20 64 6f 63 6c 69 73 74 20 65 6e 74 72 79 20  t doclist entry 
15560 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 0a 20 20  contains the .  
15570 20 20 20 20 20 64 69 66 66 65 72 65 6e 63 65 20       difference 
15580 62 65 74 77 65 65 6e 20 74 68 65 20 6e 65 77 20  between the new 
15590 64 6f 63 69 64 20 61 6e 64 20 74 68 65 20 70 72  docid and the pr
155a0 65 76 69 6f 75 73 20 6f 6e 65 20 28 61 6c 77 61  evious one (alwa
155b0 79 73 20 61 20 70 6f 73 69 74 69 76 65 20 0a 20  ys a positive . 
155c0 20 20 20 20 20 20 6e 75 6d 62 65 72 29 2e 0a 20        number).. 
155d0 20 3c 6c 69 3e 20 5a 65 72 6f 20 6f 72 20 6d 6f   <li> Zero or mo
155e0 72 65 20 74 65 72 6d 2d 6f 66 66 73 65 74 20 6c  re term-offset l
155f0 69 73 74 73 2e 20 41 20 74 65 72 6d 2d 6f 66 66  ists. A term-off
15600 73 65 74 20 6c 69 73 74 20 69 73 20 70 72 65 73  set list is pres
15610 65 6e 74 20 66 6f 72 20 65 61 63 68 0a 20 20 20  ent for each.   
15620 20 20 20 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68      column of th
15630 65 20 46 54 53 20 76 69 72 74 75 61 6c 20 74 61  e FTS virtual ta
15640 62 6c 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ble that contain
15650 73 20 74 68 65 20 74 65 72 6d 2e 20 41 20 74 65  s the term. A te
15660 72 6d 2d 6f 66 66 73 65 74 0a 20 20 20 20 20 20  rm-offset.      
15670 20 6c 69 73 74 20 63 6f 6e 73 69 73 74 73 20 6f   list consists o
15680 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
15690 0a 20 20 20 20 20 3c 6f 6c 3e 0a 20 20 20 20 20  .     <ol>.     
156a0 20 20 3c 6c 69 3e 20 43 6f 6e 73 74 61 6e 74 20    <li> Constant 
156b0 76 61 6c 75 65 20 31 2e 20 54 68 69 73 20 66 69  value 1. This fi
156c0 65 6c 64 20 69 73 20 6f 6d 69 74 74 65 64 20 66  eld is omitted f
156d0 6f 72 20 61 6e 79 20 74 65 72 6d 2d 6f 66 66 73  or any term-offs
156e0 65 74 20 6c 69 73 74 0a 20 20 20 20 20 20 20 20  et list.        
156f0 20 20 20 20 61 73 73 6f 63 69 61 74 65 64 20 77      associated w
15700 69 74 68 20 63 6f 6c 75 6d 6e 20 30 2e 0a 20 20  ith column 0..  
15710 20 20 20 20 20 3c 6c 69 3e 20 54 68 65 20 63 6f       <li> The co
15720 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 28 31 20 66  lumn number (1 f
15730 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20 6c 65  or the second le
15740 66 74 6d 6f 73 74 20 63 6f 6c 75 6d 6e 2c 20 65  ftmost column, e
15750 74 63 2e 29 2e 20 54 68 69 73 0a 20 20 20 20 20  tc.). This.     
15760 20 20 20 20 20 20 20 66 69 65 6c 64 20 69 73 20         field is 
15770 6f 6d 69 74 74 65 64 20 66 6f 72 20 61 6e 79 20  omitted for any 
15780 74 65 72 6d 2d 6f 66 66 73 65 74 20 6c 69 73 74  term-offset list
15790 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
157a0 20 63 6f 6c 75 6d 6e 20 30 2e 0a 20 20 20 20 20   column 0..     
157b0 20 20 3c 6c 69 3e 20 41 20 6c 69 73 74 20 6f 66    <li> A list of
157c0 20 74 65 72 6d 2d 6f 66 66 73 65 74 73 2c 20 73   term-offsets, s
157d0 6f 72 74 65 64 20 66 72 6f 6d 20 73 6d 61 6c 6c  orted from small
157e0 65 73 74 20 74 6f 20 6c 61 72 67 65 73 74 2e 20  est to largest. 
157f0 49 6e 73 74 65 61 64 0a 20 20 20 20 20 20 20 20  Instead.        
15800 20 20 20 20 6f 66 20 73 74 6f 72 69 6e 67 20 74      of storing t
15810 68 65 20 74 65 72 6d 2d 6f 66 66 73 65 74 20 76  he term-offset v
15820 61 6c 75 65 20 6c 69 74 65 72 61 6c 6c 79 2c 20  alue literally, 
15830 65 61 63 68 20 69 6e 74 65 67 65 72 20 73 74 6f  each integer sto
15840 72 65 64 20 0a 20 20 20 20 20 20 20 20 20 20 20  red .           
15850 20 69 73 20 74 68 65 20 64 69 66 66 65 72 65 6e   is the differen
15860 63 65 20 62 65 74 77 65 65 6e 20 74 68 65 20 63  ce between the c
15870 75 72 72 65 6e 74 20 74 65 72 6d 2d 6f 66 66 73  urrent term-offs
15880 65 74 20 61 6e 64 20 74 68 65 20 70 72 65 76 69  et and the previ
15890 6f 75 73 20 0a 20 20 20 20 20 20 20 20 20 20 20  ous .           
158a0 20 6f 6e 65 20 28 6f 72 20 7a 65 72 6f 20 69 66   one (or zero if
158b0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 65 72   the current ter
158c0 6d 2d 6f 66 66 73 65 74 20 69 73 20 74 68 65 20  m-offset is the 
158d0 66 69 72 73 74 29 2c 20 70 6c 75 73 20 32 2e 0a  first), plus 2..
158e0 20 20 20 20 20 3c 2f 6f 6c 3e 0a 20 20 3c 6c 69       </ol>.  <li
158f0 3e 20 43 6f 6e 73 74 61 6e 74 20 76 61 6c 75 65  > Constant value
15900 20 30 2e 0a 3c 2f 6f 6c 3e 0a 0a 3c 63 65 6e 74   0..</ol>..<cent
15910 65 72 3e 0a 20 20 3c 69 6d 67 20 73 72 63 3d 69  er>.  <img src=i
15920 6d 61 67 65 73 2f 66 74 73 33 5f 64 6f 63 6c 69  mages/fts3_docli
15930 73 74 32 2e 70 6e 67 3e 0a 20 20 3c 70 3e 20 46  st2.png>.  <p> F
15940 54 53 33 20 44 6f 63 6c 69 73 74 20 46 6f 72 6d  TS3 Doclist Form
15950 61 74 0a 3c 2f 63 65 6e 74 65 72 3e 0a 0a 3c 63  at.</center>..<c
15960 65 6e 74 65 72 3e 0a 20 20 3c 69 6d 67 20 73 72  enter>.  <img sr
15970 63 3d 69 6d 61 67 65 73 2f 66 74 73 33 5f 64 6f  c=images/fts3_do
15980 63 6c 69 73 74 2e 70 6e 67 3e 0a 20 20 3c 70 3e  clist.png>.  <p>
15990 20 46 54 53 20 44 6f 63 6c 69 73 74 20 45 6e 74   FTS Doclist Ent
159a0 72 79 20 46 6f 72 6d 61 74 0a 3c 2f 63 65 6e 74  ry Format.</cent
159b0 65 72 3e 0a 0a 3c 70 3e 0a 20 20 46 6f 72 20 64  er>..<p>.  For d
159c0 6f 63 6c 69 73 74 73 20 66 6f 72 20 77 68 69 63  oclists for whic
159d0 68 20 74 68 65 20 74 65 72 6d 20 61 70 70 65 61  h the term appea
159e0 72 73 20 69 6e 20 6d 6f 72 65 20 74 68 61 6e 20  rs in more than 
159f0 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  one column of th
15a00 65 20 46 54 53 0a 20 20 76 69 72 74 75 61 6c 20  e FTS.  virtual 
15a10 74 61 62 6c 65 2c 20 74 65 72 6d 2d 6f 66 66 73  table, term-offs
15a20 65 74 20 6c 69 73 74 73 20 77 69 74 68 69 6e 20  et lists within 
15a30 74 68 65 20 64 6f 63 6c 69 73 74 20 61 72 65 20  the doclist are 
15a40 73 74 6f 72 65 64 20 69 6e 20 63 6f 6c 75 6d 6e  stored in column
15a50 20 0a 20 20 6e 75 6d 62 65 72 20 6f 72 64 65 72   .  number order
15a60 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74  . This ensures t
15a70 68 61 74 20 74 68 65 20 74 65 72 6d 2d 6f 66 66  hat the term-off
15a80 73 65 74 20 6c 69 73 74 20 61 73 73 6f 63 69 61  set list associa
15a90 74 65 64 20 77 69 74 68 20 0a 20 20 63 6f 6c 75  ted with .  colu
15aa0 6d 6e 20 30 20 28 69 66 20 61 6e 79 29 20 69 73  mn 0 (if any) is
15ab0 20 61 6c 77 61 79 73 20 66 69 72 73 74 2c 20 61   always first, a
15ac0 6c 6c 6f 77 69 6e 67 20 74 68 65 20 66 69 72 73  llowing the firs
15ad0 74 20 74 77 6f 20 66 69 65 6c 64 73 20 6f 66 20  t two fields of 
15ae0 74 68 65 0a 20 20 74 65 72 6d 2d 6f 66 66 73 65  the.  term-offse
15af0 74 20 6c 69 73 74 20 74 6f 20 62 65 20 6f 6d 69  t list to be omi
15b00 74 74 65 64 20 69 6e 20 74 68 69 73 20 63 61 73  tted in this cas
15b10 65 2e 0a 0a 3c 68 31 20 69 64 3d 61 70 70 65 6e  e...<h1 id=appen
15b20 64 69 78 5f 61 20 6e 6f 6e 75 6d 62 65 72 20 74  dix_a nonumber t
15b30 61 67 73 3d 22 73 65 61 72 63 68 20 61 70 70 6c  ags="search appl
15b40 69 63 61 74 69 6f 6e 20 74 69 70 73 22 3e 0a 20  ication tips">. 
15b50 20 41 70 70 65 6e 64 69 78 20 41 3a 20 53 65 61   Appendix A: Sea
15b60 72 63 68 20 41 70 70 6c 69 63 61 74 69 6f 6e 20  rch Application 
15b70 54 69 70 73 0a 3c 2f 68 31 3e 0a 0a 3c 70 3e 0a  Tips.</h1>..<p>.
15b80 20 20 46 54 53 20 69 73 20 70 72 69 6d 61 72 69    FTS is primari
15b90 6c 79 20 64 65 73 69 67 6e 65 64 20 74 6f 20 73  ly designed to s
15ba0 75 70 70 6f 72 74 20 42 6f 6f 6c 65 61 6e 20 66  upport Boolean f
15bb0 75 6c 6c 2d 74 65 78 74 20 71 75 65 72 69 65 73  ull-text queries
15bc0 20 2d 20 71 75 65 72 69 65 73 0a 20 20 74 6f 20   - queries.  to 
15bd0 66 69 6e 64 20 74 68 65 20 73 65 74 20 6f 66 20  find the set of 
15be0 64 6f 63 75 6d 65 6e 74 73 20 74 68 61 74 20 6d  documents that m
15bf0 61 74 63 68 20 61 20 73 70 65 63 69 66 69 65 64  atch a specified
15c00 20 63 72 69 74 65 72 69 61 2e 20 48 6f 77 65 76   criteria. Howev
15c10 65 72 2c 20 6d 61 6e 79 20 0a 20 20 28 6d 6f 73  er, many .  (mos
15c20 74 3f 29 20 73 65 61 72 63 68 20 61 70 70 6c 69  t?) search appli
15c30 63 61 74 69 6f 6e 73 20 72 65 71 75 69 72 65 20  cations require 
15c40 74 68 61 74 20 72 65 73 75 6c 74 73 20 61 72 65  that results are
15c50 20 73 6f 6d 65 68 6f 77 20 72 61 6e 6b 65 64 20   somehow ranked 
15c60 69 6e 20 6f 72 64 65 72 0a 20 20 6f 66 20 22 72  in order.  of "r
15c70 65 6c 65 76 61 6e 63 65 22 2c 20 77 68 65 72 65  elevance", where
15c80 20 22 72 65 6c 65 76 61 6e 63 65 22 20 69 73 20   "relevance" is 
15c90 64 65 66 69 6e 65 64 20 61 73 20 74 68 65 20 6c  defined as the l
15ca0 69 6b 65 6c 69 68 6f 6f 64 20 74 68 61 74 20 74  ikelihood that t
15cb0 68 65 20 75 73 65 72 0a 20 20 77 68 6f 20 70 65  he user.  who pe
15cc0 72 66 6f 72 6d 65 64 20 74 68 65 20 73 65 61 72  rformed the sear
15cd0 63 68 20 69 73 20 69 6e 74 65 72 65 73 74 65 64  ch is interested
15ce0 20 69 6e 20 61 20 73 70 65 63 69 66 69 63 20 65   in a specific e
15cf0 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 72 65  lement of the re
15d00 74 75 72 6e 65 64 0a 20 20 73 65 74 20 6f 66 20  turned.  set of 
15d10 64 6f 63 75 6d 65 6e 74 73 2e 20 57 68 65 6e 20  documents. When 
15d20 75 73 69 6e 67 20 61 20 73 65 61 72 63 68 20 65  using a search e
15d30 6e 67 69 6e 65 20 74 6f 20 66 69 6e 64 20 64 6f  ngine to find do
15d40 63 75 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20 77  cuments on the w
15d50 6f 72 6c 64 0a 20 20 77 69 64 65 20 77 65 62 2c  orld.  wide web,
15d60 20 74 68 65 20 75 73 65 72 20 65 78 70 65 63 74   the user expect
15d70 73 20 74 68 61 74 20 74 68 65 20 6d 6f 73 74 20  s that the most 
15d80 75 73 65 66 75 6c 2c 20 6f 72 20 22 72 65 6c 65  useful, or "rele
15d90 76 61 6e 74 22 2c 20 64 6f 63 75 6d 65 6e 74 73  vant", documents
15da0 20 0a 20 20 77 69 6c 6c 20 62 65 20 72 65 74 75   .  will be retu
15db0 72 6e 65 64 20 61 73 20 74 68 65 20 66 69 72 73  rned as the firs
15dc0 74 20 70 61 67 65 20 6f 66 20 72 65 73 75 6c 74  t page of result
15dd0 73 2c 20 61 6e 64 20 74 68 61 74 20 65 61 63 68  s, and that each
15de0 20 73 75 62 73 65 71 75 65 6e 74 20 70 61 67 65   subsequent page
15df0 20 0a 20 20 63 6f 6e 74 61 69 6e 73 20 70 72 6f   .  contains pro
15e00 67 72 65 73 73 69 76 65 6c 79 20 6c 65 73 73 20  gressively less 
15e10 72 65 6c 65 76 61 6e 74 20 72 65 73 75 6c 74 73  relevant results
15e20 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20 61 20  . Exactly how a 
15e30 6d 61 63 68 69 6e 65 20 63 61 6e 20 0a 20 20 64  machine can .  d
15e40 65 74 65 72 6d 69 6e 65 20 64 6f 63 75 6d 65 6e  etermine documen
15e50 74 20 72 65 6c 65 76 61 6e 63 65 20 62 61 73 65  t relevance base
15e60 64 20 6f 6e 20 61 20 75 73 65 72 73 20 71 75 65  d on a users que
15e70 72 79 20 69 73 20 61 20 63 6f 6d 70 6c 69 63 61  ry is a complica
15e80 74 65 64 20 70 72 6f 62 6c 65 6d 0a 20 20 61 6e  ted problem.  an
15e90 64 20 74 68 65 20 73 75 62 6a 65 63 74 20 6f 66  d the subject of
15ea0 20 6d 75 63 68 20 6f 6e 67 6f 69 6e 67 20 72 65   much ongoing re
15eb0 73 65 61 72 63 68 2e 0a 0a 3c 70 3e 0a 20 20 4f  search...<p>.  O
15ec0 6e 65 20 76 65 72 79 20 73 69 6d 70 6c 65 20 73  ne very simple s
15ed0 63 68 65 6d 65 20 6d 69 67 68 74 20 62 65 20 74  cheme might be t
15ee0 6f 20 63 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  o count the numb
15ef0 65 72 20 6f 66 20 69 6e 73 74 61 6e 63 65 73 20  er of instances 
15f00 6f 66 20 74 68 65 20 0a 20 20 75 73 65 72 73 20  of the .  users 
15f10 73 65 61 72 63 68 20 74 65 72 6d 73 20 69 6e 20  search terms in 
15f20 65 61 63 68 20 72 65 73 75 6c 74 20 64 6f 63 75  each result docu
15f30 6d 65 6e 74 2e 20 54 68 6f 73 65 20 64 6f 63 75  ment. Those docu
15f40 6d 65 6e 74 73 20 74 68 61 74 20 63 6f 6e 74 61  ments that conta
15f50 69 6e 0a 20 20 6d 61 6e 79 20 69 6e 73 74 61 6e  in.  many instan
15f60 63 65 73 20 6f 66 20 74 68 65 20 74 65 72 6d 73  ces of the terms
15f70 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20   are considered 
15f80 6d 6f 72 65 20 72 65 6c 65 76 61 6e 74 20 74 68  more relevant th
15f90 61 6e 20 74 68 6f 73 65 20 77 69 74 68 0a 20 20  an those with.  
15fa0 61 20 73 6d 61 6c 6c 20 6e 75 6d 62 65 72 20 6f  a small number o
15fb0 66 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 65  f instances of e
15fc0 61 63 68 20 74 65 72 6d 2e 20 49 6e 20 61 6e 20  ach term. In an 
15fd0 46 54 53 20 61 70 70 6c 69 63 61 74 69 6f 6e 2c  FTS application,
15fe0 20 74 68 65 20 0a 20 20 6e 75 6d 62 65 72 20 6f   the .  number o
15ff0 66 20 74 65 72 6d 20 69 6e 73 74 61 6e 63 65 73  f term instances
16000 20 69 6e 20 65 61 63 68 20 72 65 73 75 6c 74 20   in each result 
16010 63 6f 75 6c 64 20 62 65 20 64 65 74 65 72 6d 69  could be determi
16020 6e 65 64 20 62 79 20 63 6f 75 6e 74 69 6e 67 0a  ned by counting.
16030 20 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20    the number of 
16040 69 6e 74 65 67 65 72 73 20 69 6e 20 74 68 65 20  integers in the 
16050 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
16060 74 68 65 20 5b 6f 66 66 73 65 74 73 5d 20 66 75  the [offsets] fu
16070 6e 63 74 69 6f 6e 2e 0a 20 20 54 68 65 20 66 6f  nction..  The fo
16080 6c 6c 6f 77 69 6e 67 20 65 78 61 6d 70 6c 65 20  llowing example 
16090 73 68 6f 77 73 20 61 20 71 75 65 72 79 20 74 68  shows a query th
160a0 61 74 20 63 6f 75 6c 64 20 62 65 20 75 73 65 64  at could be used
160b0 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 0a 20   to obtain the. 
160c0 20 74 65 6e 20 6d 6f 73 74 20 72 65 6c 65 76 61   ten most releva
160d0 6e 74 20 72 65 73 75 6c 74 73 20 66 6f 72 20 61  nt results for a
160e0 20 71 75 65 72 79 20 65 6e 74 65 72 65 64 20 62   query entered b
160f0 79 20 74 68 65 20 75 73 65 72 3a 0a 0a 3c 63 6f  y the user:..<co
16100 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d  deblock>.  <i>--
16110 20 54 68 69 73 20 65 78 61 6d 70 6c 65 20 28 61   This example (a
16120 6e 64 20 61 6c 6c 20 6f 74 68 65 72 73 20 69 6e  nd all others in
16130 20 74 68 69 73 20 73 65 63 74 69 6f 6e 29 20 61   this section) a
16140 73 73 75 6d 65 73 20 74 68 65 20 66 6f 6c 6c 6f  ssumes the follo
16150 77 69 6e 67 20 73 63 68 65 6d 61 3c 2f 69 3e 0a  wing schema</i>.
16160 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c    CREATE VIRTUAL
16170 20 54 41 42 4c 45 20 64 6f 63 75 6d 65 6e 74 73   TABLE documents
16180 20 55 53 49 4e 47 20 66 74 73 33 28 74 69 74 6c   USING fts3(titl
16190 65 2c 20 63 6f 6e 74 65 6e 74 29 3b 0a 0a 20 20  e, content);..  
161a0 3c 69 3e 2d 2d 20 41 73 73 75 6d 69 6e 67 20 74  <i>-- Assuming t
161b0 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 68  he application h
161c0 61 73 20 73 75 70 70 6c 69 65 64 20 61 6e 20 53  as supplied an S
161d0 51 4c 69 74 65 20 75 73 65 72 20 66 75 6e 63 74  QLite user funct
161e0 69 6f 6e 20 6e 61 6d 65 64 20 22 63 6f 75 6e 74  ion named "count
161f0 69 6e 74 65 67 65 72 73 22 3c 2f 69 3e 0a 20 20  integers"</i>.  
16200 3c 69 3e 2d 2d 20 74 68 61 74 20 72 65 74 75 72  <i>-- that retur
16210 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
16220 20 73 70 61 63 65 2d 73 65 70 61 72 61 74 65 64   space-separated
16230 20 69 6e 74 65 67 65 72 73 20 63 6f 6e 74 61 69   integers contai
16240 6e 65 64 20 69 6e 20 69 74 73 20 6f 6e 6c 79 20  ned in its only 
16250 61 72 67 75 6d 65 6e 74 2c 3c 2f 69 3e 0a 20 20  argument,</i>.  
16260 3c 69 3e 2d 2d 20 74 68 65 20 66 6f 6c 6c 6f 77  <i>-- the follow
16270 69 6e 67 20 71 75 65 72 79 20 63 6f 75 6c 64 20  ing query could 
16280 62 65 20 75 73 65 64 20 74 6f 20 72 65 74 75 72  be used to retur
16290 6e 20 74 68 65 20 74 69 74 6c 65 73 20 6f 66 20  n the titles of 
162a0 74 68 65 20 31 30 20 64 6f 63 75 6d 65 6e 74 73  the 10 documents
162b0 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 3c 2f 69   that contain</i
162c0 3e 0a 20 20 3c 69 3e 2d 2d 20 74 68 65 20 67 72  >.  <i>-- the gr
162d0 65 61 74 65 73 74 20 6e 75 6d 62 65 72 20 6f 66  eatest number of
162e0 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68   instances of th
162f0 65 20 75 73 65 72 73 20 71 75 65 72 79 20 74 65  e users query te
16300 72 6d 73 2e 20 48 6f 70 65 66 75 6c 6c 79 2c 20  rms. Hopefully, 
16310 74 68 65 73 65 20 31 30 3c 2f 69 3e 0a 20 20 3c  these 10</i>.  <
16320 69 3e 2d 2d 20 64 6f 63 75 6d 65 6e 74 73 20 77  i>-- documents w
16330 69 6c 6c 20 62 65 20 74 68 6f 73 65 20 74 68 61  ill be those tha
16340 74 20 74 68 65 20 75 73 65 72 73 20 63 6f 6e 73  t the users cons
16350 69 64 65 72 73 20 6d 6f 72 65 20 6f 72 20 6c 65  iders more or le
16360 73 73 20 74 68 65 20 6d 6f 73 74 20 22 72 65 6c  ss the most "rel
16370 65 76 61 6e 74 22 2e 3c 2f 69 3e 0a 20 20 53 45  evant".</i>.  SE
16380 4c 45 43 54 20 74 69 74 6c 65 20 46 52 4f 4d 20  LECT title FROM 
16390 64 6f 63 75 6d 65 6e 74 73 20 0a 20 20 20 20 57  documents .    W
163a0 48 45 52 45 20 64 6f 63 75 6d 65 6e 74 73 20 4d  HERE documents M
163b0 41 54 43 48 20 26 6c 74 3b 71 75 65 72 79 26 67  ATCH &lt;query&g
163c0 74 3b 0a 20 20 20 20 4f 52 44 45 52 20 42 59 20  t;.    ORDER BY 
163d0 63 6f 75 6e 74 69 6e 74 65 67 65 72 73 28 6f 66  countintegers(of
163e0 66 73 65 74 73 28 64 6f 63 75 6d 65 6e 74 73 29  fsets(documents)
163f0 29 20 44 45 53 43 0a 20 20 20 20 4c 49 4d 49 54  ) DESC.    LIMIT
16400 20 31 30 20 4f 46 46 53 45 54 20 30 0a 3c 2f 63   10 OFFSET 0.</c
16410 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20  odeblock>..<p>. 
16420 20 54 68 65 20 71 75 65 72 79 20 61 62 6f 76 65   The query above
16430 20 63 6f 75 6c 64 20 62 65 20 6d 61 64 65 20 74   could be made t
16440 6f 20 72 75 6e 20 66 61 73 74 65 72 20 62 79 20  o run faster by 
16450 75 73 69 6e 67 20 74 68 65 20 46 54 53 20 5b 6d  using the FTS [m
16460 61 74 63 68 69 6e 66 6f 5d 0a 20 20 66 75 6e 63  atchinfo].  func
16470 74 69 6f 6e 20 74 6f 20 64 65 74 65 72 6d 69 6e  tion to determin
16480 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
16490 71 75 65 72 79 20 74 65 72 6d 20 69 6e 73 74 61  query term insta
164a0 6e 63 65 73 20 74 68 61 74 20 61 70 70 65 61 72  nces that appear
164b0 20 69 6e 20 65 61 63 68 0a 20 20 72 65 73 75 6c   in each.  resul
164c0 74 2e 20 54 68 65 20 6d 61 74 63 68 69 6e 66 6f  t. The matchinfo
164d0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6d 75 63   function is muc
164e0 68 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74  h more efficient
164f0 20 74 68 61 6e 20 74 68 65 20 6f 66 66 73 65 74   than the offset
16500 73 20 0a 20 20 66 75 6e 63 74 69 6f 6e 2e 20 46  s .  function. F
16510 75 72 74 68 65 72 6d 6f 72 65 2c 20 74 68 65 20  urthermore, the 
16520 6d 61 74 63 68 69 6e 66 6f 20 66 75 6e 63 74 69  matchinfo functi
16530 6f 6e 20 70 72 6f 76 69 64 65 73 20 65 78 74 72  on provides extr
16540 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20 20  a information.  
16550 72 65 67 61 72 64 69 6e 67 20 74 68 65 20 6f 76  regarding the ov
16560 65 72 61 6c 6c 20 6e 75 6d 62 65 72 20 6f 66 20  erall number of 
16570 6f 63 63 75 72 72 65 6e 63 65 73 20 6f 66 20 65  occurrences of e
16580 61 63 68 20 71 75 65 72 79 20 74 65 72 6d 20 69  ach query term i
16590 6e 20 74 68 65 20 65 6e 74 69 72 65 0a 20 20 64  n the entire.  d
165a0 6f 63 75 6d 65 6e 74 20 73 65 74 20 28 6e 6f 74  ocument set (not
165b0 20 6a 75 73 74 20 74 68 65 20 63 75 72 72 65 6e   just the curren
165c0 74 20 72 6f 77 29 20 61 6e 64 20 74 68 65 20 6e  t row) and the n
165d0 75 6d 62 65 72 20 6f 66 20 64 6f 63 75 6d 65 6e  umber of documen
165e0 74 73 20 69 6e 20 77 68 69 63 68 20 0a 20 20 65  ts in which .  e
165f0 61 63 68 20 71 75 65 72 79 20 74 65 72 6d 20 61  ach query term a
16600 70 70 65 61 72 73 2e 20 54 68 69 73 20 6d 61 79  ppears. This may
16610 20 62 65 20 75 73 65 64 20 28 66 6f 72 20 65 78   be used (for ex
16620 61 6d 70 6c 65 29 20 74 6f 20 61 74 74 61 63 68  ample) to attach
16630 20 61 20 68 69 67 68 65 72 0a 20 20 77 65 69 67   a higher.  weig
16640 68 74 20 74 6f 20 6c 65 73 73 20 63 6f 6d 6d 6f  ht to less commo
16650 6e 20 74 65 72 6d 73 20 77 68 69 63 68 20 6d 61  n terms which ma
16660 79 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 6f  y increase the o
16670 76 65 72 61 6c 6c 20 63 6f 6d 70 75 74 65 64 20  verall computed 
16680 72 65 6c 65 76 61 6e 63 79 20 0a 20 20 6f 66 20  relevancy .  of 
16690 74 68 6f 73 65 20 72 65 73 75 6c 74 73 20 74 68  those results th
166a0 65 20 75 73 65 72 20 63 6f 6e 73 69 64 65 72 73  e user considers
166b0 20 6d 6f 72 65 20 69 6e 74 65 72 65 73 74 69 6e   more interestin
166c0 67 2e 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a  g...<codeblock>.
166d0 20 20 3c 69 3e 2d 2d 20 49 66 20 74 68 65 20 61    <i>-- If the a
166e0 70 70 6c 69 63 61 74 69 6f 6e 20 73 75 70 70 6c  pplication suppl
166f0 69 65 73 20 61 6e 20 53 51 4c 69 74 65 20 75 73  ies an SQLite us
16700 65 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  er function call
16710 65 64 20 22 72 61 6e 6b 22 20 74 68 61 74 3c 2f  ed "rank" that</
16720 69 3e 0a 20 20 3c 69 3e 2d 2d 20 69 6e 74 65 72  i>.  <i>-- inter
16730 70 72 65 74 73 20 74 68 65 20 62 6c 6f 62 20 6f  prets the blob o
16740 66 20 64 61 74 61 20 72 65 74 75 72 6e 65 64 20  f data returned 
16750 62 79 20 6d 61 74 63 68 69 6e 66 6f 20 61 6e 64  by matchinfo and
16760 20 72 65 74 75 72 6e 73 20 61 20 6e 75 6d 65 72   returns a numer
16770 69 63 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 72  ic</i>.  <i>-- r
16780 65 6c 65 76 61 6e 63 79 20 62 61 73 65 64 20 6f  elevancy based o
16790 6e 20 69 74 2c 20 74 68 65 6e 20 74 68 65 20 66  n it, then the f
167a0 6f 6c 6c 6f 77 69 6e 67 20 53 51 4c 20 6d 61 79  ollowing SQL may
167b0 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 74 75   be used to retu
167c0 72 6e 20 74 68 65 3c 2f 69 3e 0a 20 20 3c 69 3e  rn the</i>.  <i>
167d0 2d 2d 20 74 69 74 6c 65 73 20 6f 66 20 74 68 65  -- titles of the
167e0 20 31 30 20 6d 6f 73 74 20 72 65 6c 65 76 61 6e   10 most relevan
167f0 74 20 64 6f 63 75 6d 65 6e 74 73 20 69 6e 20 74  t documents in t
16800 68 65 20 64 61 74 61 73 65 74 20 66 6f 72 20 61  he dataset for a
16810 20 75 73 65 72 73 20 71 75 65 72 79 2e 3c 2f 69   users query.</i
16820 3e 0a 20 20 53 45 4c 45 43 54 20 74 69 74 6c 65  >.  SELECT title
16830 20 46 52 4f 4d 20 64 6f 63 75 6d 65 6e 74 73 20   FROM documents 
16840 0a 20 20 20 20 57 48 45 52 45 20 64 6f 63 75 6d  .    WHERE docum
16850 65 6e 74 73 20 4d 41 54 43 48 20 26 6c 74 3b 71  ents MATCH &lt;q
16860 75 65 72 79 26 67 74 3b 0a 20 20 20 20 4f 52 44  uery&gt;.    ORD
16870 45 52 20 42 59 20 72 61 6e 6b 28 6d 61 74 63 68  ER BY rank(match
16880 69 6e 66 6f 28 64 6f 63 75 6d 65 6e 74 73 29 29  info(documents))
16890 20 44 45 53 43 0a 20 20 20 20 4c 49 4d 49 54 20   DESC.    LIMIT 
168a0 31 30 20 4f 46 46 53 45 54 20 30 0a 3c 2f 63 6f  10 OFFSET 0.</co
168b0 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20  deblock>..<p>.  
168c0 54 68 65 20 53 51 4c 20 71 75 65 72 79 20 69 6e  The SQL query in
168d0 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f   the example abo
168e0 76 65 20 75 73 65 73 20 6c 65 73 73 20 43 50 55  ve uses less CPU
168f0 20 74 68 61 6e 20 74 68 65 20 66 69 72 73 74 20   than the first 
16900 65 78 61 6d 70 6c 65 0a 20 20 69 6e 20 74 68 69  example.  in thi
16910 73 20 73 65 63 74 69 6f 6e 2c 20 62 75 74 20 73  s section, but s
16920 74 69 6c 6c 20 68 61 73 20 61 20 6e 6f 6e 2d 6f  till has a non-o
16930 62 76 69 6f 75 73 20 70 65 72 66 6f 72 6d 61 6e  bvious performan
16940 63 65 20 70 72 6f 62 6c 65 6d 2e 20 53 51 4c 69  ce problem. SQLi
16950 74 65 0a 20 20 73 61 74 69 73 66 69 65 73 20 74  te.  satisfies t
16960 68 69 73 20 71 75 65 72 79 20 62 79 20 72 65 74  his query by ret
16970 72 69 65 76 69 6e 67 20 74 68 65 20 76 61 6c 75  rieving the valu
16980 65 20 6f 66 20 74 68 65 20 22 74 69 74 6c 65 22  e of the "title"
16990 20 63 6f 6c 75 6d 6e 20 61 6e 64 0a 20 20 6d 61   column and.  ma
169a0 74 63 68 69 6e 66 6f 20 64 61 74 61 20 66 72 6f  tchinfo data fro
169b0 6d 20 74 68 65 20 46 54 53 20 6d 6f 64 75 6c 65  m the FTS module
169c0 20 66 6f 72 20 65 76 65 72 79 20 72 6f 77 20 6d   for every row m
169d0 61 74 63 68 65 64 20 62 79 20 74 68 65 20 75 73  atched by the us
169e0 65 72 73 0a 20 20 71 75 65 72 79 20 62 65 66 6f  ers.  query befo
169f0 72 65 20 69 74 20 73 6f 72 74 73 20 61 6e 64 20  re it sorts and 
16a00 6c 69 6d 69 74 73 20 74 68 65 20 72 65 73 75 6c  limits the resul
16a10 74 73 2e 20 42 65 63 61 75 73 65 20 6f 66 20 74  ts. Because of t
16a20 68 65 20 77 61 79 20 53 51 4c 69 74 65 27 73 0a  he way SQLite's.
16a30 20 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20    virtual table 
16a40 69 6e 74 65 72 66 61 63 65 20 77 6f 72 6b 73 2c  interface works,
16a50 20 72 65 74 72 69 65 76 69 6e 67 20 74 68 65 20   retrieving the 
16a60 76 61 6c 75 65 20 6f 66 20 74 68 65 20 22 74 69  value of the "ti
16a70 74 6c 65 22 20 63 6f 6c 75 6d 6e 0a 20 20 72 65  tle" column.  re
16a80 71 75 69 72 65 73 20 6c 6f 61 64 69 6e 67 20 74  quires loading t
16a90 68 65 20 65 6e 74 69 72 65 20 72 6f 77 20 66 72  he entire row fr
16aa0 6f 6d 20 64 69 73 6b 20 28 69 6e 63 6c 75 64 69  om disk (includi
16ab0 6e 67 20 74 68 65 20 22 63 6f 6e 74 65 6e 74 22  ng the "content"
16ac0 20 66 69 65 6c 64 2c 0a 20 20 77 68 69 63 68 20   field,.  which 
16ad0 6d 61 79 20 62 65 20 71 75 69 74 65 20 6c 61 72  may be quite lar
16ae0 67 65 29 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ge). This means 
16af0 74 68 61 74 20 69 66 20 74 68 65 20 75 73 65 72  that if the user
16b00 73 20 71 75 65 72 79 20 6d 61 74 63 68 65 73 0a  s query matches.
16b10 20 20 73 65 76 65 72 61 6c 20 74 68 6f 75 73 61    several thousa
16b20 6e 64 20 64 6f 63 75 6d 65 6e 74 73 2c 20 6d 61  nd documents, ma
16b30 6e 79 20 6d 65 67 61 62 79 74 65 73 20 6f 66 20  ny megabytes of 
16b40 22 74 69 74 6c 65 22 20 61 6e 64 20 22 63 6f 6e  "title" and "con
16b50 74 65 6e 74 22 20 64 61 74 61 0a 20 20 6d 61 79  tent" data.  may
16b60 20 62 65 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20   be loaded from 
16b70 64 69 73 6b 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  disk into memory
16b80 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65   even though the
16b90 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20  y will never be 
16ba0 75 73 65 64 0a 20 20 66 6f 72 20 61 6e 79 20 70  used.  for any p
16bb0 75 72 70 6f 73 65 2e 20 0a 0a 3c 70 3e 0a 20 20  urpose. ..<p>.  
16bc0 54 68 65 20 53 51 4c 20 71 75 65 72 79 20 69 6e  The SQL query in
16bd0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65   the following e
16be0 78 61 6d 70 6c 65 20 62 6c 6f 63 6b 20 69 73 20  xample block is 
16bf0 6f 6e 65 20 73 6f 6c 75 74 69 6f 6e 20 74 6f 20  one solution to 
16c00 74 68 69 73 20 0a 20 20 70 72 6f 62 6c 65 6d 2e  this .  problem.
16c10 20 49 6e 20 53 51 4c 69 74 65 2c 20 77 68 65 6e   In SQLite, when
16c20 20 61 20 3c 61 20 68 72 65 66 3d 22 6f 70 74 6f   a <a href="opto
16c30 76 65 72 76 69 65 77 2e 68 74 6d 6c 23 66 6c 61  verview.html#fla
16c40 74 74 65 6e 69 6e 67 22 3e 73 75 62 2d 71 75 65  ttening">sub-que
16c50 72 79 20 0a 20 20 75 73 65 64 20 69 6e 20 61 20  ry .  used in a 
16c60 6a 6f 69 6e 20 63 6f 6e 74 61 69 6e 73 20 61 20  join contains a 
16c70 4c 49 4d 49 54 20 63 6c 61 75 73 65 3c 2f 61 3e  LIMIT clause</a>
16c80 2c 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  , the results of
16c90 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 61   the sub-query a
16ca0 72 65 0a 20 20 63 61 6c 63 75 6c 61 74 65 64 20  re.  calculated 
16cb0 61 6e 64 20 73 74 6f 72 65 64 20 69 6e 20 74 65  and stored in te
16cc0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 62 65  mporary table be
16cd0 66 6f 72 65 20 74 68 65 20 6d 61 69 6e 20 71 75  fore the main qu
16ce0 65 72 79 20 69 73 20 65 78 65 63 75 74 65 64 2e  ery is executed.
16cf0 0a 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  .  This means th
16d00 61 74 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6c  at SQLite will l
16d10 6f 61 64 20 6f 6e 6c 79 20 74 68 65 20 64 6f 63  oad only the doc
16d20 69 64 20 61 6e 64 20 6d 61 74 63 68 69 6e 66 6f  id and matchinfo
16d30 20 64 61 74 61 20 66 6f 72 20 65 61 63 68 0a 20   data for each. 
16d40 20 72 6f 77 20 6d 61 74 63 68 69 6e 67 20 74 68   row matching th
16d50 65 20 75 73 65 72 73 20 71 75 65 72 79 20 69 6e  e users query in
16d60 74 6f 20 6d 65 6d 6f 72 79 2c 20 64 65 74 65 72  to memory, deter
16d70 6d 69 6e 65 20 74 68 65 20 64 6f 63 69 64 20 76  mine the docid v
16d80 61 6c 75 65 73 0a 20 20 63 6f 72 72 65 73 70 6f  alues.  correspo
16d90 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 74 65 6e  nding to the ten
16da0 20 6d 6f 73 74 20 72 65 6c 65 76 61 6e 74 20 64   most relevant d
16db0 6f 63 75 6d 65 6e 74 73 2c 20 74 68 65 6e 20 6c  ocuments, then l
16dc0 6f 61 64 20 6f 6e 6c 79 20 74 68 65 20 74 69 74  oad only the tit
16dd0 6c 65 0a 20 20 61 6e 64 20 63 6f 6e 74 65 6e 74  le.  and content
16de0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
16df0 20 74 68 6f 73 65 20 31 30 20 64 6f 63 75 6d 65   those 10 docume
16e00 6e 74 73 20 6f 6e 6c 79 2e 20 42 65 63 61 75 73  nts only. Becaus
16e10 65 20 62 6f 74 68 20 74 68 65 20 6d 61 74 63 68  e both the match
16e20 69 6e 66 6f 0a 20 20 61 6e 64 20 64 6f 63 69 64  info.  and docid
16e30 20 76 61 6c 75 65 73 20 61 72 65 20 67 6c 65 61   values are glea
16e40 6e 65 64 20 65 6e 74 69 72 65 6c 79 20 66 72 6f  ned entirely fro
16e50 6d 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20  m the full-text 
16e60 69 6e 64 65 78 2c 20 74 68 69 73 20 72 65 73 75  index, this resu
16e70 6c 74 73 0a 20 20 69 6e 20 64 72 61 6d 61 74 69  lts.  in dramati
16e80 63 61 6c 6c 79 20 6c 65 73 73 20 64 61 74 61 20  cally less data 
16e90 62 65 69 6e 67 20 6c 6f 61 64 65 64 20 66 72 6f  being loaded fro
16ea0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  m the database i
16eb0 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 0a 3c 63 6f  nto memory...<co
16ec0 64 65 62 6c 6f 63 6b 3e 0a 20 20 53 45 4c 45 43  deblock>.  SELEC
16ed0 54 20 74 69 74 6c 65 20 46 52 4f 4d 20 64 6f 63  T title FROM doc
16ee0 75 6d 65 6e 74 73 20 4a 4f 49 4e 20 28 20 0a 20  uments JOIN ( . 
16ef0 20 20 20 20 20 53 45 4c 45 43 54 20 64 6f 63 69       SELECT doci
16f00 64 2c 20 72 61 6e 6b 28 6d 61 74 63 68 69 6e 66  d, rank(matchinf
16f10 6f 28 64 6f 63 75 6d 65 6e 74 73 29 29 20 41 53  o(documents)) AS
16f20 20 72 61 6e 6b 20 0a 20 20 20 20 20 20 46 52 4f   rank .      FRO
16f30 4d 20 64 6f 63 75 6d 65 6e 74 73 0a 20 20 20 20  M documents.    
16f40 20 20 57 48 45 52 45 20 64 6f 63 75 6d 65 6e 74    WHERE document
16f50 73 20 4d 41 54 43 48 20 26 6c 74 3b 71 75 65 72  s MATCH &lt;quer
16f60 79 26 67 74 3b 0a 20 20 20 20 20 20 4f 52 44 45  y&gt;.      ORDE
16f70 52 20 42 59 20 72 61 6e 6b 20 44 45 53 43 20 0a  R BY rank DESC .
16f80 20 20 20 20 20 20 4c 49 4d 49 54 20 31 30 20 4f        LIMIT 10 O
16f90 46 46 53 45 54 20 30 0a 20 20 29 20 41 53 20 72  FFSET 0.  ) AS r
16fa0 61 6e 6b 74 61 62 6c 65 20 55 53 49 4e 47 28 64  anktable USING(d
16fb0 6f 63 69 64 29 0a 20 20 4f 52 44 45 52 20 42 59  ocid).  ORDER BY
16fc0 20 72 61 6e 6b 74 61 62 6c 65 2e 72 61 6e 6b 20   ranktable.rank 
16fd0 44 45 53 43 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b  DESC.</codeblock
16fe0 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 6e 65 78  >..<p>.  The nex
16ff0 74 20 62 6c 6f 63 6b 20 6f 66 20 53 51 4c 20 65  t block of SQL e
17000 6e 68 61 6e 63 65 73 20 74 68 65 20 71 75 65 72  nhances the quer
17010 79 20 77 69 74 68 20 73 6f 6c 75 74 69 6f 6e 73  y with solutions
17020 20 74 6f 20 74 77 6f 20 6f 74 68 65 72 20 70 72   to two other pr
17030 6f 62 6c 65 6d 73 0a 20 20 74 68 61 74 20 6d 61  oblems.  that ma
17040 79 20 61 72 69 73 65 20 69 6e 20 64 65 76 65 6c  y arise in devel
17050 6f 70 69 6e 67 20 73 65 61 72 63 68 20 61 70 70  oping search app
17060 6c 69 63 61 74 69 6f 6e 73 20 75 73 69 6e 67 20  lications using 
17070 46 54 53 3a 0a 0a 3c 6f 6c 3e 0a 20 20 3c 6c 69  FTS:..<ol>.  <li
17080 3e 20 3c 70 3e 0a 20 20 20 20 20 20 20 54 68 65  > <p>.       The
17090 20 5b 73 6e 69 70 70 65 74 5d 20 66 75 6e 63 74   [snippet] funct
170a0 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75 73  ion cannot be us
170b0 65 64 20 77 69 74 68 20 74 68 65 20 61 62 6f 76  ed with the abov
170c0 65 20 71 75 65 72 79 2e 20 42 65 63 61 75 73 65  e query. Because
170d0 0a 20 20 20 20 20 20 20 74 68 65 20 6f 75 74 65  .       the oute
170e0 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  r query does not
170f0 20 69 6e 63 6c 75 64 65 20 61 20 22 57 48 45 52   include a "WHER
17100 45 20 2e 2e 2e 20 4d 41 54 43 48 22 20 63 6c 61  E ... MATCH" cla
17110 75 73 65 2c 20 74 68 65 20 73 6e 69 70 70 65 74  use, the snippet
17120 20 0a 20 20 20 20 20 20 20 66 75 6e 63 74 69 6f   .       functio
17130 6e 20 6d 61 79 20 6e 6f 74 20 62 65 20 75 73 65  n may not be use
17140 64 20 77 69 74 68 20 69 74 2e 20 4f 6e 65 20 73  d with it. One s
17150 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 64 75  olution is to du
17160 70 6c 69 63 61 74 65 20 74 68 65 20 57 48 45 52  plicate the WHER
17170 45 0a 20 20 20 20 20 20 20 63 6c 61 75 73 65 20  E.       clause 
17180 75 73 65 64 20 62 79 20 74 68 65 20 73 75 62 2d  used by the sub-
17190 71 75 65 72 79 20 69 6e 20 74 68 65 20 6f 75 74  query in the out
171a0 65 72 20 71 75 65 72 79 2e 20 54 68 65 20 6f 76  er query. The ov
171b0 65 72 68 65 61 64 20 61 73 73 6f 63 69 61 74 65  erhead associate
171c0 64 0a 20 20 20 20 20 20 20 77 69 74 68 20 74 68  d.       with th
171d0 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 6e 65  is is usually ne
171e0 67 6c 69 67 69 62 6c 65 2e 0a 20 20 3c 6c 69 3e  gligible..  <li>
171f0 20 3c 70 3e 0a 20 20 20 20 20 20 20 54 68 65 20   <p>.       The 
17200 72 65 6c 65 76 61 6e 63 79 20 6f 66 20 61 20 64  relevancy of a d
17210 6f 63 75 6d 65 6e 74 20 6d 61 79 20 64 65 70 65  ocument may depe
17220 6e 64 20 6f 6e 20 73 6f 6d 65 74 68 69 6e 67 20  nd on something 
17230 6f 74 68 65 72 20 74 68 61 6e 20 6a 75 73 74 0a  other than just.
17240 20 20 20 20 20 20 20 74 68 65 20 64 61 74 61 20         the data 
17250 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 65  available in the
17260 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
17270 20 6d 61 74 63 68 69 6e 66 6f 2e 20 46 6f 72 20   matchinfo. For 
17280 65 78 61 6d 70 6c 65 0a 20 20 20 20 20 20 20 65  example.       e
17290 61 63 68 20 64 6f 63 75 6d 65 6e 74 20 69 6e 20  ach document in 
172a0 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79  the database may
172b0 20 62 65 20 61 73 73 69 67 6e 65 64 20 61 20 73   be assigned a s
172c0 74 61 74 69 63 20 77 65 69 67 68 74 20 62 61 73  tatic weight bas
172d0 65 64 0a 20 20 20 20 20 20 20 6f 6e 20 66 61 63  ed.       on fac
172e0 74 6f 72 73 20 75 6e 72 65 6c 61 74 65 64 20 74  tors unrelated t
172f0 6f 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 28 6f  o its content (o
17300 72 69 67 69 6e 2c 20 61 75 74 68 6f 72 2c 20 61  rigin, author, a
17310 67 65 2c 20 6e 75 6d 62 65 72 0a 20 20 20 20 20  ge, number.     
17320 20 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20    of references 
17330 65 74 63 2e 29 2e 20 54 68 65 73 65 20 76 61 6c  etc.). These val
17340 75 65 73 20 63 61 6e 20 62 65 20 73 74 6f 72 65  ues can be store
17350 64 20 62 79 20 74 68 65 20 61 70 70 6c 69 63 61  d by the applica
17360 74 69 6f 6e 0a 20 20 20 20 20 20 20 69 6e 20 61  tion.       in a
17370 20 73 65 70 61 72 61 74 65 20 74 61 62 6c 65 20   separate table 
17380 74 68 61 74 20 63 61 6e 20 62 65 20 6a 6f 69 6e  that can be join
17390 65 64 20 61 67 61 69 6e 73 74 20 74 68 65 20 64  ed against the d
173a0 6f 63 75 6d 65 6e 74 73 20 74 61 62 6c 65 0a 20  ocuments table. 
173b0 20 20 20 20 20 20 69 6e 20 74 68 65 20 73 75 62        in the sub
173c0 2d 71 75 65 72 79 20 73 6f 20 74 68 61 74 20 74  -query so that t
173d0 68 65 20 72 61 6e 6b 20 66 75 6e 63 74 69 6f 6e  he rank function
173e0 20 6d 61 79 20 61 63 63 65 73 73 20 74 68 65 6d   may access them
173f0 2e 0a 3c 2f 6f 6c 3e 0a 0a 3c 70 3e 0a 20 20 54  ..</ol>..<p>.  T
17400 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  his version of t
17410 68 65 20 71 75 65 72 79 20 69 73 20 76 65 72 79  he query is very
17420 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 61 74   similar to that
17430 20 75 73 65 64 20 62 79 20 74 68 65 20 0a 20 20   used by the .  
17440 3c 61 20 68 72 65 66 3d 22 68 74 74 70 3a 2f 2f  <a href="http://
17450 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73  www.sqlite.org/s
17460 65 61 72 63 68 3f 71 3d 66 74 73 33 22 3e 73 71  earch?q=fts3">sq
17470 6c 69 74 65 2e 6f 72 67 20 64 6f 63 75 6d 65 6e  lite.org documen
17480 74 61 74 69 6f 6e 20 73 65 61 72 63 68 3c 2f 61  tation search</a
17490 3e 20 0a 20 20 61 70 70 6c 69 63 61 74 69 6f 6e  > .  application
174a0 2e 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20  ...<codeblock>. 
174b0 20 3c 69 3e 2d 2d 20 54 68 69 73 20 74 61 62 6c   <i>-- This tabl
174c0 65 20 73 74 6f 72 65 73 20 74 68 65 20 73 74 61  e stores the sta
174d0 74 69 63 20 77 65 69 67 68 74 20 61 73 73 69 67  tic weight assig
174e0 6e 65 64 20 74 6f 20 65 61 63 68 20 64 6f 63 75  ned to each docu
174f0 6d 65 6e 74 20 69 6e 20 46 54 53 20 74 61 62 6c  ment in FTS tabl
17500 65 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 22 64  e</i>.  <i>-- "d
17510 6f 63 75 6d 65 6e 74 73 22 2e 20 46 6f 72 20 65  ocuments". For e
17520 61 63 68 20 72 6f 77 20 69 6e 20 74 68 65 20 64  ach row in the d
17530 6f 63 75 6d 65 6e 74 73 20 74 61 62 6c 65 20 74  ocuments table t
17540 68 65 72 65 20 69 73 20 61 20 63 6f 72 72 65 73  here is a corres
17550 70 6f 6e 64 69 6e 67 20 72 6f 77 3c 2f 69 3e 0a  ponding row</i>.
17560 20 20 3c 69 3e 2d 2d 20 77 69 74 68 20 74 68 65    <i>-- with the
17570 20 73 61 6d 65 20 64 6f 63 69 64 20 76 61 6c 75   same docid valu
17580 65 20 69 6e 20 74 68 69 73 20 74 61 62 6c 65 2e  e in this table.
17590 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45 20 54 41  </i>.  CREATE TA
175a0 42 4c 45 20 64 6f 63 75 6d 65 6e 74 73 5f 64 61  BLE documents_da
175b0 74 61 28 64 6f 63 69 64 20 49 4e 54 45 47 45 52  ta(docid INTEGER
175c0 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 77 65   PRIMARY KEY, we
175d0 69 67 68 74 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20  ight);..  <i>-- 
175e0 54 68 69 73 20 71 75 65 72 79 20 69 73 20 73 69  This query is si
175f0 6d 69 6c 61 72 20 74 6f 20 74 68 65 20 6f 6e 65  milar to the one
17600 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61 62   in the block ab
17610 6f 76 65 2c 20 65 78 63 65 70 74 20 74 68 61 74  ove, except that
17620 3a 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 3c 2f 69  :</i>.  <i>--</i
17630 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20 31 2e 20 49  >.  <i>--   1. I
17640 74 20 72 65 74 75 72 6e 73 20 61 20 22 73 6e 69  t returns a "sni
17650 70 70 65 74 22 20 6f 66 20 74 65 78 74 20 61 6c  ppet" of text al
17660 6f 6e 67 20 77 69 74 68 20 74 68 65 20 64 6f 63  ong with the doc
17670 75 6d 65 6e 74 20 74 69 74 6c 65 20 66 6f 72 20  ument title for 
17680 64 69 73 70 6c 61 79 2e 20 53 6f 3c 2f 69 3e 0a  display. So</i>.
17690 20 20 3c 69 3e 2d 2d 20 20 20 20 20 20 74 68 61    <i>--      tha
176a0 74 20 74 68 65 20 73 6e 69 70 70 65 74 20 66 75  t the snippet fu
176b0 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 75 73  nction may be us
176c0 65 64 2c 20 74 68 65 20 22 57 48 45 52 45 20 2e  ed, the "WHERE .
176d0 2e 2e 20 4d 41 54 43 48 20 2e 2e 2e 22 20 63 6c  .. MATCH ..." cl
176e0 61 75 73 65 20 66 72 6f 6d 3c 2f 69 3e 0a 20 20  ause from</i>.  
176f0 3c 69 3e 2d 2d 20 20 20 20 20 20 74 68 65 20 73  <i>--      the s
17700 75 62 2d 71 75 65 72 79 20 69 73 20 64 75 70 6c  ub-query is dupl
17710 69 63 61 74 65 64 20 69 6e 20 74 68 65 20 6f 75  icated in the ou
17720 74 65 72 20 71 75 65 72 79 2e 3c 2f 69 3e 0a 20  ter query.</i>. 
17730 20 3c 69 3e 2d 2d 3c 2f 69 3e 0a 20 20 3c 69 3e   <i>--</i>.  <i>
17740 2d 2d 20 20 20 32 2e 20 54 68 65 20 73 75 62 2d  --   2. The sub-
17750 71 75 65 72 79 20 6a 6f 69 6e 73 20 74 68 65 20  query joins the 
17760 64 6f 63 75 6d 65 6e 74 73 20 74 61 62 6c 65 20  documents table 
17770 77 69 74 68 20 74 68 65 20 64 6f 63 75 6d 65 6e  with the documen
17780 74 5f 64 61 74 61 20 74 61 62 6c 65 2c 20 73 6f  t_data table, so
17790 20 74 68 61 74 3c 2f 69 3e 0a 20 20 3c 69 3e 2d   that</i>.  <i>-
177a0 2d 20 20 20 20 20 20 69 6d 70 6c 65 6d 65 6e 74  -      implement
177b0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 61 6e  ation of the ran
177c0 6b 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 61  k function has a
177d0 63 63 65 73 73 20 74 6f 20 74 68 65 20 73 74 61  ccess to the sta
177e0 74 69 63 20 77 65 69 67 68 74 20 61 73 73 69 67  tic weight assig
177f0 6e 65 64 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20  ned</i>.  <i>-- 
17800 20 20 20 20 20 74 6f 20 65 61 63 68 20 64 6f 63       to each doc
17810 75 6d 65 6e 74 2e 3c 2f 69 3e 0a 20 20 53 45 4c  ument.</i>.  SEL
17820 45 43 54 20 74 69 74 6c 65 2c 20 73 6e 69 70 70  ECT title, snipp
17830 65 74 28 64 6f 63 75 6d 65 6e 74 73 29 20 46 52  et(documents) FR
17840 4f 4d 20 64 6f 63 75 6d 65 6e 74 73 20 4a 4f 49  OM documents JOI
17850 4e 20 28 20 0a 20 20 20 20 20 20 53 45 4c 45 43  N ( .      SELEC
17860 54 20 64 6f 63 69 64 2c 20 72 61 6e 6b 28 6d 61  T docid, rank(ma
17870 74 63 68 69 6e 66 6f 28 64 6f 63 75 6d 65 6e 74  tchinfo(document
17880 73 29 2c 20 64 6f 63 75 6d 65 6e 74 73 5f 64 61  s), documents_da
17890 74 61 2e 77 65 69 67 68 74 29 20 41 53 20 72 61  ta.weight) AS ra
178a0 6e 6b 0a 20 20 20 20 20 20 46 52 4f 4d 20 64 6f  nk.      FROM do
178b0 63 75 6d 65 6e 74 73 20 4a 4f 49 4e 20 64 6f 63  cuments JOIN doc
178c0 75 6d 65 6e 74 73 5f 64 61 74 61 20 55 53 49 4e  uments_data USIN
178d0 47 28 64 6f 63 69 64 29 0a 20 20 20 20 20 20 57  G(docid).      W
178e0 48 45 52 45 20 64 6f 63 75 6d 65 6e 74 73 20 4d  HERE documents M
178f0 41 54 43 48 20 26 6c 74 3b 71 75 65 72 79 26 67  ATCH &lt;query&g
17900 74 3b 0a 20 20 20 20 20 20 4f 52 44 45 52 20 42  t;.      ORDER B
17910 59 20 72 61 6e 6b 20 44 45 53 43 20 0a 20 20 20  Y rank DESC .   
17920 20 20 20 4c 49 4d 49 54 20 31 30 20 4f 46 46 53     LIMIT 10 OFFS
17930 45 54 20 30 0a 20 20 29 20 41 53 20 72 61 6e 6b  ET 0.  ) AS rank
17940 74 61 62 6c 65 20 55 53 49 4e 47 28 64 6f 63 69  table USING(doci
17950 64 29 0a 20 20 57 48 45 52 45 20 64 6f 63 75 6d  d).  WHERE docum
17960 65 6e 74 73 20 4d 41 54 43 48 20 26 6c 74 3b 71  ents MATCH &lt;q
17970 75 65 72 79 26 67 74 3b 0a 20 20 4f 52 44 45 52  uery&gt;.  ORDER
17980 20 42 59 20 72 61 6e 6b 74 61 62 6c 65 2e 72 61   BY ranktable.ra
17990 6e 6b 20 44 45 53 43 0a 3c 2f 63 6f 64 65 62 6c  nk DESC.</codebl
179a0 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 41 6c 6c 20  ock>..<p>.  All 
179b0 74 68 65 20 65 78 61 6d 70 6c 65 20 71 75 65 72  the example quer
179c0 69 65 73 20 61 62 6f 76 65 20 72 65 74 75 72 6e  ies above return
179d0 20 74 68 65 20 74 65 6e 20 6d 6f 73 74 20 72 65   the ten most re
179e0 6c 65 76 61 6e 74 20 71 75 65 72 79 20 72 65 73  levant query res
179f0 75 6c 74 73 2e 0a 20 20 42 79 20 6d 6f 64 69 66  ults..  By modif
17a00 79 69 6e 67 20 74 68 65 20 76 61 6c 75 65 73 20  ying the values 
17a10 75 73 65 64 20 77 69 74 68 20 74 68 65 20 4f 46  used with the OF
17a20 46 53 45 54 20 61 6e 64 20 4c 49 4d 49 54 20 63  FSET and LIMIT c
17a30 6c 61 75 73 65 73 2c 20 61 20 71 75 65 72 79 20  lauses, a query 
17a40 0a 20 20 74 6f 20 72 65 74 75 72 6e 20 28 73 61  .  to return (sa
17a50 79 29 20 74 68 65 20 6e 65 78 74 20 74 65 6e 20  y) the next ten 
17a60 6d 6f 73 74 20 72 65 6c 65 76 61 6e 74 20 72 65  most relevant re
17a70 73 75 6c 74 73 20 69 73 20 65 61 73 79 20 74 6f  sults is easy to
17a80 20 63 6f 6e 73 74 72 75 63 74 2e 20 0a 20 20 54   construct. .  T
17a90 68 69 73 20 6d 61 79 20 62 65 20 75 73 65 64 20  his may be used 
17aa0 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 64 61  to obtain the da
17ab0 74 61 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  ta required for 
17ac0 61 20 73 65 61 72 63 68 20 61 70 70 6c 69 63 61  a search applica
17ad0 74 69 6f 6e 73 20 73 65 63 6f 6e 64 0a 20 20 61  tions second.  a
17ae0 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 70 61  nd subsequent pa
17af0 67 65 73 20 6f 66 20 72 65 73 75 6c 74 73 2e 0a  ges of results..
17b00 0a 3c 70 3e 0a 20 20 54 68 65 20 6e 65 78 74 20  .<p>.  The next 
17b10 62 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 61  block contains a
17b20 6e 20 65 78 61 6d 70 6c 65 20 72 61 6e 6b 20 66  n example rank f
17b30 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 75 73 65  unction that use
17b40 73 20 6d 61 74 63 68 69 6e 66 6f 20 64 61 74 61  s matchinfo data
17b50 20 0a 20 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   .  implemented 
17b60 69 6e 20 43 2e 20 49 6e 73 74 65 61 64 20 6f 66  in C. Instead of
17b70 20 61 20 73 69 6e 67 6c 65 20 77 65 69 67 68 74   a single weight
17b80 2c 20 69 74 20 61 6c 6c 6f 77 73 20 61 20 77 65  , it allows a we
17b90 69 67 68 74 20 74 6f 20 62 65 20 0a 20 20 65 78  ight to be .  ex
17ba0 74 65 72 6e 61 6c 6c 79 20 61 73 73 69 67 6e 65  ternally assigne
17bb0 64 20 74 6f 20 65 61 63 68 20 63 6f 6c 75 6d 6e  d to each column
17bc0 20 6f 66 20 65 61 63 68 20 64 6f 63 75 6d 65 6e   of each documen
17bd0 74 2e 20 49 74 20 6d 61 79 20 62 65 20 72 65 67  t. It may be reg
17be0 69 73 74 65 72 65 64 0a 20 20 77 69 74 68 20 53  istered.  with S
17bf0 51 4c 69 74 65 20 6c 69 6b 65 20 61 6e 79 20 6f  QLite like any o
17c00 74 68 65 72 20 75 73 65 72 20 66 75 6e 63 74 69  ther user functi
17c10 6f 6e 20 75 73 69 6e 67 20 5b 73 71 6c 69 74 65  on using [sqlite
17c20 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
17c30 6e 5d 2e 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e  n]...<codeblock>
17c40 0a 3c 69 3e 2f 2a 3c 2f 69 3e 0a 3c 69 3e 2a 2a  .<i>/*</i>.<i>**
17c50 20 53 51 4c 69 74 65 20 75 73 65 72 20 64 65 66   SQLite user def
17c60 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 20 74 6f  ined function to
17c70 20 75 73 65 20 77 69 74 68 20 6d 61 74 63 68 69   use with matchi
17c80 6e 66 6f 28 29 20 74 6f 20 63 61 6c 63 75 6c 61  nfo() to calcula
17c90 74 65 20 74 68 65 3c 2f 69 3e 0a 3c 69 3e 2a 2a  te the</i>.<i>**
17ca0 20 72 65 6c 65 76 61 6e 63 79 20 6f 66 20 61 6e   relevancy of an
17cb0 20 46 54 53 20 6d 61 74 63 68 2e 20 54 68 65 20   FTS match. The 
17cc0 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
17cd0 73 20 74 68 65 20 72 65 6c 65 76 61 6e 63 79 20  s the relevancy 
17ce0 73 63 6f 72 65 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20  score</i>.<i>** 
17cf0 28 61 20 72 65 61 6c 20 76 61 6c 75 65 20 67 72  (a real value gr
17d00 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
17d10 75 61 6c 20 74 6f 20 7a 65 72 6f 29 2e 20 41 20  ual to zero). A 
17d20 6c 61 72 67 65 72 20 76 61 6c 75 65 20 69 6e 64  larger value ind
17d30 69 63 61 74 65 73 20 3c 2f 69 3e 0a 3c 69 3e 2a  icates </i>.<i>*
17d40 2a 20 61 20 6d 6f 72 65 20 72 65 6c 65 76 61 6e  * a more relevan
17d50 74 20 64 6f 63 75 6d 65 6e 74 2e 3c 2f 69 3e 0a  t document.</i>.
17d60 3c 69 3e 2a 2a 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20  <i>**</i>.<i>** 
17d70 54 68 65 20 6f 76 65 72 61 6c 6c 20 72 65 6c 65  The overall rele
17d80 76 61 6e 63 79 20 72 65 74 75 72 6e 65 64 20 69  vancy returned i
17d90 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  s the sum of the
17da0 20 72 65 6c 65 76 61 6e 63 69 65 73 20 6f 66 20   relevancies of 
17db0 65 61 63 68 20 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20  each </i>.<i>** 
17dc0 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20  column value in 
17dd0 74 68 65 20 46 54 53 20 74 61 62 6c 65 2e 20 54  the FTS table. T
17de0 68 65 20 72 65 6c 65 76 61 6e 63 79 20 6f 66 20  he relevancy of 
17df0 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69  a column value i
17e00 73 20 74 68 65 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20  s the</i>.<i>** 
17e10 73 75 6d 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  sum of the follo
17e20 77 69 6e 67 20 66 6f 72 20 65 61 63 68 20 72 65  wing for each re
17e30 70 6f 72 74 61 62 6c 65 20 70 68 72 61 73 65 20  portable phrase 
17e40 69 6e 20 74 68 65 20 46 54 53 20 71 75 65 72 79  in the FTS query
17e50 3a 3c 2f 69 3e 0a 3c 69 3e 2a 2a 3c 2f 69 3e 0a  :</i>.<i>**</i>.
17e60 3c 69 3e 2a 2a 20 20 20 28 26 6c 74 3b 68 69 74  <i>**   (&lt;hit
17e70 20 63 6f 75 6e 74 26 67 74 3b 20 2f 20 26 6c 74   count&gt; / &lt
17e80 3b 67 6c 6f 62 61 6c 20 68 69 74 20 63 6f 75 6e  ;global hit coun
17e90 74 26 67 74 29 20 2a 20 26 6c 74 3b 63 6f 6c 75  t&gt) * &lt;colu
17ea0 6d 6e 20 77 65 69 67 68 74 26 67 74 3b 3c 2f 69  mn weight&gt;</i
17eb0 3e 0a 3c 69 3e 2a 2a 3c 2f 69 3e 0a 3c 69 3e 2a  >.<i>**</i>.<i>*
17ec0 2a 20 77 68 65 72 65 20 26 6c 74 3b 68 69 74 20  * where &lt;hit 
17ed0 63 6f 75 6e 74 26 67 74 3b 20 69 73 20 74 68 65  count&gt; is the
17ee0 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 73 74 61   number of insta
17ef0 6e 63 65 73 20 6f 66 20 74 68 65 20 70 68 72 61  nces of the phra
17f00 73 65 20 69 6e 20 74 68 65 3c 2f 69 3e 0a 3c 69  se in the</i>.<i
17f10 3e 2a 2a 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  >** column value
17f20 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
17f30 72 6f 77 20 61 6e 64 20 26 6c 74 3b 67 6c 6f 62  row and &lt;glob
17f40 61 6c 20 68 69 74 20 63 6f 75 6e 74 26 67 74 3b  al hit count&gt;
17f50 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 3c 2f   is the number</
17f60 69 3e 0a 3c 69 3e 2a 2a 20 6f 66 20 69 6e 73 74  i>.<i>** of inst
17f70 61 6e 63 65 73 20 6f 66 20 74 68 65 20 70 68 72  ances of the phr
17f80 61 73 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ase in the same 
17f90 63 6f 6c 75 6d 6e 20 6f 66 20 61 6c 6c 20 72 6f  column of all ro
17fa0 77 73 20 69 6e 20 74 68 65 20 46 54 53 3c 2f 69  ws in the FTS</i
17fb0 3e 0a 3c 69 3e 2a 2a 20 74 61 62 6c 65 2e 20 54  >.<i>** table. T
17fc0 68 65 20 26 6c 74 3b 63 6f 6c 75 6d 6e 20 77 65  he &lt;column we
17fd0 69 67 68 74 26 67 74 3b 20 69 73 20 61 20 77 65  ight&gt; is a we
17fe0 69 67 68 74 69 6e 67 20 66 61 63 74 6f 72 20 61  ighting factor a
17ff0 73 73 69 67 6e 65 64 20 74 6f 20 65 61 63 68 3c  ssigned to each<
18000 2f 69 3e 0a 3c 69 3e 2a 2a 20 63 6f 6c 75 6d 6e  /i>.<i>** column
18010 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 28   by the caller (
18020 73 65 65 20 62 65 6c 6f 77 29 2e 3c 2f 69 3e 0a  see below).</i>.
18030 3c 69 3e 2a 2a 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20  <i>**</i>.<i>** 
18040 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
18050 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
18060 69 6f 6e 20 6d 75 73 74 20 62 65 20 74 68 65 20  ion must be the 
18070 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
18080 74 68 65 20 46 54 53 20 3c 2f 69 3e 0a 3c 69 3e  the FTS </i>.<i>
18090 2a 2a 20 6d 61 74 63 68 69 6e 66 6f 28 29 20 66  ** matchinfo() f
180a0 75 6e 63 74 69 6f 6e 2e 20 46 6f 6c 6c 6f 77 69  unction. Followi
180b0 6e 67 20 74 68 69 73 20 6d 75 73 74 20 62 65 20  ng this must be 
180c0 6f 6e 65 20 61 72 67 75 6d 65 6e 74 20 66 6f 72  one argument for
180d0 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 3c 2f 69   each column </i
180e0 3e 0a 3c 69 3e 2a 2a 20 6f 66 20 74 68 65 20 46  >.<i>** of the F
180f0 54 53 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e  TS table contain
18100 69 6e 67 20 61 20 6e 75 6d 65 72 69 63 20 77 65  ing a numeric we
18110 69 67 68 74 20 66 61 63 74 6f 72 20 66 6f 72 20  ight factor for 
18120 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
18130 67 20 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 63 6f 6c  g </i>.<i>** col
18140 75 6d 6e 2e 20 45 78 61 6d 70 6c 65 3a 3c 2f 69  umn. Example:</i
18150 3e 0a 3c 69 3e 2a 2a 3c 2f 69 3e 0a 3c 69 3e 2a  >.<i>**</i>.<i>*
18160 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49 52  *     CREATE VIR
18170 54 55 41 4c 20 54 41 42 4c 45 20 64 6f 63 75 6d  TUAL TABLE docum
18180 65 6e 74 73 20 55 53 49 4e 47 20 66 74 73 33 28  ents USING fts3(
18190 74 69 74 6c 65 2c 20 63 6f 6e 74 65 6e 74 29 3c  title, content)<
181a0 2f 69 3e 0a 3c 69 3e 2a 2a 3c 2f 69 3e 0a 3c 69  /i>.<i>**</i>.<i
181b0 3e 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  >** The followin
181c0 67 20 71 75 65 72 79 20 72 65 74 75 72 6e 73 20  g query returns 
181d0 74 68 65 20 64 6f 63 69 64 73 20 6f 66 20 64 6f  the docids of do
181e0 63 75 6d 65 6e 74 73 20 74 68 61 74 20 6d 61 74  cuments that mat
181f0 63 68 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74  ch the full-text
18200 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 71 75 65 72 79  </i>.<i>** query
18210 20 26 6c 74 3b 71 75 65 72 79 26 67 74 3b 20 73   &lt;query&gt; s
18220 6f 72 74 65 64 20 66 72 6f 6d 20 6d 6f 73 74 20  orted from most 
18230 74 6f 20 6c 65 61 73 74 20 72 65 6c 65 76 61 6e  to least relevan
18240 74 2e 20 57 68 65 6e 20 63 61 6c 63 75 6c 61 74  t. When calculat
18250 69 6e 67 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 72 65  ing</i>.<i>** re
18260 6c 65 76 61 6e 63 65 2c 20 71 75 65 72 79 20 74  levance, query t
18270 65 72 6d 20 69 6e 73 74 61 6e 63 65 73 20 69 6e  erm instances in
18280 20 74 68 65 20 27 74 69 74 6c 65 27 20 63 6f 6c   the 'title' col
18290 75 6d 6e 20 61 72 65 20 67 69 76 65 6e 20 74 77  umn are given tw
182a0 69 63 65 20 74 68 65 3c 2f 69 3e 0a 3c 69 3e 2a  ice the</i>.<i>*
182b0 2a 20 77 65 69 67 68 74 69 6e 67 20 6f 66 20 74  * weighting of t
182c0 68 6f 73 65 20 69 6e 20 74 68 65 20 27 63 6f 6e  hose in the 'con
182d0 74 65 6e 74 27 20 63 6f 6c 75 6d 6e 2e 3c 2f 69  tent' column.</i
182e0 3e 0a 3c 69 3e 2a 2a 3c 2f 69 3e 0a 3c 69 3e 2a  >.<i>**</i>.<i>*
182f0 2a 20 20 20 20 20 53 45 4c 45 43 54 20 64 6f 63  *     SELECT doc
18300 69 64 20 46 52 4f 4d 20 64 6f 63 75 6d 65 6e 74  id FROM document
18310 73 20 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 20 20 20  s </i>.<i>**    
18320 20 57 48 45 52 45 20 64 6f 63 75 6d 65 6e 74 73   WHERE documents
18330 20 4d 41 54 43 48 20 26 6c 74 3b 71 75 65 72 79   MATCH &lt;query
18340 26 67 74 3b 20 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20  &gt; </i>.<i>** 
18350 20 20 20 20 4f 52 44 45 52 20 42 59 20 72 61 6e      ORDER BY ran
18360 6b 28 6d 61 74 63 68 69 6e 66 6f 28 64 6f 63 75  k(matchinfo(docu
18370 6d 65 6e 74 73 29 2c 20 31 2e 30 2c 20 30 2e 35  ments), 1.0, 0.5
18380 29 20 44 45 53 43 3c 2f 69 3e 0a 3c 69 3e 2a 2f  ) DESC</i>.<i>*/
18390 3c 2f 69 3e 0a 73 74 61 74 69 63 20 76 6f 69 64  </i>.static void
183a0 20 72 61 6e 6b 66 75 6e 63 28 73 71 6c 69 74 65   rankfunc(sqlite
183b0 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
183c0 20 69 6e 74 20 6e 56 61 6c 2c 20 73 71 6c 69 74   int nVal, sqlit
183d0 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c  e3_value **apVal
183e0 29 7b 0a 20 20 69 6e 74 20 2a 61 4d 61 74 63 68  ){.  int *aMatch
183f0 69 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20  info;           
18400 20 20 20 20 20 3c 69 3e 2f 2a 20 52 65 74 75 72       <i>/* Retur
18410 6e 20 76 61 6c 75 65 20 6f 66 20 6d 61 74 63 68  n value of match
18420 69 6e 66 6f 28 29 20 2a 2f 3c 2f 69 3e 0a 20 20  info() */</i>.  
18430 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20  int nCol;       
18440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18450 3c 69 3e 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  <i>/* Number of 
18460 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74  columns in the t
18470 61 62 6c 65 20 2a 2f 3c 2f 69 3e 0a 20 20 69 6e  able */</i>.  in
18480 74 20 6e 50 68 72 61 73 65 3b 20 20 20 20 20 20  t nPhrase;      
18490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3c 69                <i
184a0 3e 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 68  >/* Number of ph
184b0 72 61 73 65 73 20 69 6e 20 74 68 65 20 71 75 65  rases in the que
184c0 72 79 20 2a 2f 3c 2f 69 3e 0a 20 20 69 6e 74 20  ry */</i>.  int 
184d0 69 50 68 72 61 73 65 3b 20 20 20 20 20 20 20 20  iPhrase;        
184e0 20 20 20 20 20 20 20 20 20 20 20 20 3c 69 3e 2f              <i>/
184f0 2a 20 43 75 72 72 65 6e 74 20 70 68 72 61 73 65  * Current phrase
18500 20 2a 2f 3c 2f 69 3e 0a 20 20 64 6f 75 62 6c 65   */</i>.  double
18510 20 73 63 6f 72 65 20 3d 20 30 2e 30 3b 20 20 20   score = 0.0;   
18520 20 20 20 20 20 20 20 20 20 20 3c 69 3e 2f 2a 20            <i>/* 
18530 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  Value to return 
18540 2a 2f 3c 2f 69 3e 0a 0a 20 20 61 73 73 65 72 74  */</i>..  assert
18550 28 20 73 69 7a 65 6f 66 28 69 6e 74 29 3d 3d 34  ( sizeof(int)==4
18560 20 29 3b 0a 0a 3c 69 3e 20 20 2f 2a 20 43 68 65   );..<i>  /* Che
18570 63 6b 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62  ck that the numb
18580 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
18590 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
185a0 75 6e 63 74 69 6f 6e 20 69 73 20 63 6f 72 72 65  unction is corre
185b0 63 74 2e 3c 2f 69 3e 0a 3c 69 3e 20 20 2a 2a 20  ct.</i>.<i>  ** 
185c0 49 66 20 6e 6f 74 2c 20 6a 75 6d 70 20 74 6f 20  If not, jump to 
185d0 77 72 6f 6e 67 5f 6e 75 6d 62 65 72 5f 61 72 67  wrong_number_arg
185e0 73 2e 20 53 65 74 20 61 4d 61 74 63 68 69 6e 66  s. Set aMatchinf
185f0 6f 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  o to point to th
18600 65 20 61 72 72 61 79 3c 2f 69 3e 0a 3c 69 3e 20  e array</i>.<i> 
18610 20 2a 2a 20 6f 66 20 75 6e 73 69 67 6e 65 64 20   ** of unsigned 
18620 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20 72  integer values r
18630 65 74 75 72 6e 65 64 20 62 79 20 46 54 53 20 66  eturned by FTS f
18640 75 6e 63 74 69 6f 6e 20 6d 61 74 63 68 69 6e 66  unction matchinf
18650 6f 2e 20 53 65 74 3c 2f 69 3e 0a 3c 69 3e 20 20  o. Set</i>.<i>  
18660 2a 2a 20 6e 50 68 72 61 73 65 20 74 6f 20 63 6f  ** nPhrase to co
18670 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72  ntain the number
18680 20 6f 66 20 72 65 70 6f 72 74 61 62 6c 65 20 70   of reportable p
18690 68 72 61 73 65 73 20 69 6e 20 74 68 65 20 75 73  hrases in the us
186a0 65 72 73 20 66 75 6c 6c 2d 74 65 78 74 3c 2f 69  ers full-text</i
186b0 3e 0a 3c 69 3e 20 20 2a 2a 20 71 75 65 72 79 2c  >.<i>  ** query,
186c0 20 61 6e 64 20 6e 43 6f 6c 20 74 6f 20 74 68 65   and nCol to the
186d0 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
186e0 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ns in the table.
186f0 3c 2f 69 3e 0a 3c 69 3e 20 20 2a 2f 3c 2f 69 3e  </i>.<i>  */</i>
18700 0a 20 20 69 66 28 20 6e 56 61 6c 26 6c 74 3b 31  .  if( nVal&lt;1
18710 20 29 20 67 6f 74 6f 20 77 72 6f 6e 67 5f 6e 75   ) goto wrong_nu
18720 6d 62 65 72 5f 61 72 67 73 3b 0a 20 20 61 4d 61  mber_args;.  aMa
18730 74 63 68 69 6e 66 6f 20 3d 20 28 75 6e 73 69 67  tchinfo = (unsig
18740 6e 65 64 20 69 6e 74 20 2a 29 73 71 6c 69 74 65  ned int *)sqlite
18750 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 70 56  3_value_blob(apV
18760 61 6c 26 23 78 35 42 3b 30 26 23 78 35 44 3b 29  al&#x5B;0&#x5D;)
18770 3b 0a 20 20 6e 50 68 72 61 73 65 20 3d 20 61 4d  ;.  nPhrase = aM
18780 61 74 63 68 69 6e 66 6f 26 23 78 35 42 3b 30 26  atchinfo&#x5B;0&
18790 23 78 35 44 3b 3b 0a 20 20 6e 43 6f 6c 20 3d 20  #x5D;;.  nCol = 
187a0 61 4d 61 74 63 68 69 6e 66 6f 26 23 78 35 42 3b  aMatchinfo&#x5B;
187b0 31 26 23 78 35 44 3b 3b 0a 20 20 69 66 28 20 6e  1&#x5D;;.  if( n
187c0 56 61 6c 21 3d 28 31 2b 6e 43 6f 6c 29 20 29 20  Val!=(1+nCol) ) 
187d0 67 6f 74 6f 20 77 72 6f 6e 67 5f 6e 75 6d 62 65  goto wrong_numbe
187e0 72 5f 61 72 67 73 3b 0a 0a 3c 69 3e 20 20 2f 2a  r_args;..<i>  /*
187f0 20 49 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   Iterate through
18800 20 65 61 63 68 20 70 68 72 61 73 65 20 69 6e 20   each phrase in 
18810 74 68 65 20 75 73 65 72 73 20 71 75 65 72 79 2e  the users query.
18820 20 2a 2f 3c 2f 69 3e 0a 20 20 66 6f 72 28 69 50   */</i>.  for(iP
18830 68 72 61 73 65 3d 30 3b 20 69 50 68 72 61 73 65  hrase=0; iPhrase
18840 26 6c 74 3b 6e 50 68 72 61 73 65 3b 20 69 50 68  &lt;nPhrase; iPh
18850 72 61 73 65 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  rase++){.    int
18860 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   iCol;          
18870 20 20 20 20 20 20 20 20 20 20 20 3c 69 3e 2f 2a             <i>/*
18880 20 43 75 72 72 65 6e 74 20 63 6f 6c 75 6d 6e 20   Current column 
18890 2a 2f 3c 2f 69 3e 0a 0a 3c 69 3e 20 20 20 20 2f  */</i>..<i>    /
188a0 2a 20 4e 6f 77 20 69 74 65 72 61 74 65 20 74 68  * Now iterate th
188b0 72 6f 75 67 68 20 65 61 63 68 20 63 6f 6c 75 6d  rough each colum
188c0 6e 20 69 6e 20 74 68 65 20 75 73 65 72 73 20 71  n in the users q
188d0 75 65 72 79 2e 20 46 6f 72 20 65 61 63 68 20 63  uery. For each c
188e0 6f 6c 75 6d 6e 2c 3c 2f 69 3e 0a 3c 69 3e 20 20  olumn,</i>.<i>  
188f0 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 20 74    ** increment t
18900 68 65 20 72 65 6c 65 76 61 6e 63 79 20 73 63 6f  he relevancy sco
18910 72 65 20 62 79 3a 3c 2f 69 3e 0a 3c 69 3e 20 20  re by:</i>.<i>  
18920 20 20 2a 2a 3c 2f 69 3e 0a 3c 69 3e 20 20 20 20    **</i>.<i>    
18930 2a 2a 20 20 20 28 26 6c 74 3b 68 69 74 20 63 6f  **   (&lt;hit co
18940 75 6e 74 26 67 74 3b 20 2f 20 26 6c 74 3b 67 6c  unt&gt; / &lt;gl
18950 6f 62 61 6c 20 68 69 74 20 63 6f 75 6e 74 26 67  obal hit count&g
18960 74 29 20 2a 20 26 6c 74 3b 63 6f 6c 75 6d 6e 20  t) * &lt;column 
18970 77 65 69 67 68 74 26 67 74 3b 3c 2f 69 3e 0a 3c  weight&gt;</i>.<
18980 69 3e 20 20 20 20 2a 2a 3c 2f 69 3e 0a 3c 69 3e  i>    **</i>.<i>
18990 20 20 20 20 2a 2a 20 61 50 68 72 61 73 65 69 6e      ** aPhrasein
189a0 66 6f 26 23 78 35 42 3b 26 23 78 35 44 3b 20 70  fo&#x5B;&#x5D; p
189b0 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 73 74 61  oints to the sta
189c0 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 66  rt of the data f
189d0 6f 72 20 70 68 72 61 73 65 20 69 50 68 72 61 73  or phrase iPhras
189e0 65 2e 20 53 6f 3c 2f 69 3e 0a 3c 69 3e 20 20 20  e. So</i>.<i>   
189f0 20 2a 2a 20 74 68 65 20 68 69 74 20 63 6f 75 6e   ** the hit coun
18a00 74 20 61 6e 64 20 67 6c 6f 62 61 6c 20 68 69 74  t and global hit
18a10 20 63 6f 75 6e 74 73 20 66 6f 72 20 65 61 63 68   counts for each
18a20 20 63 6f 6c 75 6d 6e 20 61 72 65 20 66 6f 75 6e   column are foun
18a30 64 20 69 6e 20 3c 2f 69 3e 0a 3c 69 3e 20 20 20  d in </i>.<i>   
18a40 20 2a 2a 20 61 50 68 72 61 73 65 69 6e 66 6f 26   ** aPhraseinfo&
18a50 23 78 35 42 3b 69 43 6f 6c 2a 33 26 23 78 35 44  #x5B;iCol*3&#x5D
18a60 3b 20 61 6e 64 20 61 50 68 72 61 73 65 69 6e 66  ; and aPhraseinf
18a70 6f 26 23 78 35 42 3b 69 43 6f 6c 2a 33 2b 31 26  o&#x5B;iCol*3+1&
18a80 23 78 35 44 3b 2c 20 72 65 73 70 65 63 74 69 76  #x5D;, respectiv
18a90 65 6c 79 2e 3c 2f 69 3e 0a 3c 69 3e 20 20 20 20  ely.</i>.<i>    
18aa0 2a 2f 3c 2f 69 3e 0a 20 20 20 20 69 6e 74 20 2a  */</i>.    int *
18ab0 61 50 68 72 61 73 65 69 6e 66 6f 20 3d 20 26 61  aPhraseinfo = &a
18ac0 4d 61 74 63 68 69 6e 66 6f 26 23 78 35 42 3b 32  Matchinfo&#x5B;2
18ad0 20 2b 20 69 50 68 72 61 73 65 2a 6e 43 6f 6c 2a   + iPhrase*nCol*
18ae0 33 26 23 78 35 44 3b 3b 0a 20 20 20 20 66 6f 72  3&#x5D;;.    for
18af0 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 26 6c 74  (iCol=0; iCol&lt
18b00 3b 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a  ;nCol; iCol++){.
18b10 20 20 20 20 20 20 69 6e 74 20 6e 48 69 74 43 6f        int nHitCo
18b20 75 6e 74 20 3d 20 61 50 68 72 61 73 65 69 6e 66  unt = aPhraseinf
18b30 6f 26 23 78 35 42 3b 33 2a 69 43 6f 6c 26 23 78  o&#x5B;3*iCol&#x
18b40 35 44 3b 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  5D;;.      int n
18b50 47 6c 6f 62 61 6c 48 69 74 43 6f 75 6e 74 20 3d  GlobalHitCount =
18b60 20 61 50 68 72 61 73 65 69 6e 66 6f 26 23 78 35   aPhraseinfo&#x5
18b70 42 3b 33 2a 69 43 6f 6c 2b 31 26 23 78 35 44 3b  B;3*iCol+1&#x5D;
18b80 3b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20 77  ;.      double w
18b90 65 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 5f  eight = sqlite3_
18ba0 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 70 56  value_double(apV
18bb0 61 6c 26 23 78 35 42 3b 69 43 6f 6c 2b 31 26 23  al&#x5B;iCol+1&#
18bc0 78 35 44 3b 29 3b 0a 20 20 20 20 20 20 69 66 28  x5D;);.      if(
18bd0 20 6e 48 69 74 43 6f 75 6e 74 3e 30 20 29 7b 0a   nHitCount>0 ){.
18be0 20 20 20 20 20 20 20 20 73 63 6f 72 65 20 2b 3d          score +=
18bf0 20 28 28 64 6f 75 62 6c 65 29 6e 48 69 74 43 6f   ((double)nHitCo
18c00 75 6e 74 20 2f 20 28 64 6f 75 62 6c 65 29 6e 47  unt / (double)nG
18c10 6c 6f 62 61 6c 48 69 74 43 6f 75 6e 74 29 20 2a  lobalHitCount) *
18c20 20 77 65 69 67 68 74 3b 0a 20 20 20 20 20 20 7d   weight;.      }
18c30 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71  .    }.  }..  sq
18c40 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75  lite3_result_dou
18c50 62 6c 65 28 70 43 74 78 2c 20 73 63 6f 72 65 29  ble(pCtx, score)
18c60 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 0a 3c 69 3e  ;.  return;..<i>
18c70 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
18c80 66 20 74 68 65 20 77 72 6f 6e 67 20 6e 75 6d 62  f the wrong numb
18c90 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
18ca0 61 72 65 20 70 61 73 73 65 64 20 74 6f 20 74 68  are passed to th
18cb0 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 3c 2f  is function */</
18cc0 69 3e 0a 77 72 6f 6e 67 5f 6e 75 6d 62 65 72 5f  i>.wrong_number_
18cd0 61 72 67 73 3a 0a 20 20 73 71 6c 69 74 65 33 5f  args:.  sqlite3_
18ce0 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74  result_error(pCt
18cf0 78 2c 20 22 77 72 6f 6e 67 20 6e 75 6d 62 65 72  x, "wrong number
18d00 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f   of arguments to
18d10 20 66 75 6e 63 74 69 6f 6e 20 72 61 6e 6b 28 29   function rank()
18d20 22 2c 20 2d 31 29 3b 0a 7d 0a 3c 2f 63 6f 64 65  ", -1);.}.</code
18d30 62 6c 6f 63 6b 3e 0a                             block>.