2013-04-09 92 views
1

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

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

项目 1关键字:备件发动机
项目 2个关键字:备用发动机部件

现在,我有可以让我显示项目1和2,如果我的代码仅输入一(1)的那些关键词

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

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

我知道有一个功能在那里进行全文搜索,但我研究过有安全漏洞的情况,所以我想避免冒这个风险。我有一种感觉,这可能与AND或OR语句更相关,但如果需要它,我不确定该放置。有没有人有任何关于这种情况的专业知识,并愿意提供帮助?

+0

为什么不使用现有的搜索引擎(如lucene/solr/elasticsearch)而不是自己构建并重新创建所有内容?数据库中的全文搜索通常非常有限 – Karussell 2013-04-09 18:41:50

回答

0

因此,看看HackyStack在最近的帖子中提出的一个计数器系统是需要记录用户放入的单词空格中的间隔。对于用户制作的每个空间,重复“OR关键字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值。接下来我们创建一个InStr(设置正在搜索的项目的起始值,正在搜索的项目(在这种情况下strSearch等于txtBox的名称/值)以及我们在该部分中检查的内容(在此如果InStr在搜索中没有找到空格,那么它将作为一个被搜索的单词;否则,它将解析这两个单词并使它们分开,如下所示:

在搜索栏 “备用引擎”

例如,用户类型
结果回来:

关键字LIKE '%备用%' 或关键字LIKE '%引擎%'

我我想感谢我的同事HackyStack和4guysfromrolla.com提供帮助。我希望我解释我自己。

0

要做你刚才说的很简单,你将不得不基于在搜索词中输入的词的数量动态地构建WHERE子句,所以你会有一个小小的循环来增加你的查询字符串, “OR”语句后的第一个输入的每一个字,因此,如果输入了3个字“X,Y和Z”,你会:

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

你会打破你的搜索项分隔的单词这样做由空白,如果你有多个,附加在每个“OR”语句到您的查询字符串...

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

+0

HackyStack - 感谢您的支持信息。在做了一些更多的研究并坐下来了解一些新术语之后,我找到了你从上面建议的例子。 – user1134815 2013-04-11 14:50:59