这篇文章主要围绕您如何使用T-SQL全文本搜索来获得类似Google的结果?展开,旨在为您提供一份详细的参考资料。我们将全面介绍您如何使用T-SQL全文本搜索来获得类似Google的结果?,同时也会为
这篇文章主要围绕您如何使用T-SQL全文本搜索来获得类似Google的结果?展开,旨在为您提供一份详细的参考资料。我们将全面介绍您如何使用T-SQL全文本搜索来获得类似Google的结果?,同时也会为您带来ajax Suggest类似google的搜索提示效果、Ajax实现类似google搜索下拉框提示功能(4/4)、ASP+AJAX做类似google的搜索提示、c# – 类似Google的搜索查询标记化和字符串分割的实用方法。
本文目录一览:- 您如何使用T-SQL全文本搜索来获得类似Google的结果?
- ajax Suggest类似google的搜索提示效果
- Ajax实现类似google搜索下拉框提示功能(4/4)
- ASP+AJAX做类似google的搜索提示
- c# – 类似Google的搜索查询标记化和字符串分割
您如何使用T-SQL全文本搜索来获得类似Google的结果?
我需要的
我有一个数据库,其中的字段可以包含长词组。我希望能够在这些列中快速搜索关键字或短语,但是当搜索短语时,我希望能够像Google一样搜索短语,返回包含所有指定单词的所有行,但没有特别说明秩序或彼此“接近”。此时,无需按相关性对结果进行排名。
在阅读了有关SQL Server的全文本搜索后,我认为这正是我所需要的:一个基于文本的列中每个单词的可搜索索引。我的最终目标是安全地接受用户输入,并将其转换为利用全文搜索速度的查询,同时保持用户的易用性。
问题:全文搜索功能无法像Google一样进行搜索
我看到该FREETEXT
函数可以使用整个短语,将其分解为“有用的”单词(忽略诸如“ and”,“
or”,“
the”等之类的单词),然后非常快速地返回匹配行的列表,即使使用一个复杂的搜索词。但是,当您尝试使用它时,您可能会注意到AND
,它似乎只在进行OR
搜索,而不是对每个术语进行搜索。也许有一种方法可以更改其行为,但是我还没有发现任何有用的方法。
然后是CONTAINS
,可以接受布尔查询短语,但有时结果很奇怪。
查看此表上的以下查询:
数据
PKID Name----- -----1 James Kirk2 James Cameron3 Kirk Cameron4 Kirk For Cameron
查询
Q1: SELECT Name FROM tblName WHERE FREETEXT(Name, ''james'')Q2: SELECT Name FROM tblName WHERE FREETEXT(Name, ''james kirk'')Q3: SELECT Name FROM tblName WHERE FREETEXT(Name, ''kirk for cameron'')Q4: SELECT Name FROM tblName WHERE CONTAINS(Name, ''james'')Q5: SELECT Name FROM tblName WHERE CONTAINS(Name, ''"james kirk"'')Q6: SELECT Name FROM tblName WHERE CONTAINS(Name, ''"kirk james"'')Q7: SELECT Name FROM tblName WHERE CONTAINS(Name, ''james AND kirk'')Q8: SELECT Name FROM tblName WHERE CONTAINS(Name, ''kirk AND for AND cameron'')
查询1:
SELECT Name FROM tblName WHERE FREETEXT(Name, ''james'')
返回“ James Kirk”和“ James Cameron”。好吧,让它缩小范围…
查询2:
SELECT Name FROM tblName WHERE FREETEXT(Name, ''james kirk'')
你猜怎么了。现在,您将获得“ James Kirk”,“ James Cameron”和“ Kirk For Cameron”。 Query 3
也会发生同样的事情,所以我们就跳过它。
查询4:
SELECT Name FROM tblName WHERE CONTAINS(Name, ''james'')
与查询1相同的结果。好的。缩小结果也许…?
查询5:
SELECT Name FROM tblName WHERE CONTAINS(Name, ''"james kirk"'')
发现有空格后,需要将字符串括在双引号中后,我发现此查询在该特定数据集上可以很好地满足我想要的结果!仅返回“ James Kirk”。精彩的!还是…
查询6:
SELECT Name FROM tblName WHERE CONTAINS(Name, ''"kirk james"'')
废话 否。它与该词组完全匹配。嗯…在检查了T-SQL的CONTAINS函数的语法之后,我发现您可以在其中添加布尔关键字,而这似乎可能就是答案。让我们来看看…
查询7:
SELECT Name FROM tblName WHERE CONTAINS(Name, ''james AND kirk'')
整洁的。我得到了所有三个结果,正如预期的那样。现在,我只编写了一个AND
在所有单词之间填充单词的函数。完成了吧?现在怎么办…
查询8:
SELECT Name FROM tblName WHERE CONTAINS(Name, ''kirk AND for AND cameron'')
该查询完全知道它要查找的内容,除了某些原因外,没有结果。为什么?在阅读完有关停用词和停用列表的内容之后,我会做出有根据的猜测,因为我要索取索引值的交叉点为“弯折”,“ for”和“ cameron”,而“
for”一词将没有任何结果(将其作为停用词以及所有结果),则与该结果相交的任何结果也为空。它实际上是否像那样起作用对我来说无关紧要,因为这是CONTAINS
每次我在其中使用停用词进行布尔搜索时该函数的可观察行为。
所以我需要一个新的解决方案。
来了 NEAR
看起来很有前途。如果我可以接受用户查询并在逗号之间插入逗号,这将…等待,这与AND
在CONTAINS
查询中使用布尔值相同。但是它是否正确忽略停用词?
SELECT Name FROM tblName WHERE CONTAINS(Name, ''NEAR(kirk, for, cameron)'')
没有。没结果。删除单词“ for”,您将再次获得所有三个结果。:(
现在怎么办?
答案1
小编典典我正在将ISAbout与THESAURUS,INFLECTIONAL和通配符结合使用
优点是
1-搜索字符串中的单词顺序无关紧要
2-搜索相似的单词(THESAURUS)
3-将运行,运行,运行,运行视为相同(INFLECTIONAL)
4-如果搜索字符串中只有一个元素不在结果字符串中,Near不会返回结果,但是ISAbout将始终返回最理想的结果
5-您可以设置不同单词的权重,这将进一步帮助您优化结果的正确性
SELECT K.RANK, name, DescriptionFROM Diagnosis AS CINNER JOINCONTAINSTABLE(diagnosis,name,<br> ''isAbout(FORMSOF (THESAURUS, "CHRONIC") weight(1.0),FORMSOF (INFLECTIONAL, "CHRONIC") weight(1.0),CHRONIC* weight(1.0)FORMSOF (THESAURUS, "FAILURE") weight(1.0),FORMSOF (INFLECTIONAL, "FAILURE") weight(1.0),FAILURE* weight(1.0),FORMSOF (THESAURUS, "DIASTOLIC") weight(1.0),FORMSOF (INFLECTIONAL, "DIASTOLIC") weight(1.0),DIASTOLIC* weight(1.0))'')AS KON C.ID = K.[KEY];
我仍在寻找优化方法。
注意:我会以编程方式从搜索字符串中删除停用词。
ajax Suggest类似google的搜索提示效果
实现:<script type="text/javascript" src="/path/to/SuggestFramework.js"></script>
<script type="text/javascript">window.onload = initializeSuggestFramework;</script>
有了上面两句后,每个取了名的文本框会多出五个属性:
1.action 必须。接受 GET 方式提交的数据,并返回相关 Javascript 数组的动态页。
2.capture 如果返回的结果不止一列(比如本例中的单词和中文意思),将要替换用户输入的那一列(从 1 开始算)。通常这个和数据库字段相对应。
可选,默认为 1.
3.columns 下拉显示的列数,比如本例中,按字母查询单词,并将中文意思显示在右侧。可选,默认为 1.
4.delay 查询延时,单位为毫秒。较低的延时会得到更快的反应,但会加重服务器负担。可选,默认为 1000(1秒)。
5.heading 如果设为 true ,第一个数组值将作为不可选择项(标题栏)。当有两列或两列以上数据时非常有用。可选,默认为 false.
数据提交只需要两个数据
1.type 输入框的name
2.q 搜索关键字(默认UTF-8编码)
您下载的压缩包中,已经包含php和ColdFusion示例,当然这个框架可以适用于所有的编程语言,无平台限制。后台数据输出就是一条 Javascript 语句。一维数组这么写:
new Array(”val1″, “val2″, “val3″);
二维数组这么写:
new Array(
new Array(”第1行条第1列”, “第1行第2列”),
new Array(”第2行条第1列”, “第1行条第2列”),
new Array(”第3行条第1列”, “第1行条第2列”)
);
最后介绍一下,css中需要定义的4个类
.SuggestFramework_List 提示内容所在区域
.SuggestFramework_Heading 第一条提示
.SuggestFramework_Highlighted 设置高亮的一条提示
.SuggestFramework_Normal 其他提示
下载地址 http://xiazai.jb51.net/200903/yuanma/SuggestFramework-0.31.zip
- 使用Ajax模仿百度搜索框的自动提示功能实例
- Servlet+Ajax实现智能搜索框智能提示功能
- Ajax实现智能提示搜索功能
- ASP.NET搭配Ajax实现搜索提示功能
- 利用AjaxControlToolkit实现百度搜索时的下拉列表提示详细步骤
- php+ajax做仿百度搜索下拉自动提示框(有实例)
- asp+ajax仿google搜索提示效果代码
- asp.net+js实现的ajax sugguest搜索提示效果
- Ajax实现搜索框提示功能
Ajax实现类似google搜索下拉框提示功能(4/4)
下面的例子将为您演示当用户在输入框中键入字符时,网页如何与 web 服务器进行通信。
本示例包括2个文件。分别为showhint.html和ShowHintServlet。
以下是详细代码:
showhint.html
ShowHintServlet代码
ASP+AJAX做类似google的搜索提示
主要要文件有:
Index.html 实现功能,一个文本框,输入内容并实现提示
search.asp 查询功能,让文本框输入的内容在数据库中查询,然后返回给客户端
conn.asp 数据库连接功能,实现与数据库相连 xmlhttp.js AJAX 核心部分,用来把客户端的数据传给服务端,再把服务端的数据返还给客户端.
style.css 样式文件,主要是对google提示框查询到的内容进行样式化处理
先看第一个文件style.css
@charset "utf-8";
/* CSS Document */
body
{
font-size:12px;
font-family:Arial,Helvetica,sans-serif;
}
#search_suggest
{
position:absolute;
background:#FFFFFF;
text-align:left;
border:1px #000000 solid;
}
.suggest_link_over
{
background-color:#e8f2fe;
padding:2px 6px;
}
.suggest_link
{
padding:2px 6px;
background-color:#FFFFFF;
}
.none
{
display:none;
}
第二个文件: xmlhttp.js
// JavaScript Documentrt
var xmlHttp = createXmlHttpRequest();
function createXmlHttpRequest()
{
var xmlhttp = null;
try
{
xmlhttp = XMLHttpRequest();
}
catch(e1)
{
try
{
xmlhttp = new ActiveXObject("MSXML2.XMLHTTP");
}
catch(e2)
{
try
{
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
catch(e3)
{
xmlhttp = false;
alert("创建失败!");
}
}
}
return xmlhttp;
}
function change_key()
{
if (xmlHttp.readyState == 4 || xmlHttp.readyState == 0)
{
var str = document.getElementById("txt_key").value;
xmlHttp.open("get","search.asp?key=" + str,true);
xmlHttp.onreadystatechange = handSearchRequest;
xmlHttp.send(null);
}
}
function handSearchRequest()
{
if (xmlHttp.readyState == 4)
{
var div = document.getElementById("search_suggest");
div.innerHTML = "";
var str = xmlHttp.responseText.split("|");
for (var i=0; i<str.length; i++)
{
var suggest = ’<div onmouSEOver="javascript:suggestOver(this);" ’;
suggest += ’onmouSEOut="javascript:suggestOut(this);" ’;
suggest += ’onclick="javascript:setSearch(this.innerHTML);" ’;
suggest += ’>’ + str[i] + ’</div>’;
div.innerHTML += suggest;
}
}
}
function setSearch(div_value)
{
document.getElementById("txt_key").value = div_value;
document.getElementById("search_suggest").className = ’none’;
}
function suggestOver(div_value)
{
div_value.className = ’suggest_link_over’;
}
function suggestOut(div_value)
{
div_value.className = ’suggest_link’;
}
第三个文件:conn.asp
<%
set conn = Server.CreateObject("Adodb.Connection")
connStr = "Provider=sqlOLEDB;Server=./sqlEXPRESS;UID=sa;PWD=sa;Initial catalog=test;"
conn.ConnectionString = connStr
conn.open
%>
第四个文件:search.asp
<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<!-- #include file="conn.asp" -->
<%key = request.QueryString("key")
if (key <> "") then
key = replace(key,"/","")
key = replace(key,"’","or","")
sel_sql = "select [key] from [key] where [key] like ’" & key & "%’"
dim keyword
keyword = ""
set rs = conn.execute (sel_sql)
do while not rs.eof
keyword = keyword & rs(0) & "|"
rs.movenext
loop
response.Write(keyword)
end if
%>
最后一个结果文件:index.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<Meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>google提示 </title>
<mce:script src="xmlhttp.js" mce_src="xmlhttp.js" ></mce:script>
<link rel="stylesheet" type="text/css" href="style.css" mce_href="style.css">
</head>
<body>
<form id="form1" name="form1" method="post" action="">
<input name="txt_key" type="text" id="textarea" autocomplete="off" onkeyup="change_key()"/><br/>
<div id="search_suggest" ></div>
</form>
</body>
</html>
c# – 类似Google的搜索查询标记化和字符串分割
the quick "brown fox" jumps over the "lazy dog"
我想要一个包含以下令牌的字符串数组:
the quick brown fox jumps over the lazy dog
你可以看到,令牌用双引号保留空格.
我正在寻找一些例子,我可以如何在C#中做到这一点,最好不要使用正则表达式,但是如果这是最有意义的,那么最好的就是这样.
此外,我想知道如何扩展它来处理其他特殊字符,例如,在一个术语前面强制排除搜索查询等等.
解决方法
这个正则表达式应该可以解决你的问题:
("[^"]+"|\w+)\s*
这是一个C#使用示例:
string data = "the quick \"brown fox\" jumps over the \"lazy dog\""; string pattern = @"(""[^""]+""|\w+)\s*"; MatchCollection mc = Regex.Matches(data,pattern); foreach(Match m in mc) { string group = m.Groups[0].Value; }
这种方法的真正好处是可以轻松扩展,包括您的“ – ”要求,如下所示:
string data = "the quick \"brown fox\" jumps over " + "the \"lazy dog\" -\"lazy cat\" -energetic"; string pattern = @"(-""[^""]+""|""[^""]+""|-\w+|\w+)\s*"; MatchCollection mc = Regex.Matches(data,pattern); foreach(Match m in mc) { string group = m.Groups[0].Value; }
现在我讨厌阅读Regex和下一个人一样,但是如果你把它分开,这个很容易阅读:
( -"[^"]+" | "[^"]+" | -\w+ | \w+ )\s*
说明
>如果可能匹配一个减号,其次是“随后的一切,直到下一个”>否则匹配一个“后面的一切,直到下一个”>否则匹配a – 后跟任何单词字符>否则可以匹配尽可能多的单词字符>将结果放在一个组中>吞下任何以下的空格字符
我们今天的关于您如何使用T-SQL全文本搜索来获得类似Google的结果?的分享就到这里,谢谢您的阅读,如果想了解更多关于ajax Suggest类似google的搜索提示效果、Ajax实现类似google搜索下拉框提示功能(4/4)、ASP+AJAX做类似google的搜索提示、c# – 类似Google的搜索查询标记化和字符串分割的相关信息,可以在本站进行搜索。
本文标签: