MySQL, like, search from multiple fields

classic Classic list List threaded Threaded
13 messages Options
Reply | Threaded
Open this post in threaded view
|

MySQL, like, search from multiple fields

Jussi Hirvi
I'm just beginning to use SQL. Would this work in an search inline?

-SQL=('SELECT DISTINCT * FROM my_db->my_table WHERE my_field LIKE %' +
$mySearchWord + '%;');

If I'd like to search multiple fields, do I have to do something like

WHERE my_title   LIKE %' + $mySearchWord + '% OR
      my_summary LIKE %' + $mySearchWord + '% OR
      my_content LIKE %' + $mySearchWord + '%;

I plan to use this in the blog solution. There would be only 1 search field,
and the search would target the title, summary, and maintext fields.

Fulltext index combining those three fields w ould be one solution, but in a
blog there will be lots of text, and the index would probably soon take lots
of disk space. Besides the LIKE pattern match way would give more
flexibility, if I would later want to change the search function (for
example include another field into the search).

- Jussi Hirvi

--
Jussi Hirvi * Green Spot
Topeliuksenkatu 15 C * 00250 Helsinki * Finland
Tel. & fax +358-9-493 981
Mobile +358-40-771 2098 (only text messages)
[hidden email] * http://www.greenspot.fi/


--
------------------------------
Lasso Support: http://support.omnipilot.com/
Search the list archives: http://www.listsearch.com/lassotalk.lasso
Manage your list subscription:  
http://www.listsearch.com/lassotalk.lasso?manage
Reply | Threaded
Open this post in threaded view
|

Re: MySQL, like, search from multiple fields

James Harvard
>I'm just beginning to use SQL.

Most important SQL consideration of all: are you cleaning or escaping the $mySearchWord input from the user?  If not, then at best you will find your SQL statement breaks if someone enters a search term with a quote in it (e.g. O'Reilly). At worst you are allowing crackers to run their own SQL statements on your server.  =:-o

All user-entered data must be considered hostile. So before you use it in an inline:

// if it is an integer, e.g. a price search
var: 'integer_to_search_with' = (integer:(action_param:'price')) ;

// a word search
-sql=('select * from my_table where field like \'%' + (encode_sql:(action_param:'search')) + '%\';')
// or use regex to pick out the first word from the search term

>Would this work in an search inline?
>
>-SQL=('SELECT DISTINCT * FROM my_db->my_table WHERE my_field LIKE %' +
>$mySearchWord + '%;');

Nearly, but you need to quote the search pattern so that MySQL sees it as a string - see example above. Also AFAIK the my_db->my_table is not valid. If your table is in the same db as the inline's -database then you don't need to specify the db in the SQL. If you ever do need to then you do it as "from my_db.my_table".

>Fulltext index combining those three fields w ould be one solution, but in a
>blog there will be lots of text, and the index would probably soon take lots
>of disk space.

Maybe, but if your table is big enough for a full text index to take up lots of space, then it is also big enough for a LIKE search to be very slow, because the database has to scan all the rows of the table on disc. Are you really worried about a few more MB of disc space?

>Besides the LIKE pattern match way would give more
>flexibility, if I would later want to change the search function (for
>example include another field into the search).

Not IMO. You can always run an 'alter table' statement to add another field to the full text index. And the full text search syntax is _much_ more flexible than a simple LIKE search. One thing in particular that I don't like about search systems that use LIKE is that it has no recognition of word boundaries. So if you search for 'port', you might get a whole lot of matches for 'report'.

HTH,
James Harvard

--
------------------------------
Lasso Support: http://support.omnipilot.com/
Search the list archives: http://www.listsearch.com/lassotalk.lasso
Manage your list subscription:  
http://www.listsearch.com/lassotalk.lasso?manage
Reply | Threaded
Open this post in threaded view
|

Re: MySQL, like, search from multiple fields

Jussi Hirvi
In reply to this post by Jussi Hirvi
James Harvard ([hidden email]) kirjoitteli
(23.9.2005 12:18):

> Not IMO. You can always run an 'alter table' statement to add another field to
> the full text index. And the full text search syntax is _much_ more flexible
> than a simple LIKE search. One thing in particular that I don't like about
> search systems that use LIKE is that it has no recognition of word boundaries.
> So if you search for 'port', you might get a whole lot of matches for
> 'report'.

> HTH,

It certainly does.

Let's say I would use fulltext search. First I would do an index, like

    ALTER TABLE my_table ADD FULLTEXT (title, summary, content);
or with index name specified:
    ALTER TABLE my_table ADD FULLTEXT title (title, summary, content);
...right?

Would I then be able to search this index with Lasso without using SQL? That
is, with -Op='ft' ? I think not - so I'd have to use SQL in this case, too.

Here's a sketch:

Var:'sSQL'='SELECT DISTINCT * FROM my_db->my_table WHERE MATCH (title,
summary, content) AGAINST (\'' + (Encode_MySQL:$mySearchWord) + '\')';

That's probably near the "truth".

Lets' say, my search term could be 'round square', and I want that it will
find 'round or square', 'square' etc.

I could join the searchterm into array with (Split:' '). Can I then use OR
operator to iterate through that array, something like this:

$sSQL += 'WHERE ';
Iterate:$search_array, (Var:'i');
    $sSQL += 'MATCH (title, summary, content) ';
    $sSQL += 'AGAINST (\'' + (Encode_MySQL:$i) + '\')';
    $sSQL += 'OR ';
/Iterate;
$sSQL -> (RemoveTrailing:'OR ');

Or is there some better way?

- Jussi

--
Jussi Hirvi * Green Spot
Topeliuksenkatu 15 C * 00250 Helsinki * Finland
Tel. & fax +358-9-493 981
Mobile +358-40-771 2098 (only text messages)
[hidden email] * http://www.greenspot.fi/


--
------------------------------
Lasso Support: http://support.omnipilot.com/
Search the list archives: http://www.listsearch.com/lassotalk.lasso
Manage your list subscription:  
http://www.listsearch.com/lassotalk.lasso?manage
Reply | Threaded
Open this post in threaded view
|

Re: MySQL, like, search from multiple fields

Wade Maxfield
In reply to this post by Jussi Hirvi
>James Harvard ([hidden email]) kirjoitteli
>(23.9.2005 12:18):
>
>>  Not IMO. You can always run an 'alter table' statement to add
>>another field to
>>  the full text index. And the full text search syntax is _much_ more flexible
>>  than a simple LIKE search. One thing in particular that I don't like about
>>  search systems that use LIKE is that it has no recognition of word
>>boundaries.
>>  So if you search for 'port', you might get a whole lot of matches for
>>  'report'.
>
>>  HTH,
>
>It certainly does.
>
>Let's say I would use fulltext search. First I would do an index, like
>
>     ALTER TABLE my_table ADD FULLTEXT (title, summary, content);
>or with index name specified:
>     ALTER TABLE my_table ADD FULLTEXT title (title, summary, content);
>...right?
>
>Would I then be able to search this index with Lasso without using SQL? That
>is, with -Op='ft' ? I think not - so I'd have to use SQL in this case, too.
>
>Here's a sketch:
>
>Var:'sSQL'='SELECT DISTINCT * FROM my_db->my_table WHERE MATCH (title,
>summary, content) AGAINST (\'' + (Encode_MySQL:$mySearchWord) + '\')';
>
>That's probably near the "truth".
>
>Lets' say, my search term could be 'round square', and I want that it will
>find 'round or square', 'square' etc.
>
>I could join the searchterm into array with (Split:' '). Can I then use OR
>operator to iterate through that array, something like this:
>
>$sSQL += 'WHERE ';
>Iterate:$search_array, (Var:'i');
>     $sSQL += 'MATCH (title, summary, content) ';
>     $sSQL += 'AGAINST (\'' + (Encode_MySQL:$i) + '\')';
>     $sSQL += 'OR ';
>/Iterate;
>$sSQL -> (RemoveTrailing:'OR ');
>
>Or is there some better way?
>
>- Jussi


This is my variation on fulltext searching for a cd shopping site
launching next week.
Some lines may have wrapped during the email process, so if there is
an error, it's not my fault. 8)


Variable: 'searchTerm'=(Action_Param: 'searchTerm');
Variable: 'catalog_where_sql' = '';

if: $searchTerm >> '"';
   // visitor used "" so search for exact phrase
   $catalog_where_sql='match (artist,title,composer) against
("'+(Encode_SQL: $searchTerm)+'" IN BOOLEAN MODE)';
else if: $searchTerm >> ' OR ';
   // visitor used OR so look for either any of the words
   $searchTerm->(Replace: ' OR ',' ');
   $catalog_where_sql='match (artist,title,composer) against
("'+(Encode_SQL: $searchTerm)+'" IN BOOLEAN MODE)';
else;
   // look for ALL the words
   $searchTerm->(Replace: '+',' ');
   $searchTerm->(Replace: ' -',' ');
   $searchTerm=(String_ReplaceRegExp: $searchTerm, -Find='\\s+', -replace=' ');

   $searchTerm->(Trim);
   $searchTerm->(Replace: ' ',' +');

   if: ($searchTerm >> ' ') > 0;
  $searchTerm='+'+$searchTerm;
   /if;

   $catalog_where_sql='match (artist,title,composer) against
("'+(Encode_SQL: $searchTerm)+'" IN BOOLEAN MODE)';
/if;

Variable: 'theSQL'='SELECT somefields FROM catalog WHERE
'+$catalog_where_sql+' ORDER BY somefield';


I'm still in the process of migrating data so there may be some
outage over the weekend, but feel free to play with the site if you
want to see it in action.
http://marbecks.iland.co.nz/  (on ADSL connection 128K so speed isn't
the greatest)...

  - Wade

--
------------------------------
Lasso Support: http://support.omnipilot.com/
Search the list archives: http://www.listsearch.com/lassotalk.lasso
Manage your list subscription:  
http://www.listsearch.com/lassotalk.lasso?manage
Reply | Threaded
Open this post in threaded view
|

Re: MySQL, like, search from multiple fields

Olivier Miossec
In reply to this post by Jussi Hirvi


> Here's a sketch:
>
> Var:'sSQL'='SELECT DISTINCT * FROM my_db->my_table WHERE MATCH (title,
> summary, content) AGAINST (\'' + (Encode_MySQL:$mySearchWord) + '\')';
>
> That's probably near the "truth".
>
> Lets' say, my search term could be 'round square', and I want that it will
> find 'round or square', 'square' etc.
>
> I could join the searchterm into array with (Split:' '). Can I then use OR
> operator to iterate through that array, something like this:
>
> $sSQL += 'WHERE ';
> Iterate:$search_array, (Var:'i');
>     $sSQL += 'MATCH (title, summary, content) ';
>     $sSQL += 'AGAINST (\'' + (Encode_MySQL:$i) + '\')';
>     $sSQL += 'OR ';
> /Iterate;
> $sSQL -> (RemoveTrailing:'OR ');
>
> Or is there some better way?
>


Yes you can add the revalence and order the result with

SELECT field ....., MATCH (texte, commentaire, titre) AGAINST ('xxx') AS
cpt FROM [from statement it coulb be a single table or a join statement]
WHERE ...
MATCH (texte, commentaire, titre) AGAINST ('mort')

ORDER BY cpt  DESC


Also when you use multiple keuword in a full text search you don't need to
add multiple MATCH() AGAINST() function

You can Add multiple words in an against function

Like this :



SELECT titre, MATCH (texte, commentaire, titre) AGAINST ('mort r?publique
philosophie') AS  cpt
FROM example_fulltext
ORDER BY cpt DESC

See the full sample here
http://omiossec.developpez.com/mysql/fulltext/fulltext.sql (the sample are
in French)


---
Olivier Miossec
AIM/ichat omiossec
--
http://www.lasso-developpeur.net
--

Need a Lasso consultant ?
(Lasso, Java, Databases Consultant ...)
http://www.lasso-developpeur.net/oliviermiossec/

--
------------------------------
Lasso Support: http://support.omnipilot.com/
Search the list archives: http://www.listsearch.com/lassotalk.lasso
Manage your list subscription:  
http://www.listsearch.com/lassotalk.lasso?manage
Reply | Threaded
Open this post in threaded view
|

Re: MySQL, like, search from multiple fields

James Harvard
In reply to this post by Jussi Hirvi
Check out the boolean full text search syntax:
http://dev.mysql.com/doc/mysql/en/fulltext-boolean.html

FWIW I have a old ctag that parses basic boolean full text search terms according to (AFAIK) the same rules that MySQL uses. So it cleans up the input and removes anything that MySQL won't use in its search. It means you can show the user the search terms that were used (as opposed to the search terms they entered).

It also balances any brackets used because, er, well, because I could and I clearly had too much time on my hands when I wrote this!

James

define_tag: 'parse_fulltext_search',
 -required='terms',
 -optional='minword'
;

        // VERSION 1.5

        if: #terms == '' ;

                return: null ;

        else;

                local: 'mw' = (integer:(local:'minword')) ;

                if: #mw < 1 ;
                        #mw = 4 ;
                /if;

                local:
                 'out'      = string,
                 'temp_arr' = (string_findregexp: #terms, -find=('(?:\\+|-)?(?:[\\w\']+\\*|[\\w\']{' + #mw + ',}|"[^"]+"|\\()|\\)'), -ignorecase),
                 'temp_int' = 0
                ;

                iterate: #temp_arr, (local:'temp_str') ;
                        if:
                         #temp_str != ')'
                         ||
                         (
                          #temp_str == ')'
                          &&
                          #temp_int > 0
                         )
                        ;
                                if: #out != '' ;
                                        #out += ' ' ;
                                /if;
                                #out += #temp_str;
                                if: #temp_str >> '(' ;
                                        #temp_int += 1 ;
                                else: #temp_str == ')' ;
                                        #temp_int -= 1 ;
                                /if;
                        /if;
                /iterate;

                while: #temp_int > 0 ;
                        #out += ' )' ;
                        #temp_int -= 1 ;
                /while;

                return: #out ;

        /if;

/define_tag;

--
------------------------------
Lasso Support: http://support.omnipilot.com/
Search the list archives: http://www.listsearch.com/lassotalk.lasso
Manage your list subscription:  
http://www.listsearch.com/lassotalk.lasso?manage
Reply | Threaded
Open this post in threaded view
|

Re: MySQL, like, search from multiple fields

Jussi Hirvi
In reply to this post by Jussi Hirvi
James Harvard ([hidden email]) kirjoitteli
(23.9.2005 15:31):

> Check out the boolean full text search syntax:
> http://dev.mysql.com/doc/mysql/en/fulltext-boolean.html
>
> FWIW I have a old ctag that parses basic boolean full text search terms
> according to (AFAIK) the same rules that MySQL uses. So it cleans up the input
> and removes anything that MySQL won't use in its search. It means you can show
> the user the search terms that were used (as opposed to the search terms they
> entered).

Too bad the boolean fulltext search is only in MySQL 4.0.1 and up (says my
book). And I have L6/MySQL 3.2.something. :-(

Another reason to upgrade some time...

- Jussi Hirvi

--
Jussi Hirvi * Green Spot
Topeliuksenkatu 15 C * 00250 Helsinki * Finland
Tel. & fax +358-9-493 981
Mobile +358-40-771 2098 (only text messages)
[hidden email] * http://www.greenspot.fi/


--
------------------------------
Lasso Support: http://support.omnipilot.com/
Search the list archives: http://www.listsearch.com/lassotalk.lasso
Manage your list subscription:  
http://www.listsearch.com/lassotalk.lasso?manage
Reply | Threaded
Open this post in threaded view
|

Re: MySQL, like, search from multiple fields

Jussi Hirvi
In reply to this post by Jussi Hirvi
Wade Maxfield ([hidden email]) kirjoitteli (23.9.2005 13:50):
> This is my variation on fulltext searching for a cd shopping site
> launching next week.
> Some lines may have wrapped during the email process, so if there is
> an error, it's not my fault. 8)

Thanks, I may return to that later. For now I think I'll stick to Lasso
metasearch. I just found a way to approximate basic fulltext search quite
nicely.

Each field here (title, excerpt, content) is separately ft-indexed.

    Variable:'searchArgs' = (Array);
    Variable:'s' = (Action_Param:'s');  // search words
    $s = $s -> (Split:' ');             // split into array
        $searchArgs -> (Insert: '-OperatorLogical' = 'or');
    Iterate: $s, (Var:'i');
        $searchArgs -> (Insert: '-Op' = 'ft');
        $searchArgs -> (Insert: 'pos_title' = $i);
        $searchArgs -> (Insert: '-Op' = 'ft');
        $searchArgs -> (Insert: 'pos_excerpt' = $i);
        $searchArgs -> (Insert: '-Op' = 'ft');
        $searchArgs -> (Insert: 'pos_content' = $i);
    /Iterate;

... $searchArgs is then just fed into a search inline, and that's it. :-)

- Jussi Hirvi

--
Jussi Hirvi * Green Spot
Topeliuksenkatu 15 C * 00250 Helsinki * Finland
Tel. & fax +358-9-493 981
Mobile +358-40-771 2098 (only text messages)
[hidden email] * http://www.greenspot.fi/


--
------------------------------
Lasso Support: http://support.omnipilot.com/
Search the list archives: http://www.listsearch.com/lassotalk.lasso
Manage your list subscription:  
http://www.listsearch.com/lassotalk.lasso?manage
Reply | Threaded
Open this post in threaded view
|

Re: MySQL, like, search from multiple fields

Clive Bruton
In reply to this post by Jussi Hirvi

On 23 Sep 2005, at 10:18, James Harvard wrote:

> So if you search for 'port', you might get a whole lot of matches  
> for 'report'

Yes, but that's the point :-)

If you want "begins with", then just do this:

     like 'port%'


-- Clive

--
------------------------------
Lasso Support: http://support.omnipilot.com/
Search the list archives: http://www.listsearch.com/lassotalk.lasso
Manage your list subscription:  
http://www.listsearch.com/lassotalk.lasso?manage
Reply | Threaded
Open this post in threaded view
|

Re: MySQL, like, search from multiple fields

James Harvard
In reply to this post by Jussi Hirvi
>If you want "begins with", then just do this:
>    like 'port%'

But then that won't match "Changing the port number for MySQL". If you use LIKE there's no way of searching for 'port' without also matching, for example, "Using Crystal Reports with MySQL".

James

--
------------------------------
Lasso Support: http://support.omnipilot.com/
Search the list archives: http://www.listsearch.com/lassotalk.lasso
Manage your list subscription:  
http://www.listsearch.com/lassotalk.lasso?manage
Reply | Threaded
Open this post in threaded view
|

Re: MySQL, like, search from multiple fields

Bil Corry
In reply to this post by Jussi Hirvi
You could use regular expressions though:

        where myfield regexp '[[:<:]]port'

- Bil

------

Bil Corry
[hidden email]

Enterprise internet application development and security consulting
  http://www.fivegeeks.com/

Tools for Rapid Lasso Development
  http://www.lassoware.com/
 
-----Original Message-----
From: [hidden email] [mailto:[hidden email]] On Behalf Of James Harvard
Sent: Friday, September 23, 2005 8:21 AM
To: [hidden email]
Subject: Re: MySQL, like, search from multiple fields

>If you want "begins with", then just do this:
>    like 'port%'

But then that won't match "Changing the port number for MySQL". If you use LIKE there's no way of searching for 'port' without also
matching, for example, "Using Crystal Reports with MySQL".

James



--
------------------------------
Lasso Support: http://support.omnipilot.com/
Search the list archives: http://www.listsearch.com/lassotalk.lasso
Manage your list subscription:  
http://www.listsearch.com/lassotalk.lasso?manage
Reply | Threaded
Open this post in threaded view
|

Re: MySQL, like, search from multiple fields

Bil Corry
In reply to this post by Jussi Hirvi
> Most important SQL consideration of all: are you cleaning
> or escaping the $mySearchWord input from the user?

Here's a short article about Lasso and SQL injection:

http://www.ldml.org/articles/SQL_Injection.lasso



- Bil

------

Bil Corry
[hidden email]

Enterprise internet application development and security consulting
  http://www.fivegeeks.com/

Tools for Rapid Lasso Development
  http://www.lassoware.com/
 
-----Original Message-----
From: [hidden email] [mailto:[hidden email]] On Behalf Of James Harvard
Sent: Friday, September 23, 2005 2:19 AM
To: [hidden email]
Subject: Re: MySQL, like, search from multiple fields

>I'm just beginning to use SQL.

Most important SQL consideration of all: are you cleaning or escaping the $mySearchWord input from the user?  If not, then at best
you will find your SQL statement breaks if someone enters a search term with a quote in it (e.g. O'Reilly). At worst you are
allowing crackers to run their own SQL statements on your server.  =:-o

All user-entered data must be considered hostile. So before you use it in an inline:

// if it is an integer, e.g. a price search
var: 'integer_to_search_with' = (integer:(action_param:'price')) ;

// a word search
-sql=('select * from my_table where field like \'%' + (encode_sql:(action_param:'search')) + '%\';')
// or use regex to pick out the first word from the search term

>Would this work in an search inline?
>
>-SQL=('SELECT DISTINCT * FROM my_db->my_table WHERE my_field LIKE %' +
>$mySearchWord + '%;');

Nearly, but you need to quote the search pattern so that MySQL sees it as a string - see example above. Also AFAIK the
my_db->my_table is not valid. If your table is in the same db as the inline's -database then you don't need to specify the db in the
SQL. If you ever do need to then you do it as "from my_db.my_table".

>Fulltext index combining those three fields w ould be one solution, but in a
>blog there will be lots of text, and the index would probably soon take lots
>of disk space.

Maybe, but if your table is big enough for a full text index to take up lots of space, then it is also big enough for a LIKE search
to be very slow, because the database has to scan all the rows of the table on disc. Are you really worried about a few more MB of
disc space?

>Besides the LIKE pattern match way would give more
>flexibility, if I would later want to change the search function (for
>example include another field into the search).

Not IMO. You can always run an 'alter table' statement to add another field to the full text index. And the full text search syntax
is _much_ more flexible than a simple LIKE search. One thing in particular that I don't like about search systems that use LIKE is
that it has no recognition of word boundaries. So if you search for 'port', you might get a whole lot of matches for 'report'.

HTH,
James Harvard

--
------------------------------
Lasso Support: http://support.omnipilot.com/
Search the list archives: http://www.listsearch.com/lassotalk.lasso
Manage your list subscription:  
http://www.listsearch.com/lassotalk.lasso?manage



--
------------------------------
Lasso Support: http://support.omnipilot.com/
Search the list archives: http://www.listsearch.com/lassotalk.lasso
Manage your list subscription:  
http://www.listsearch.com/lassotalk.lasso?manage
Reply | Threaded
Open this post in threaded view
|

Re: MySQL, like, search from multiple fields

Jussi Hirvi
In reply to this post by Jussi Hirvi
Jussi Hirvi ([hidden email]) kirjoitteli (23.9.2005 16:18):

> Each field here (title, excerpt, content) is separately ft-indexed.
>
> Variable:'searchArgs' = (Array);
> Variable:'s' = (Action_Param:'s');  // search words
> $s = $s -> (Split:' ');             // split into array
> $searchArgs -> (Insert: '-OperatorLogical' = 'or');
> Iterate: $s, (Var:'i');
> $searchArgs -> (Insert: '-Op' = 'ft');
> $searchArgs -> (Insert: 'pos_title' = $i);
> $searchArgs -> (Insert: '-Op' = 'ft');
> $searchArgs -> (Insert: 'pos_excerpt' = $i);
> $searchArgs -> (Insert: '-Op' = 'ft');
> $searchArgs -> (Insert: 'pos_content' = $i);
> /Iterate;
>
> ... $searchArgs is then just fed into a search inline, and that's it. :-)

For the record - I notice I have again been solving problems that don't
exist. :-) I do that often when I'm tired.

Here's the simpler version, and there really wasn't that much to invent.

Variable:'searchArgs' = (Array);
Variable:'s' = (Action_Param:'s');  // search words
        $s = (String_ReplaceRegExp: $s, -Find='\\s+', -replace=' ');
        $s -> (Trim);               // no need to encode_SQL $s, right?
        $searchArgs -> (Insert: '-OperatorLogical' = 'or');
        $searchArgs -> (Insert: '-Op' = 'ft');
        $searchArgs -> (Insert: 'pos_title' = $s);
        $searchArgs -> (Insert: '-Op' = 'ft');
        $searchArgs -> (Insert: 'pos_excerpt' = $s);
        $searchArgs -> (Insert: '-Op' = 'ft');
        $searchArgs -> (Insert: 'pos_content' = $s);
Inline.... -search, $searchArgs;

- Jussi Hirvi

--
Jussi Hirvi * Green Spot
Topeliuksenkatu 15 C * 00250 Helsinki * Finland
Tel. & fax +358-9-493 981
Mobile +358-40-771 2098 (only text messages)
[hidden email] * http://www.greenspot.fi/


--
------------------------------
Lasso Support: http://support.omnipilot.com/
Search the list archives: http://www.listsearch.com/lassotalk.lasso
Manage your list subscription:  
http://www.listsearch.com/lassotalk.lasso?manage