> On 13 May 2016, at 16:04, Dan Kennedy <danielk1977 at gmail.com> wrote: > > On 05/13/2016 09:19 PM, Matt Hamilton wrote: >> Hi all, >> Anyone know if/how you can call the FTS5 tokeniser functions manually? e.g. >> I want to look something up in the fts5vocab table but can't as I need to >> split/stem the initial value first before querying the table? >> >> To illustrate: >> >> sqlite> CREATE VIRTUAL TABLE ft1 USING fts5(x, tokenize = porter); >> sqlite> INSERT INTO ft1 VALUES('running man'); >> sqlite> CREATE VIRTUAL TABLE ft1_v_row USING fts5vocab(ft1, row); >> sqlite> SELECT * FROM ft1_v_row; >> man|1|1 >> run|1|1 >> sqlite> SELECT count(*) FROM ft1_v_row WHERE term = 'running'; >> 0 >> sqlite> >> >> How can I somehow map 'running' => 'run' in order to query the fts5vocab >> table to get stats on that term? And how could I tokenise 'running man' => >> 'run', 'man' in order to look up multiple tokens? > > I think the only way to do that at the moment is from C code using the API in > fts5.h: > > https://www.sqlite.org/fts5.html#section_7 > > Use xFindTokenizer() to grab a handle for the desired tokenizer module, then > xCreate to create an instance and xTokenize to tokenize text. > > There is example code in the fts5_test_tok.c file: > > http://sqlite.org/src/artifact/db08af63673c3a7d > > The example code creates a virtual table module that looks useful enough: > > CREATE VIRTUAL TABLE ttt USING fts5tokenize('porter'); > > then: > > SELECT * FROM ft1_v_row WHERE term IN (SELECT token FROM ttt('running man')); > > should probably work. More information in fts5_test_tok.c.
Dan, Great, thanks for the help and pointers. I'm having trouble though working out how to actually register/initialise/use a custom fts5 function. e.g. I have: /* Add your header comment here */ #include <sqlite3ext.h> /* Do not use <sqlite3.h>! */ SQLITE_EXTENSION_INIT1 #include <stdlib.h> static void column_size_imp( const Fts5ExtensionApi *pApi, Fts5Context *pFts, sqlite3_context *pCtx, int nVal, sqlite3_value **apVal ){ int rc; int nToken; rc = pApi->xColumnSize(pFts, -1, &nToken); if( rc==SQLITE_OK ){ sqlite3_result_int(pCtx, nToken); }else{ sqlite3_result_error_code(pCtx, rc); } } int sqlite3Fts5AuxInit(fts5_api *pApi){ return pApi->xCreateFunction(pApi, "colsize", 0, column_size_imp, 0); } Then I compile it on OS X with: gcc -g -fPIC -dynamiclib aux_func.c -o aux_func.dylib -I/opt/local/include Then try and load the extension module: sqlite> .load aux_func and use it: sqlite> select colsize(ft) from ft where ft match 'apple'; Error: no such function: colsize What am I missing here? Am I registering it wrong? -Matt ? Matt Hamilton Quernus matt at quernus.co.uk +44 117 325 3025 64 Easton Business Centre Felix Road, Easton Bristol, BS5 0HE Quernus Ltd is a company registered in England and Wales. Registered number: 09076246 ? Matt Hamilton Quernus matt at quernus.co.uk +44 117 325 3025 64 Easton Business Centre Felix Road, Easton Bristol, BS5 0HE Quernus Ltd is a company registered in England and Wales. Registered number: 09076246