程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> 具體引見基於MySQL的搜刮引擎MySQL-Fullltext

具體引見基於MySQL的搜刮引擎MySQL-Fullltext

編輯:MySQL綜合教程

具體引見基於MySQL的搜刮引擎MySQL-Fullltext。本站提示廣大學習愛好者:(具體引見基於MySQL的搜刮引擎MySQL-Fullltext)文章只能為提供參考,不一定能成為您想要的結果。以下是具體引見基於MySQL的搜刮引擎MySQL-Fullltext正文


 本文涵蓋了一個簡略的C完成的搜刮引擎的搭建始末。

我平日應用SQL Server和C #,但我教C/C++的同伙要闊別微軟。在曩昔,MySQL不是我想要的數據庫,由於尺度裝置版不支撐事務,但它變得愈來愈成熟。我應用64位InnoDB引擎的MySQL 5.6,應用Unicode(utf8)編碼,這是我新數據庫的默許設置。

Freetext是InnoDB的新特點,它在MySQL5.6版中被初次推出。

與C比擬我平日更愛好C++,即便在小項目中:不消曉得一切的函數名,並且有一些內置的經常使用操作和英俊的IntelliSense支撐。在C++中,還有有STL及聚集和字符串助手。


C++的Mysql接口比擬弱,而C的接口很成熟,所以我決議應用C接口。

C的dll文件是和WCF一路宣布的,以便完成AJAX要求,在Visual Studio Ultimate 2012中我應用C#的"WCF Service Application"模板,我搜刮了應用C++搭建WebService的辦法,但只找到一些應用C++處置WebServices挪用的例子。

用戶界面是一個應用Jquery和Jquery-UI主動提醒的HTML界面,頁面被增長到"WCF辦事運用",項目被定名為VisionWeb

網頁看起來是如許的: 

201542294730966.png (360×303)

 我在.NET框架4.0,64位體系上設置裝備擺設這個項目,假如你應用32位的Mysql辦事器,你必須隨之做些更改。記得設置UNICODE選項為默許值。

設置裝備擺設MySQL

你有能夠會從VisionSmall中翻開這個VisionDAL項目, 假定你必需修正銜接MySQL的C法式接口. 在這兒,我引見了若何在新項目中裝置MySQL接口: 檢討那些設置能否相符你的請求,特別是mysql.lib文件和VisionDAL.dll的途徑.

在Visual Studio中,添加一個VisionDAL工程, 經由過程這個流程"Other Languages/Visual C++/Empty Project". 在這當中, 你只須要轉變"運用類型" 為DLL. 把VisionDAL.cpp更名為VisionDAL.c, 這就清晰的告知Visual Studio把編譯器從C++改成C. 給這個工程添加一個頭文件定名為VisionDAL.h.

在窗口中, 右擊VisionDAL工程並選擇屬性. 然後在"設置裝備擺設屬性"/Linker/Input, 選擇 "Additional Dependencies" 而且添加libmysql.lib 到這個途徑, 不要忘卻了分隔符 ";".


在 "設置裝備擺設屬性"/Linker/General這個菜單下, 選擇"添加庫目次" ,對我來講就是添加 C:\Program Files\MySQL\MySQL Server 5.6\lib>這個目次. 如今我們曾經銜接到C接口, 然則在libmysql.lib中挪用履行的DLL必需是體系的可履行途徑: 從掌握面板, 選擇體系, 點擊 "高等體系設置", "點出情況變量" 在 "體系變量"上面,選擇途徑, 並添加這個 libmysql.lib 的途徑 (DLL和這個lib文件在雷同的文件夾裡): C:\Program Files\MySQL\MySQL Server 5.6\lib.

我們也須要把這個VisionDal.dll放到我們的path途徑裡, IIS 其實不能從這個網站的bin目次中取到DLL文件. 添加 <項目途徑>/x64/debug 到途徑變量path裡. 重啟後失效. 當網站獲得一個request要求時將會加載VisionDAL.dll; 假如你如今重建項目, 你會獲得一個VisionDAL.dll的寫入毛病: 為懂得決它, 重啟該網站或是用unlocker之類的解鎖.

假如須要指定VisonDAL的包括屬性. 在 "設置裝備擺設屬性"/"C/C++" 菜單下添加MYSQL的頭文件途徑, 例如像如許: C:\Program Files\MySQL\MySQL Server 5.6\include.


上面我們在“C/C++”/"預編譯頭"菜單欄中,從“預編譯頭”切換到“不應用預編譯頭”,設置Preproccessor界說避免應用strcpy和fopen時發生的毛病新聞:在"C/C++"/預編譯器/"預編譯器界說 "中設定SE_STANDARD_FILE_FUNCTIONS和_CRT_SECURE_NO_WARNINGS。

當你如今銜接,mysqllib援用的成績並沒有處理,由於它們是64位處置器。經由過程在VisionDal中翻開工程屬性,選擇“設置裝備擺設治理”,然後設置為x64平台。


如今我們來創立名為 Vision 的樣本數據庫

翻開SQL Development 中的 MySql 任務台,翻開你的實例。將會湧現一個新窗口 "SQL File 1" 。 雙擊VisionDAL項目中的 Sql.txt 文件。復制一切內容到剪貼板,粘貼到任務台中的"SQL File 1"窗口。 點擊螺栓圖標(右邊第三個圖標),創立樣本數據庫。
接上去我們須要用來數據庫登錄的通用信息。

我們有一個關於此的設置裝備擺設文件: <installation director>VisionSmall\x64\Debug\VisionConfiguration.txt, 看起來像如許:
 
Host: localhost
User: root
Password: frob4frob
Database: vision
Port: 3306

修正這些數值以婚配你的SQL-Configuration。

Vision 數據庫

數據庫中只要一張表
 

CREATE TABLE 'document' (
 'DocumentID' int(11) NOT NULL AUTO_INCREMENT,
 'Title' varchar(255) DEFAULT NULL,
 'Text' text,
 PRIMARY KEY ('DocumentID'),
 FULLTEXT KEY 'ft' ('Title','Text'),
 FULLTEXT KEY 'ftTitle' ('Title')
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

搜刮的時刻我們應用名為'ft'的全文索引,查找主動完成單詞的時刻我們應用名為'ftTitle'的全文索引。

假如你具有一個許多字段的全文索引,你可以在Microsoft SQL Server當選擇,查詢的時刻,哪一個字段被包括進搜刮。在MySQL中,平日全文索引的一切字段都被搜刮,所以我們必需指定額定的全文索引'ftTitle'。

經由過程C接口停止MySQL查詢
起首呢,為了履行查詢我們須要銜接到數據庫並獲得一個MYSQL的指針:
 

  MYSQL *Connect(){
  MYSQL *conn; // Connection
 
  // 銜接到MySQL
  conn = mysql_init(NULL);
  if(mysql_real_connect(
    conn, Configuration.Host, Configuration.User, Configuration.Password,
    Configuration.Database, Configuration.Port, NULL, 0) == NULL) {
      fprintf(stderr, "sorry, no database connection ...\n");
      return NULL;
  }
  return conn;
}

在啟動的時刻我們把VisionConfiguration.txt文件裡的變量賦值到全局變量, 這個文件應當和我們的法式在統一目次. 這是一個例行操作.獲得以後運轉法式目次是經由過程Win32 API的GetModuleFileName函數,以下:

 

TCHAR *GetExecutablePath(){
  TCHAR *pBuf = (TCHAR *)malloc(512);
  int bytes = GetModuleFileName(NULL, pBuf, 255);
  if(bytes == 0)
    return NULL;
  else
    return pBuf;
}

這裡只要一個法式我們想要解釋:GetDocuments. 在頭文件界說:
 

#define FORMAT_TEXT 0
#define FORMAT_JSON 1

__declspec(dllexport) TCHAR*   __cdecl GetDocuments(TCHAR *search, int format, int forAutocomplete);
在資本文件中界說:
 
__declspec(dllexport) TCHAR* GetDocuments(TCHAR *search, int format, int forAutocomplete)

__declspec(dllexport)的聲明和界說完成是經由過程添加到VisionDAL.lib文件並經由過程VisionDAL.dll文件輸入.__cdecl界說若何挪用這個進程, 這裡我們應用C作風的挪用商定.當UNICODE界說被設置時,TCHAR和WCHAR是一樣的,不然TCHAR就是一個簡略的char, 假定我們這裡的UNICODE 曾經設置好了.

  •     留意這裡有一些分歧的 Unicode格局:
  •     在C說話裡我們應用兩個字節來表現一個char值
  •     在MYSQL和.NET 框架的UTF-8格局, 它意味著一個字節對應一個字符而且僅在跨越一個字節被應用時
  •     在終端法式中經由過程用一個字符對應一個字符而且當值年夜於127時應用Codepage 850.

參數格局是 FORMAT_TEXT 和 FORMAT_JSON,來包管輸入在text和 JSON之間.

假如forAutocomplete是true,那末只要題目被搜刮並前往.

VisionDALClientConsole

VisionDALClientConsole是一個很小的Windows Console運用法式。測試我們的GetDocuments法式將會觸及到VisionDAL工程聚集,它將文件從VisionDAL輸入到 VisionSmall\x64\Debug 。

VisionDALClientConsole 收回搜刮字串要求,包含通配符“*”,它將會搜刮title列和text列,並經由過程挪用GetDocuments將字符輸入。

一個簡略的例子: 

https://www.aspphp.online/shujuku/UploadFiles_3118/201707/2017072814404096.png (677×343)

 main 進口:
 

int _tmain(int argc,TCHAR* argv[])
{
  char c;
  TCHAR *result;
  TCHAR *search = (TCHAR *)malloc(1000*2);
  char *searchA = (char *)malloc(1000);
  int retval = 1;
  char buffer[32000];
 
  buffer[0]=0;
  printf("Search for: ");
  /* wscanf doesn't get umlauts */
  if(scanf("%[^\n]", searchA) <= 0){
    printf("Could not read input - retrieving all Documents \n");
    *search=0;
  }else{
    MultiByteToWideChar(850,0,searchA, -1,search, 999);
  }
  result=GetDocuments(search, FORMAT_TEXT, 0);
  if(result == NULL){
    retval = 0;  
  }else{
    WideCharToMultiByte(850,0,result, -1,buffer, 32000,NULL,NULL);
    printf("%s", buffer);
  }
  fflush(stdin);
  printf("Press RETURN Key to Exit\n");
  getchar();
  return retval;
}

在Microsoft C V.12中依照通例可以處置Unicode-16字串。在函數字串開端加上w或是用wcs調換str,如:wscanf,wprintf和wcslen調換的是strlen。用wscanf不克不及准確的處置寬窄字符轉化。我用MultiByteToWideChar,codepage用850來轉化寬字符和用WideCharToMultiByte轉化為普通字符。

查詢MySQL數據庫

下面我演示了若何銜接數據庫和取得一個叫做conn的銜接點。

接上去我們樹立SQL查詢:
 

mysql_query(conn, "SET NAMES 'utf8'");
if(forAutocomplete){
  if(search == NULL || wcslen(search) ==0){
    WideCharToMultiByte(CP_UTF8,0,
     L"SELECT Title from Document LIMIT 20",-1,sql,1000,NULL,NULL);
  }else{
    wsprintf(lbuffer, L"SELECT Title, match(Title) against('%ls' IN
     BOOLEAN MODE) as Score from Document where match(Title) against('%ls'
     IN BOOLEAN MODE) > 0.001 order by Score Desc LIMIT 20",
      search, search);
    WideCharToMultiByte(CP_UTF8,0,lbuffer,-1,sql,1000,NULL,NULL);
  }
}else if(search == NULL || wcslen(search) ==0){
  WideCharToMultiByte(CP_UTF8,0,L"SELECT DocumentID, Title, Text from Document",-1,sql,1000,NULL,NULL);
}else{    
  wsprintf(lbuffer, L"SELECT DocumentID, Title, Text, match(Title, Text)
       against('%ls' IN BOOLEAN MODE) as Score from Document where match(Title, Text)
       against('%ls' IN BOOLEAN MODE) > 0.001 order by Score Desc",
    search, search);
  WideCharToMultiByte(CP_UTF8,0,lbuffer,-1,sql,1000,NULL,NULL);
}

查詢match(Title, Text) against('%ls' IN BOOLEAN MODE)在列Title和Text中查詢要搜刮的字符串,並前往一個反應查詢婚配情形的值。只要分數年夜於0.001的文檔將顯示,輸入成果按評分排序。

IN BOOLEAN MODE時多個單詞的搜刮分離停止。

在搜刮字符串中,你可使用“*”作為通配符,它婚配0到n個字符。例如“as*”會婚配ASP。搜刮不辨別年夜小寫。在SQL server中有些破例,“as**”不婚配任何內容,“*SP”也不婚配,你可以在字符串的開首婚配通配符。

取得數據

 

if(mysql_query(conn, sql)) {
  fprintf(stderr, "%s\n", mysql_error(conn));
  fprintf(stderr, "%s\n", sql);
  return NULL;
}
  // Process results
result = mysql_store_result(conn);
  ...
  while((row = mysql_fetch_row(result)) != NULL) {
  if(format == FORMAT_TEXT){
    MultiByteToWideChar(CP_UTF8,0,row[0], -1,buffer, 255);
    wsprintf(resultBufferp,L"%s\t", buffer);
    resultBufferp+=wcslen(buffer)+1;
    MultiByteToWideChar(CP_UTF8,0,row[1], -1,buffer, 255);
    wsprintf(resultBufferp,L"%s\t", buffer);
    resultBufferp+=wcslen(buffer)+1;
    MultiByteToWideChar(CP_UTF8,0,row[2], -1,buffer, 32000);
    wsprintf(resultBufferp,L"%s\n", buffer);
    resultBufferp+=wcslen(buffer)+1;
  }else if(format == FORMAT_JSON){
    if(!forAutocomplete){
      MultiByteToWideChar(CP_UTF8,0,row[0], -1,buffer, 255);
      wsprintf(resultBufferp,L"{\"DocumentID\": %s, ", buffer);
      resultBufferp+=wcslen(buffer)+wcslen(L"{\"DocumentID\": , ");
      MultiByteToWideChar(CP_UTF8,0,row[1], -1,buffer, 255);
      wsprintf(resultBufferp,L"\"Title\": \"%s\", ", buffer);
      resultBufferp+=wcslen(buffer)+wcslen(L"\"Title\": \"\", ");
      MultiByteToWideChar(CP_UTF8,0,row[2], -1,buffer, 32000);
      wsprintf(resultBufferp,L"\"Text\": \"%s\"},", buffer);
      resultBufferp+=wcslen(buffer)+wcslen(L"\"Text\": \"\"},");
    }else{
      MultiByteToWideChar(CP_UTF8,0,row[0], -1,buffer, 255);
      wsprintf(resultBufferp,L"\"%s\",", buffer);
      resultBufferp+=wcslen(buffer)+wcslen(L"\"\",");
    }
  }
}

mysql_query 將查詢發送到辦事器。mysql_store_result將成果預備為一個聚集,你可用mysql_fetch_row(result)停止迭代。不管列具有甚麼數據類型,每行都是一個字符串數組。我更愛好ADO.NET中的具有類型的列。在.NET中,我們能夠應用StringBuilder來集合成果字符串,這裡我們經由過程malloc和增加resultBufferp指針來定位char[]。我們應用MultiByteToWideChar來轉換到WCHAR。
 
 JSON 格局

我決議不采取XML格局,而應用輕量級的 JSON-格局,以此來從Web頁面經由過程AJAX與Webservice通信。

JSON-輸入看起來像如許
 

[{"DocumentID": 1, "Title": "ASP MVC 4", "Text":
   "Was für Profis"},{"DocumentID": 2, "Title": "JQuery",
   "Text": "Hat Ajax Support"},{"DocumentID": 3, "Title": "
WebServices", "Text": "Visual C++ kanns nicht"},{"DocumentID": 4,
 "Title": "Boost", "Text": "Muss Extra installiert werden"}]
 在參數主動完成為真的時刻,JSON-看起來像如許:
?
1
 
["ASP MVC 4","JQuery","WebServices","Boost"]

  "[]" 符號注解了一個數組的開端與停止, "{}" 標清楚明了一個對象的開端與停止。在一個對象中,":"後面的部門是屬性稱號,在它前面的部門是屬性值。與之相似的,在你用JavaScript編碼的時刻也差不多一樣。經由過程JavaScript-敕令JSON.parse,你獲得一個完全的對象,這個對象的屬性可以經由過程平日的"." 符號拜訪。

為 GetDocuments 辦法搭建 Webservice

我應用"Visual C#/WCF/WCF Service Application"模板創立了 VisionWeb項目,須要添加需要的System.ServiceModel援用。

下一步我們應用 NuGet 來添加需要的 JavaScript 庫。選擇 "Tools/Library Packet Manager/Package Manager Console" 並履行以下敕令:
 

Install-Package jQuery
Install-Package jQuery.UI.Combined

下一步我們在 “  App-Code/IVisionService.cs” 文件中界說 service contract  :
 

namespace VisionServices
{
  [ServiceContract(SessionMode = SessionMode.Allowed)]
  public interface IVisionService
  {
    [OperationContract]
    [WebInvoke(
      Method = "POST",
      BodyStyle = WebMessageBodyStyle.WrappedRequest,
      RequestFormat = WebMessageFormat.Json,
      ResponseFormat = WebMessageFormat.Json)]
    string GetDocuments(string search, int format, int forautocomplete);  
  } 
}

WebInvoke 屬性是包管 service 可以或許被Ajax挪用。我選擇POST作為在HTTP要求中傳遞參數的方法。這個可選擇的 GET 方法, 會加密而且裸露在URL中的參數。
我們指定以JSON格局發送要求和呼應。當傳遞一個或多個參數時必需應用

BodyStyle = WebMessageBodyStyle.WrappedRequest。
你可使用 WebMessageBodyStyle.Bareif ,如許你會獲得零或許一個參數。

Webservice的完成

我們將完成界說在 "App-Code/IVisionService.cs"中:
 

namespace VisionServices
{
  public class PInvoke
  {
    [DllImport("VisionDAL.dll", CharSet = CharSet.Unicode)]
    public static extern string GetDocuments(string search, int format, int forAutocomplete);
  }
  public class VisionService : IVisionService
  {
    public string GetDocuments(string search, int format, int forautocomplete)
    {
      string result = PInvoke.GetDocuments(search, format, forautocomplete).ToString();
      return result;
    }
  }
}

VisionService.svc的完成

 

<%@ ServiceHost Language="C#" Debug="true" Service="VisionServices.VisionService" CodeBehind="App_Code\VisionService.cs" %>

這裡界說了挪用"http://<your webserver>:<your port>VisionService.svc"時的辦事端點 ,挪用GetDocuments函數的URL地址是 "http://<your webserver>:<your port>VisionService.svc/GetDocuments"。

Web.config 文件
 

<?xml version="1.0"?>
<configuration>
 <appSettings/>
 <system.web>
  <httpRuntime/>
  <compilation debug="true"/>
 </system.web>
 <system.serviceModel>
  <services>
   <service name="VisionServices.VisionService">
    <endpoint address="" binding="webHttpBinding"
       contract="VisionServices.IVisionService" behaviorConfiguration="webHttpEndpoint"/>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
   </service>
  </services>
  <behaviors>
   <endpointBehaviors>
    <behavior name="webHttpEndpoint">
     <webHttp helpEnabled="true"/>
    </behavior>
   </endpointBehaviors>
   <serviceBehaviors>
    <behavior>
     <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
     <serviceDebug includeExceptionDetailInFaults="true"/>
    </behavior>
   </serviceBehaviors>
  </behaviors>
  <serviceHostingEnvironment aspNetCompatibilityEnabled="false" multipleSiteBindingsEnabled="true"/>
 </system.serviceModel>
 <system.webServer>
  <modules runAllManagedModulesForAllRequests="true"/>
  <directoryBrowse enabled="true"/>
 </system.webServer>
</configuration>

這是許可Ajax要求的設置裝備擺設。 你可使用許多選項來設置裝備擺設WCF。你可以到Safari上檢查更多相似於[2]的文檔。

<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>設置裝備擺設了一個供給元數據交流的端點,經由過程元數據你可以主動生成代碼來取得WebService署理,好比應用svcutil。選擇"Programs/Microsoft Visual Studio 2012/Visual Studio Tools/Developer Command Prompt for VS2012". 輸出svcutil http://localhost:8001/VisionService.svc.一個名為VisionService.cs 的文件就生成了, 在其他情形下也會生成一個包括了Webservice設置裝備擺設信息的文件。

托管網站

啟動“設置/掌握面板/治理對象/ Internet信息辦事(IIS)治理器”。當沒有裝置iis的時刻,導航到“運用法式池”,找到正在運轉.Net Framework 4.0版本運用法式池的稱號,或許添加一個新的運用法式池。導航到“網站”節點,右擊它,然後選擇“添加網站...”,應用Vision作為網站的稱號,為這個運用選擇一個正在運轉的 .Net Framework 4.0版本運用池。應用 <vision installdir>/VisionWeb作為物理途徑,設置端口為8001.選擇屬性上VisionWeb項目,選擇“收集”,選中“應用自界說的Web辦事器”,輸出辦事器URL http://localhost:8001。你可使用其他的選項來托管網站,例如在IIS Express中,然則假如你不想轉變Default.html文件,你必需將端口設置為8001。

HTML/JQuery 頁面

在VisionWeb中有個名為Default.html的單一HTML頁面,它包括了HTML與JavaScript的內容,它被標為肇端頁。

異樣這裡是這個頁面的模樣:

https://www.aspphp.online/shujuku/UploadFiles_3118/201707/2017072814404015.png (360×303)

<html>
<head>
  <title>Search</title>
  <script src="Scripts/jquery-2.0.2.js"></script>
  <script src="Scripts/jquery-ui-1.10.3.js"></script>
  <link href="Content/themes/base/jquery.ui.autocomplete.css" rel="stylesheet" />
  <style type=text/css>
    .ui-menu-item {
      background: White;
    }
    .ui-helper-hidden-accessible { display:none; }
  </style>
</head>

HTML代碼解釋了這是一個HTML 5的文檔類型。接著我們包括進了必需的JavaScript文件。在jQuery-UI中我們只用到了主動完成插件,為此我們還包括了它的CSS文件。

關於主動完成對象,包括了類[__em all="[object HTMLCollection]"__] .ui-menu-item,我們將配景設置為白色,否則的話它的通明配景會使表格的內容穿顯露出來。


[__em all="[object HTMLCollection]"__].ui-helper-hidden-accessible { display:none; }將一個煩人的贊助信息從主動完成插件移走。
 

<form>
    <label for="search" >Search:</label>
    <input type="text" id="search", name="search" />
    <input type="button" id="update" name="update" value="Update" />
     <div id="result"></div>
  </form>

表單中的元素被賦以了id,是以你可以相似$('#result')用jQuery取得它們。你還可以用jQuery取代縮寫的$,例如[__em all="[object HTMLCollection]"__] jQuery('#result')。JavaScript的函數挪用document.getElementById('result')具有異樣的後果,然則jQuery支撐一切類型的CSS選擇符。


我應用無侵入的JavaScript,也就是說html代碼沒有混在JavaScript代碼中。事宜處置器是在function$(document).ready(function ()辦法中綁定的,這個辦法會在頁面加載後履行。 

$(document).ready(function () {
  $('#update').bind('click', GetDocuments);
  $('#search').bind("keydown", GetInput);
  $("#search").autocomplete({
    source: function (request, callback) {
      GetAutocomplete();
      callback(Documents);
    },
    open: function (event) {
      var $ul = $(this).autocomplete("widget");
    }
  });
});

當你點擊"update"按鈕的時刻會履行GetDocuments辦法。它會停止一次全文檢索然後將成果顯示到一個HTML表格中:
 

function GetDocuments(e) {
var searchstring = $('#search').val();
if (searchstring.length > 0) {
  if (searchstring[searchstring.length - 1] != "*") {
    searchstring += "*";
  }
}
$.ajax({
    type: 'POST',
    url: 'http://localhost:8001/VisionService.svc/GetDocuments',
    dataType: 'json',
    crossDomain: true,
    data: JSON.stringify({ search: searchstring, format: 1, forautocomplete: 0 }),
    processData: true,
    contentType: "application/json ; charset=utf-8",
    success: function (json, textStatus) {
      var result = JSON.parse(json);
      var display;
      display = "";
      display += "<table id='mytable' border=2 <thead><th style='text-align:left'
         >ID</th><th style='text-align:left' >Title</th><th
         style='text-align:left' >Text</th></thead><tbody>";
      $.each(result, function (index, value) {
        display += "<tr>";
        display += "<td>" + value.DocumentID + "</td>";
        display += "<td>" + value.Title + "</td>";
        display += "<td>" + value.Text + "</td>";
        display += "<tr>";
      });
      display += "</tbody></table>";
      $('#result').empty()
      $('#result').html(display);
    },
    error: function (xhr, textStatus, errorThrown) {
      alert('An error occurred! ' + (errorThrown ? errorThrown : xhr.status) +
       " xhr: " + xhr + " textStatus: " + textStatus);
    }
  });
}

我們把查詢表單中"search"字段的值付給變量searchstring,然後,當searchstring中不包括"*"通配符的時刻,我們在厥後面添加通配符"*",jQuery供給了對Ajax的支撐,好比$.ajax()辦法。

你可以從這兒檢查關於這個辦法的解釋:jQuery.ajax()。

url:制訂了我們在WCF運用中設置裝備擺設好的途徑。就如我們在WCF運用中設置的一樣,我們應用JSON數據格局。在success辦法(這個辦法會在ajax要求勝利後被異步驟用)中,我們獲得了json變量,也就是GetDocuments辦法輸入的值。經由過程簡略的挪用JSON.parse(json)辦法,我們取得了一個完整成熟的JavaScript對象,我們應用這個對象生成Html表格。result>變量是一個JavaScript對象數組。jquery的$.each辦法遍歷全部數組,當辦法履行的時刻,應用以後數組元素的索引和處於以後索引地位的元素作為參數。我們經由過程挪用$('#result').html(display)來顯示Html代碼,從而生成我們的成果DIV。底層數據:我們應用JSON.stringify辦法將用來傳輸的數據轉化為JavaScript對象並將其作為參數。當產生毛病的時刻,在error:前面的代碼將會履行。

主動完成是若何任務的

在我們的 JavaScript 代碼開首,我們描寫了一個全局變量,用來將用於主動完成的單詞保留在一個數組中:var Documents = [];。 函數GetAutocomplete填充了Documents數組。 Autocomplete函數:
 

function GetAutocomplete(e) {
  var searchstring = $('#search').val();
  if (searchstring.length > 0) {
    if (searchstring[searchstring.length - 1] != "*") {
      searchstring += "*";
    }
  }
  $.ajax({
    type: 'POST',
    url: 'http://localhost:8001/VisionService.svc/GetDocuments',
    dataType: 'json',
    data: JSON.stringify({ search: searchstring, format: 1, forautocomplete: 1}),
    processData: true,
    async: false,
    contentType: "application/json ; charset=utf-8",
    success: function (json, textStatus) {
      Documents = JSON.parse(json);
    },
    error: function (xhr, textStatus, errorThrown) {
      alert('An error occurred! ' + (errorThrown ? errorThrown : xhr.status) +
       " xhr: " + xhr + " textStatus: " + textStatus);
    }
  });
}

這看起來異常像GetDocuments函數。success 函數只是更新了Documents變量,經由過程JSON.parse來將Webservice的輸入停止轉換。留意async: false,這使得挪用是異步的。這個主動完成插件會挪用GetAutocomplete函數,並立刻顯示Documents。


在 $(document).ready(function () 中初始化主動完成插件:
 

$("#search").autocomplete({
  source: function (request, callback) {
    GetAutocomplete();
    callback(Documents);
  },
  open: function (event) {
    var $ul = $(this).autocomplete("widget");
  }
});

你可以在這裡找到關於主動完成的信息:主動完成。

在搜刮框中處置 [RETURN] 鍵:
 

$('#search').bind("keydown", GetInput);
 
function GetInput(e) {
  if (e.keyCode == 13) {
    e.preventDefault();
    GetDocuments(e);
    $('#search').autocomplete("close");
  }
}

e.preventDefault();停滯了對以後事宜的處置。

調試

你可以在web閱讀器中輸出 URL http://localhost:8001/VisionService.svc。假如辦事激活掉敗,將會有一條信息提醒,例如 VisionDAL.dll 沒法加載。你可以用像Fiddler 之類的對象檢測其間的http通訊。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved