I agree with Dave, as I popped in on this thread thinking you were
using OracleText and my laziness has prevented me from writing a
Google-to-OracleText query in PL/SQL. I was hoping you might have
already.

I was able to generate an error when I searched on a NOT term without
specifiying the term. (Just a '-'). It also throws an error if there
are double quotes.

-Adam

On 10/11/05, Dave Carabetta <[EMAIL PROTECTED]> wrote:
> On 10/11/05, Daniel Kessler <[EMAIL PROTECTED]> wrote:
> > As y'all have read, I'm trying to replicate a google-like search on
> > our database.  I think that I have the CF and DB (Oracle) logic
> > worked out but I'd like someone else to look it over and see if it's
> > right.  I want to search the same way that google does since most
> > people are used to that.  I want words separated by spaces, quoted
> > text (a phrase) treated as a single word, + meaning that it must have
> > the word and - that it must not contain the word.
> >
> > Here's the search page which allows for a search of a few different
> > columns:
> > http://hhp.umd.edu/people/people_search.cfm
> >
> > and here's the code that I use (and any improvements are welcome):
> >
> >
> >      <!---
> >          before this, I make the three arrays described here:
> >              - search_ar: the OR search items
> >              - search_must: the AND "must contain" items, designated
> > as + before the word
> >              - search_not: the items that "must not contain" in the
> > returned results, designated as minus before the word
> >      --->
> >
> > <CFQUERY NAME="people_search" DATASOURCE="dpch">
> >              SELECT
> > id,fname,lname,type,title,dept,phone,location,email,summary,imagePath,li
> > nk
> >              FROM PEOPLE
> >              WHERE
> >                  <cfloop from="1" to="#arrayLen(search_ar)#" index="ii">
> >                      UPPER(#PreserveSingleQuotes(the_search_column)#)
> > LIKE UPPER('%#search_ar[ii]#%')
> >                      <cfif ii LT arrayLen(search_ar)>OR</cfif>
> >                  </cfloop>
> >                  <cfif arrayLen(search_ar) GT 0 AND arrayLen
> > (search_must) GT 0>AND</cfif>
> >                  <cfif arrayLen(search_must) GT 0>
> >                      (
> >                      <cfloop from="1" to="#arrayLen(search_must)#"
> > index="jj">
> >                          UPPER(#PreserveSingleQuotes
> > (the_search_column)#) LIKE UPPER('%#search_must[jj]#%')
> >                          <cfif jj LT arrayLen(search_must)>AND</cfif>
> >                      </cfloop>
> >                      )
> >                  </cfif>
> >                  <cfif (arrayLen(search_must) GT 0 OR (arrayLen
> > (search_ar) GT 0 AND arrayLen(search_must) EQ 0)) AND arrayLen
> > (search_not) GT 0>AND</cfif>
> >                  <cfif arrayLen(search_not) GT 0>
> >                      (
> >                      <cfloop from="1" to="#arrayLen(search_not)#"
> > index="kk">
> >                          UPPER(#PreserveSingleQuotes
> > (the_search_column)#) NOT LIKE UPPER('%#search_not[kk]#%')
> >                          <cfif kk LT arrayLen(search_not)>AND</cfif>
> >                      </cfloop>
> >                      )
> >                  </cfif>
> >
> >                  <!--- --->
> >
> >                  AND status = 'active'
> >              ORDER BY upper(lname) ASC
> >          </CFQUERY>
> >
>
> It might have a Google "feel" from a UI standpoint, but your code
> above will more than likely not scale at all. First, when you use
> Oracle functions around column names such as:
>
> UPPER(column) = '#UCase(myvalue)#'
>
> Oracle will not use any indexes defined on that column, which means
> it's going to do a full table scan for that value (translation: not
> scalable). Second, LIKE queries, in general, should be avoided,
> particularly for heavy search queries. You should really look into
> using Oracle's Full Text Search capabilities, as the performance
> difference can be dramatic. It's a little more difficult to implement
> up front, but that effort will go a long way to saving your database.
> Some might also say that you should be using cfqueryparam as well so
> that bind parameters are used, but I've read in several places that
> user-defined search queries like you have are actually *better off*
> without bind parameters because you don't risk Oracle creating an
> initial explain plan for a query based on one set of terms terms, only
> to find out that another set of search terms should use a completely
> different explain plan.
>
> I don't know what the traffic at that site is like, nor do I know the
> number of records your searching against (or will search against in
> the future), but I think you should do some more research into Full
> Text Searching before committing to your current approach, as I think
> you're setting yourself up for trouble, if not now, down the road.
>
> Regards,
> Dave.
>
> 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
Discover CFTicket - The leading ColdFusion Help Desk and Trouble 
Ticket application

http://www.houseoffusion.com/banners/view.cfm?bannerid=48

Message: http://www.houseoffusion.com/lists.cfm/link=i:4:220740
Archives: http://www.houseoffusion.com/cf_lists/threads.cfm/4
Subscription: http://www.houseoffusion.com/lists.cfm/link=s:4
Unsubscribe: http://www.houseoffusion.com/cf_lists/unsubscribe.cfm?user=89.70.4
Donations & Support: http://www.houseoffusion.com/tiny.cfm/54

Reply via email to