0

我正在尝试升级 Coldfusion8/MySQL 站点。该网站有一个复杂的搜索,(在其他标准中)获取文本字符串并在关键字表中搜索这些。

我不想进行 FULLTEXT 搜索,因为完整的查询有很多额外的条件。我正在寻找的是使以下内容更加“动态”,而不是将自己限制在 xy 单词中,从而可能会缩短一点(完整的搜索有很多这样的块)。

所以,假设我有一个搜索字符串

I'm looking for something

我目前正在这样做:

<!--- params --->
<cfparam name="s01" default="">
<cfparam name="s02" default="">
<cfparam name="s03" default="">    
<cfparam name="s04" default="">
<cfparam name="s05" default="">

<!--- get length of search string --->
<cfset howManyWords = ListLen(textSearch," ")>

<!--- assign words to params --->
<cfif howManyWords gt 0><cfset s01 = trim(ListGetAt(textSearch, 1," "))></cfif>
<cfif howManyWords gt 1><cfset s02 = trim(ListGetAt(textSearch, 2," "))></cfif>
<cfif howManyWords gt 2><cfset s03 = trim(ListGetAt(textSearch, 3," "))></cfif>
<cfif howManyWords gt 3><cfset s04 = trim(ListGetAt(textSearch, 4," "))></cfif>
<cfif howManyWords gt 4><cfset s05 = trim(ListGetAt(textSearch, 5," "))></cfif>

在我的搜索查询中,我将搜索字符串与三个数据库字段匹配:

...
<cfif textSearch neq "">
    <cfif s01 neq "">AND (a.textSearch LIKE "%#s01#%" OR a.textSearch_xl LIKE "%#s01#%" OR a.ean = "#s01#")</cfif>
    <cfif s02 neq "">AND (a.textSearch LIKE "%#s02#%" OR a.textSearch_xl LIKE "%#s02#%" OR a.ean = "#s02#")</cfif>
    <cfif s03 neq "">AND (a.textSearch LIKE "%#s03#%" OR a.textSearch_xl LIKE "%#s03#%" OR a.ean = "#s03#")</cfif>
    <cfif s04 neq "">AND (a.textSearch LIKE "%#s04#%" OR a.textSearch_xl LIKE "%#s04#%" OR a.ean = "#s04#")</cfif>
    <cfif s05 neq "">AND (a.textSearch LIKE "%#s05#%" OR a.textSearch_xl LIKE "%#s05#%" OR a.ean = "#s05#")</cfif>
</cfif>
...

问题:
有没有办法让这更加动态,例如使用循环,所以我不会被 5 个单词困住?在这种情况下,我将如何预设参数值?

感谢帮助!

4

2 回答 2

4

您可以通过在查询中将其作为列表循环来扩展搜索词,您还应该使用查询参数来防止 SQL 注入攻击。

<cfloop list="#textSearch#" index="word" delimiters=" ">
  AND (
    a.textSearch LIKE <cfqueryparam cfsqltype="cfsql_varchar" value="%#word#%"> 
    OR a.textSearch_xl LIKE <cfqueryparam cfsqltype="cfsql_varchar" value="%#word#%">  
    OR a.ean = <cfqueryparam cfsqltype="cfsql_varchar" value="#word#"> 
  )
</cfloop>
于 2012-05-20T20:11:12.463 回答
1

您可以使用交替构建一个简单的正则表达式,然后使用 MySQL 的REGEXP运算符。你会在 SQL 中想要这样的东西:

and (a.textSearch regexp 'a|b|c|...' or a.textSearch_xl regexp 'a|b|c|...' or a.ean regexp 'a|b|c|...')

其中a, b, c, ... 是您要搜索的内容。虽然我不知道 ColdFushion 方面的事情,但构建正则表达式应该相当简单。

于 2012-05-20T20:14:20.490 回答