1 Text search functions
The following functions provide access to text seach facilities on current database
Return | Function | Description |
---|---|---|
boolean | hasTextSearch() | Returns if database has text search extensions |
String | getBasicTextSearch(String colname, Stirng text) | Returns the basic text search statement for the engine. It does not check if column has text search eanbled. |
String | getFuzzyTextSearch(String colname, Stirng text) | Returns the fuzzy (approximate) text search statement. It does not check if column has text search eanbled. |
String | getBestTextSearch(String tabname, String colname, String text, boolean fuzzy) | Returns the best text search possible for the column. This can be a specific text search statement if database has a text search module or a simple LIKE if no TS module is available. |
In the following example we have the Informix stores_demo database with BTS installed.
As there is no BTS index created, the getBestTextSearch
will return LIKE instead
of the BTS functions.
Ax.db.execute('DROP TABLE IF EXISTS customer'); Ax.db.execute(`CREATE TABLE customer (fname CHAR(20), lname CHAR(20), PRIMARY KEY(fname) );`); Ax.db.execute('INSERT INTO customer (fname, lname) VALUES ("john", "smith")'); console.log(Ax.db.hasTextSearch()); console.log(Ax.db.getBasicTextSearch("lname", "smith")); console.log(Ax.db.getFuzzyTextSearch("lname", "smith")); console.log(Ax.db.getBestTextSearch("customer", "lname", "smith", false)); Ax.db.execute('DROP TABLE customer');
true
bts_contains(lname, 'smith')
bts_contains(lname, 'smith~')
UPPER(lname) LIKE UPPER('%smith%') ---- There is NO text search index on the column
2 Creating a BTS Index
Let's see how to use a BTS index. In the example we will use the customer
table.
A simple SQL quuery will show.
select lname, lname,company from customer
lname lname company
Ludwig Pauli All Sports Supplies
Carole Sadler Sports Spot
Philip Currie Phil's Sports
Anthony Higgins Play Ball!
Raymond Vector Los Altos Sports
George Watson Watson & Son
Charles Ream Athletic Supplies
Donald Quinn Quinn's Sports
Jane Miller Sport Stuff
Roy Jaeger AA Athletics
Frances Keyes Sports Center
Margaret Lawson Runners & Others
Lana Beatty Sportstown
Frank Albertson Sporting Place
Alfred Grant Gold Medal Sports
Jean Parmelee Olympic City
Arnold Sipes Kids Korner
Dick Baxter Blue Ribbon Sports
Bob Shorter The Triathletes Club
Fred Jewell Century Pro Shop
Jason Wallack City Sports
Cathy O'Brian The Sporting Life
Marvin Hanlon Bay Sports
Chris Putnum Putnum's Putters
James Henry Total Fitness Sports
Eileen Neelie Neelie's Discount Sp
Kim Satifer Big Blue Bike Shop
Frank Lessor Phoenix University
Let's now create a BTS index on lname
column and do a fuzzy query.
CREATE INDEX i_bts_customer1 ON customer(lname bts_char_ops) USING BTS IN s_sbstd; select * from customer where bts_contains(lname, 'brian~')
customer_num 122
fname Cathy
lname O'Brian
company The Sporting Life
address1 543 Nassau Street
address2
city Princeton
state NJ
zipcode 08540
phone 609-342-0054
Running again the script will get
Ax.db.execute('DROP TABLE IF EXISTS customer'); Ax.db.execute(`CREATE TABLE customer (fname CHAR(20), lname CHAR(20), PRIMARY KEY(fname) );`); Ax.db.execute('INSERT INTO customer (fname, lname) VALUES ("john", "smith")'); Ax.db.execute('CREATE INDEX i_bts_customer1 ON customer(lname bts_char_ops) USING BTS IN s_sbstd;'); console.log(Ax.db.hasTextSearch()); console.log(Ax.db.getBasicTextSearch("lname", "smith")); console.log(Ax.db.getFuzzyTextSearch("lname", "smith")); console.log(Ax.db.getBestTextSearch("customer", "lname", "smith", false)); Ax.db.execute('DROP INDEX i_bts_customer1'); Ax.db.execute('DROP TABLE customer');
true
bts_contains(lname, 'smith')
bts_contains(lname, 'smith~')
bts_contains(lname, 'smith')
You should use getBestTextSearch
function as preferred option as it will
automatically provide the available search option.