With our framework, it's very easy to create such a table.
The dedicated TSQLRecordFTS3 class enables you to define a FTS3 table, just as easy as for any other table, in pure ORM approach (you don't need to write dedicated SQL statements: the ORM will adapt itself to the FTS3 table, and create the corresponding SQL code for you).
Here are some tips for using this class:
- any record which inherits from this class must have only sftUTF8Text
(RawUTF8) fields
- this record has its fID: integer property which may be published as
DocID, to be consistent with SQLite3 praxis, and reflect that it
points to an ID of another associated TSQLRecord
- a good approach is to store your data in a regular TSQLRecord table,
then store your text content in a separated FTS3 table, associated to this
TSQLRecord table via its ID/DocID
- the ID/DocID property can be set when the record is added (i.e. the
ID field is used when the TSQLRest.Add method is called with
a TSQLRecordFTS3 instance), to retrieve any associated
TSQLRecord (note that for a TSQLRecord record, the ID
property can't be set at adding, but is calculated by the engine)
- static tables don't handle TSQLRecordFTS3 classes
- by default, the FTS3 engine ignore all characters >= #80, but handle
low-level case insentivity (i.e. 'A'..'Z') so you must keep your request with
the same range for upper case
- by default, the "simple" tokenizer is used, but you can inherits from
TSQLRecordFTS3Porter class if you want a better English matching,
using the Porter Stemming
algorithm
- in order to make FTS3 queries, use the dedicated TSQLRest.FTS3Match
method, with the MATCH operator (you can use regular queries, but you must
specify 'RowID' instead of 'DocID' or 'ID' because of FTS3 Virtual table
specificity):
var IDs: TIntegerDynArray; if FTS3Match(TSQLMyFTS3Table,'text MATCH "linu*"',IDs) then // you've all matching IDs in IDs[]
Here is an example of such a FTS3 table:
type TFTS3Test = class(TSQLRecordFTS3) private fSubject: RawUTF8; fBody: RawUTF8; published property Subject: RawUTF8 read fSubject write fSubject; property Body: RawUTF8 read fBody write fBody; property DocID: integer read fID write fID; end;
See the TestFTS3 procedure in the SQlite3.pas unit, for an example of how such a record can be handled.
Feedback and comments are welcome on our forum.