1

我目前正在尝试使用 asp 构建一个内部搜索引擎数据库。我不是专家,只是简要介绍了这种编码风格。我遇到的麻烦是这样的:

(例如)我有两个相对相同的文档,并且具有相同的关键字来描述它们。但是,表中的关键字并不是按照相同的顺序写的。表中所写的所有关键字均以空格分隔。

项目1关键词:备件发动机
项目2关键词:备件发动机

现在,如果我只输入这些关键词中的 ONE(1),我所拥有的代码将允许我显示项目 1 和 2 :

sql = "Select title, descript, url, uid FROM searchMachine WHERE keywords LIKE '%" & Replace(keywords, "'", "''") & "%' ORDER BY uid;"

但是,如果我要在搜索框中输入“备用引擎”,那么只会显示第 2 项,而不会显示第 1 项。此外,如果我要输入“零件引擎”或“引擎零件”,它们都不会显示。它似乎只参与列出的前 2 个(或成对的 2 个)关键字。我想要完成的目标是允许用户输入的分组关键字(即备用引擎部件)并允许它仍然显示列出任何关键字的所有相关信息,而不必担心编写成对或成组的关键字一遍又一遍。

我知道有一个全文搜索功能,但我研究过存在安全漏洞的实例,所以我想避免冒险。我有一种感觉,这可能更多地与 AND 或 OR 语句相关,但我不确定是否需要放置。有没有人对这种情况有任何专业知识并愿意提供帮助?

4

2 回答 2

0

要做到您所说的非常简单,您必须根据搜索词中输入的单词数动态构建 WHERE 子句,因此您将有一个小循环添加到查询字符串中,生成“OR”语句对于在第一个单词之后输入的每个单词,因此如果输入 3 个单词“X、Y 和 Z”,您将有:

WHERE keywords LIKE 'X'
OR keywords LIKE 'Y'
OR keywords LIKE 'Z'

您可以通过将搜索词分解为由空格分隔的单词来做到这一点,如果您有多个单词,请将每个单词的“OR”语句附加到您的查询字符串...

我不得不承认,克鲁塞尔是正确的,如果你要重新发明轮子,你应该有一些非常好的理由这样做......

于 2013-04-09T18:50:41.603 回答
0

所以看看 HackyStack 在最近的帖子中的建议,一个计数器系统需要记录用户输入的单词空格中的中断。对于用户创建的每个空格,重复“OR keywords LIKE”语句. 它应该看起来像这样:

Dim strSQL, tmpSQL  
strSQL = "SELECT title, descript, url, uid FROM searchMachine WHERE "  
tmpSQL = "(keywords LIKE "    

Dim Pos
Pos = 1
While Pos > 0
    Pos = InStr(1, strSearch, " ")
    If Pos = 0 Then
        'We have it the end
        tmpSQL = tmpSQL & "'%" & strSearch & "%')"
    Else
        tmpSQL = tmpSQL & "'%" & Mid(strSearch, 1, Pos) & "%' " & DefaultBoolean & " keywords LIKE "
        strSearch = Mid(strSearch, Pos + 1, Len(strSearch))
    End If

End While

所以为了分解我在这里的内容,我们首先设置我们的 sql 行的开始集。从那里我们需要指定计数器和分隔多个关键字所需的条件。首先,为 Pos 设置一个标记值并将其 int 值 1。接下来我们创建一个 InStr (设置正在搜索的项目的起始值,正在搜索的项目(在这种情况下 strSearch 等于txtBox 名称/值的名称)以及我们在该部分中检查的内容(在这种情况下,搜索词之间的任何空格)。如果 InStr 在搜索中未找到空格,则它将仅充当 1 个搜索词;否则, 它将解析这两个单词并将它们分开,如下所示。

例如,用户在搜索栏中输入“备用引擎”
结果返回:

关键字 LIKE '%spare%' 或关键字 LIKE '%engine%'

我要感谢我的同事 HackyStack 和 4guysfromrolla.com 在这方面的帮助。我希望我能解释清楚。

于 2013-04-11T17:27:04.730 回答