GVKun编程网logo

您如何使用T-SQL全文本搜索来获得类似Google的结果?

7

这篇文章主要围绕您如何使用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的结果?

您如何使用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

看起来很有前途。如果我可以接受用户查询并在逗号之间插入逗号,这将…等待,这与ANDCONTAINS查询中使用布尔值相同。但是它是否正确忽略停用词?

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的搜索提示效果

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)

Ajax实现类似google搜索下拉框提示功能(4/4)

下面的例子将为您演示当用户在输入框中键入字符时,网页如何与 web 服务器进行通信。

本示例包括2个文件。分别为showhint.html和ShowHintServlet。

以下是详细代码:

showhint.html

  • <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  • <html>
  • <head>
  • <title>showhint.html</title>

  • <Meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
  • <Meta http-equiv="description" content="this is my page">
  • <Meta http-equiv="content-type" content="text/html; charset=UTF-8">

  • <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
  • <script language="javascript" type="text/javascript">
  • var xmlHttp;
  • function createXMLHttpRequest(){
  • if(window.ActiveXObject){
  • xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
  • }else if(window.XMLHttpRequest){
  • xmlHttp = new XMLHttpRequest();
  • }
  • }

  • function doRequest(){
  • createXMLHttpRequest();
  • var url = "servlet/ShowHintServlet?q=" + document.getElementById("email").value + "&timeStamp=" + new Date().getTime();
  • xmlHttp.onreadystatechange = handleStateChange;
  • xmlHttp.open("GET",url,true);
  • xmlHttp.send(null);

  • }

  • function handleStateChange(){
  • if(xmlHttp.readyState == 4){
  • if(xmlHttp.status == 200){
  • document.getElementById("hintBox").innerHTML = xmlHttp.responseText;
  • }
  • }
  • }
  • </script>
  • </head>

  • <body>
  • 请输入你的手机号码:
  • <input type="text" name="email" id="email" onkeyup="doRequest()" />
  • <div id="hintBox"></div>
  • </body>
  • </html>
  • ShowHintServlet代码

  • package ajax.study;

  • import java.io.IOException;
  • import java.io.PrintWriter;

  • import javax.servlet.servletexception;
  • import javax.servlet.http.HttpServlet;
  • import javax.servlet.http.HttpServletRequest;
  • import javax.servlet.http.HttpServletResponse;

  • public class ShowHintServlet extends HttpServlet {

  • public void doGet(HttpServletRequest request, HttpServletResponse response)
  • throws servletexception, IOException {

  • response.setContentType("text/html");
  • String[] emails = {
  • "18789245070",
  • "13647579626",
  • "13648649621",
  • "18789273423",
  • "13876221345",
  • "13697542356",
  • "15248939447"

  • };
  • PrintWriter out = response.getWriter();
  • String q = request.getParameter("q");
  • String hint = "";
  • if(q.length()>0){
  • for(int i=0; i<emails.length; i++){
  • if(q.equalsIgnoreCase(emails[i].substring(0, q.length()))){
  • if(hint==""){
  • hint = emails[i];
  • }else{
  • hint = hint + " " + emails[i];
  • }

  • }
  • }
  • }
  • if(hint==""){
  • hint = "no suggestion";
  • }
  • out.println(hint);
  • out.flush();
  • out.close();
  • }


  • public void doPost(HttpServletRequest request, IOException {
  • doGet(request,response);
  • }

  • }
  • ASP+AJAX做类似google的搜索提示

    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的搜索查询标记化和字符串分割

    c# – 类似Google的搜索查询标记化和字符串分割

    我正在寻找类似于Google的搜索查询.例如,如果我有以下搜索查询:
    the quick "brown fox" jumps over the "lazy dog"

    我想要一个包含以下令牌的字符串数组:

    the
    quick
    brown fox
    jumps
    over
    the
    lazy dog

    你可以看到,令牌用双引号保留空格.

    我正在寻找一些例子,我可以如何在C#中做到这一点,最好不要使用正则表达式,但是如果这是最有意义的,那么最好的就是这样.

    此外,我想知道如何扩展它来处理其他特殊字符,例如,在一个术语前面强制排除搜索查询等等.

    解决方法

    到目前为止,这似乎是RegEx的好候选人.如果它变得复杂得多,则可能需要一个更复杂的标记化方案,但是除非必要,否则您应该避免该路由,因为它显着地更多的工作. (另一方面,对于复杂的模式,正则表达式很快就变成一只狗,同样应该避免).

    这个正则表达式应该可以解决你的问题:

    ("[^"]+"|\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的搜索查询标记化和字符串分割的相关信息,可以在本站进行搜索。

    本文标签: