本文章是由機器翻譯。

Microsoft Azure

Azure Search 讓您探索更多的資料

Bruno Terkaly

下載代碼示例

Bruno Terkaly 資料探索、 即時分析和機器學習等領域都被應用於許多創造性的方式。公司正在建設圍繞開放源碼套裝軟體各種有趣的架構。蔚藍的搜索是這樣一塊更大的體系結構。蔚藍的搜索是一個強大的新的搜索體驗,為您的 Web 網站和應用程式 — — 即使你不是一個搜索專家。

蔚藍的搜索是一個使用簡單的 REST API 的完全託管的、 基於雲計算的服務。它包括類型前面的建議,建議的結果接近匹配、 多方位的導航和基於需要的能力的適應能力的基礎。蔚藍搜索提供全文本搜索與權重、 排名和您自己的搜索行為基於由 field 屬性組合定義的架構。資料立即建立索引,這最小化搜索延遲。

有效的搜索需要越來越規模龐大的資料存儲區。在 facebook 上獨自,使用者花了數以億計的分鐘搜索每個月。要有效地搜索維琪百科,將索引 1700 萬條目。Twitter 擁有超過 6 億使用者,生成 = 每天超過 50,000 的推文。執行這種規模的全文本搜索需要一些創造性的工程。索引和牧師所有這資訊並不適合膽小的心。

對於哪個搜尋引擎是其業務的一個組成部分的許多公司正著手與 Azure G 系列虛擬機器使用 32 個內核,448 GB RAM 和 6.5 TB 的固態磁碟機 (SSD)。有些工程師正在編寫自訂程式集和 C 代碼來優化快取一致性的資料和指令緩存。他們使用緩存來減少所用的時間的 CPU 的坐在那裡等待記憶體請求履行,並減少需要傳輸的資料總量。在這些巨大的、 多核的機器內的一個挑戰是有多個執行緒爭奪記憶體匯流排。 利用 L2 和 L3 快取記憶體的性能提升是數量級的順序更有意義。這一切很重要,因為大量的資料快速進入你的全文搜尋引擎是關鍵。

全文本搜索做得正確

蔚藍的搜索提供了許多優勢。它減少了複雜的設置和管理您自己的搜索索引。它是完全託管的服務,説明您避免麻煩,處理索引損壞、 服務可用性、 縮放和服務的更新。大的優點之一是 Azure 搜索支援豐富、 精確的排序模型。這允許您綁到業務目標的搜尋結果。它還提供多語言搜索、 拼寫錯誤校正及類型前面的建議。如果搜尋結果很薄弱,Azure 搜索可以建議查詢基於接近的匹配項。你可以在資源調配新的 Azure 搜索實例在快速的教程 bit.ly/1wYb8L8

本教程將引導你通過入門,你需要在入口網站執行的步驟。你會提供 Azure Azure 監管中心中搜索 (portal.azure.com),這需要兩件事情:通過入口網站提供的 URL,本身和 API 金鑰。URL 表示在雲中運行您的用戶端應用程式將談談你 Azure 搜索服務端點。API 金鑰將需要小心,保護因為它提供了所有的訪問到您的服務。畢竟,你不能允許任何用戶端存取 Azure 搜索服務而無需經過身份驗證與此鍵。

有限制和約束的你應該意識到在索引,每個索引的最大欄位的數目,最大文檔數量,等等。一個重要的限制是有未獲配額或與查詢相關聯的最高限額。查詢每秒 (檢疫) 是可變的具體取決於可用頻寬和系統資源的競爭。

用免費的 Azure 搜索服務,蔚藍的計算和存儲資源支援您共用的服務由多個訂閱伺服器,共用,所以檢疫為您的解決方案將取決於有多少工作負載運行在同一時間。專用 (標準 SKU 的) 服務,全部奉獻給客戶和資源不能共用。

一旦你有你的 URL 和 API 密匙,你準備好要使用這項服務。最簡單的方式做到這一點是提琴手,因為它可以讓您撰寫自己的 HTTP 要求。(得到一份免費的提琴手在 bit.ly/1jKA1UJ.)蔚藍搜索使用簡單的 HTTP,所以很瑣碎與提琴手的插入和查詢資料 (請參閱圖 1)。後來在這篇文章,你會看到如何使用 Node.js 談談 Azure 搜索。

執行插入到 Azure 搜索使用提琴手
圖 1 執行插入到 Azure 搜索使用提琴手

正如你所看到的有四樣東西用來擔心自己:

  • HTTP 謂詞
  • URL
  • 請求標頭
  • 請求頁腳

HTTP 謂詞 (放、 發佈、 獲取或刪除) 映射到不同的操作,是否架構定義操作、 資料插入操作等等。舉個例子,把地圖放到架構定義和郵政將映射到資料插入操作。可用從 Azure 門戶 URL 並可能隨您的查詢參數。在請求標頭中發送,API 金鑰。請求正文始終是一個 JSON 表示架構或資料被插入。

蔚藍的搜索可以發揮更大體系結構中的關鍵作用。圖 2 演示利用 Azure 搜索架構。開頭的基本驗證層,在那裡你有一些選項。例如,您可以使用 Azure 活動目錄圖形 API 與 Node.js 使用 OAuth2。 談到 Node.js,你可以使用它作為 URL 的 Azure 搜索,提供一些結構和控制對您的服務終結點的代理。

蔚藍搜索更大體系結構中
圖 2 蔚藍搜索更大體系結構中

Azure 搜索的最顯著特性之一是你可以索引和搜索幾乎任何結構化的資料 — — 除了照片、 圖像和視頻。圖 2 Azure 搜索說明某些潛在的資料來源。由於關係資料庫並不適合於執行全文檢索搜尋,很多初創公司及其關係的資料,將關鍵的資料匯出到 Azure 搜索。這也是有益的因為它可以在關係資料庫中進行全文檢索搜尋的負擔。

這並不意味著 Azure 搜索是結束所有,或者是所有。您仍然需要排雷資料使用 Hadoop 或 HDInsight 地圖/減少科技應用機器學習的演算法,聚類,如文字文件分為局部相關檔。

想像一下分析一條 tweet,給它一個分數的可能性有多大,它屬於一些其他類別中。例如,您可能有一個類別的演說呼籲充滿感情的批評或另一種稱為叫嚷積極發表意見。線性分類器演算法通常用於這種洞察力。蔚藍的搜索並不是有這個能力。但是想像一下你在 Azure 搜索文檔編制索引的方式基於你進行分類和分析資料的方式。

Node.js

現在我會把我的注意力轉向寫作 Node.js 的前端,以會為在 Azure 搜索代理層。

  • 第 1 步要求您完成早些時候在這篇文章指出,以致 Azure 搜索設置在門戶獲得入門的教程。還記得你需要的 URL 和 API 金鑰。
  • 第 2 步要求您下載並在您的開發電腦上本地安裝 Node.js 運行時。你可以在 nodejs.org/download 找到這。我安裝資料夾 c:\program files\nodejs 以告終。它被推薦給你一個基本的"你好世界"在進一步行動之前在 Node.js 運行。
  • 第 3 步要求您確認節點封裝管理員(NPM) 上正確安裝和配置。新公共管理允許您在故宮註冊表上安裝 Node.js 應用 (JavaScript)。
  • 第 4 步涉及安裝 elasticsearch 套裝軟體,簡化了編寫代碼與 Azure 搜索進行通信。

一旦你完成了這些步驟,你準備好要返回到命令提示符處,導航到任何你喜歡的目錄和開始編寫代碼。如果您遇到與故宮的一些錯誤,您可能需要驗證某些環境變數:

C:\node>set nodejs=C:\Program Files\nodejs\
C:\node>set node_path=C:\Program Files\nodejs\node_modules\*
C:\node>set npm=C:\Program Files\nodejs\

打造出了 Node.js 解決方案

現在你準備好要開發一些 Node.js 代碼來在您的本地系統來說明溝通 Azure 搜索上執行。Node.js 在 Azure 搜索使得它易於插入和查詢資料。假設您有 terkaly.search.windows.net Azure 搜索 URL。 你會從 Azure 監管中心。你還需要您的 API 金鑰,本例中是 B7D12B8CA3D018EC09C754F95CA552D2。

有不止一種方法來開發 Node.js 應用程式在您的本地電腦上。如果你愛調試器在Visual Studio,那麼你會想要使用 Node.js 工具外掛程式的Visual Studio(nodejstools.codeplex.com)。如果你喜歡命令列,請查閱 Nodejs.org。 一旦你安裝 Node.js,是重要的是整合故宮。這允許您在故宮註冊表上安裝 Node.js 應用程式可用。在這裡使用的核心封裝調用請求。

中的代碼圖 3 是簡單的。它做同樣的事情,如在本教程中所述 bit.ly/1Ilh6vB,唯一的區別在於你已經實現了此代碼和 Node.js 使用請求包。代碼覆蓋了一些更通用的用例,如創建索引,將資料插入和,當然,執行查詢。有很多回檔定義架構,插入資料和查詢資料。

圖 3 Node.js 代碼,以演示如何創建一個索引,將資料插入和查詢資料

var request = require('request');
//////////////////////////////////////////////////
// OPTIONS FOR HTTP PUT
// Purpose:    Used to create an index called hotels
//////////////////////////////////////////////////
var optionsPUT = {
  url: 'https://terkaly.search.windows.net/indexes/hotels?api-version=2014-07-31-Preview',
  method: 'PUT',
  json: true,
  headers: {
    'api-key': 'B7D12B8CA3D018EC09C754F95CA552D2',
    'Content-Type': 'application/json'
  },
  body: {
    "name": "hotels",
    "fields": [
      { "name": "hotelId", "type": "Edm.String", "key": true, "searchable": false },
      { "name": "baseRate", "type": "Edm.Double" },
      { "name": "description", "type": "Edm.String", "filterable": false, 
        "sortable": false,
        "facetable": false, "suggestions": true },
      { "name": "hotelName", "type": "Edm.String", "suggestions": true },
      { "name": "category", "type": "Edm.String" },
      { "name": "tags", "type": "Collection(Edm.String)" },
      { "name": "parkingIncluded", "type": "Edm.Boolean" },
      { "name": "smokingAllowed", "type": "Edm.Boolean" },
      { "name": "lastRenovationDate", "type": "Edm.DateTimeOffset" },
      { "name": "rating", "type": "Edm.Int32" },
      { "name": "location", "type": "Edm.GeographyPoint" }
    ]
  }
};
//////////////////////////////////////////////////
// OPTIONS FOR HTTP POST
// Purpose: Used to insert data  
//////////////////////////////////////////////////
var optionsPOST = {
  url: 'https://terkaly.search.windows.net/indexes/hotels/docs/
    index?api-version=2014-07-31-Preview',
  method: 'POST',
  json: true,
  headers: {
    'api-key': 'B7D12B8CA3D018EC09C754F95CA552D2',
    'Content-Type': 'application/json'
  },
  body: {
    "value": [
    {
      "@search.action": "upload",
      "hotelId": "1",
      "baseRate": 199.0,
      "description": "Best hotel in town",
      "hotelName": "Fancy Stay",
      "category": "Luxury",
      "tags": ["pool", "view", "wifi", "concierge"],
      "parkingIncluded": false,
      "smokingAllowed": false,
      "lastRenovationDate": "2010-06-27T00:00:00Z",
      "rating": 5,
      "location": { "type": "Point", "coordinates": [-122.131577, 47.678581] }
    },
    {
      "@search.action": "upload",
      "hotelId": "2",
      "baseRate": 79.99,
      "description": "Cheapest hotel in town",
      "hotelName": "Roach Motel",
      "category": "Budget",
      "tags": ["motel", "budget"],
      "parkingIncluded": true,
      "smokingAllowed": true,
      "lastRenovationDate": "1982-04-28T00:00:00Z",
      "rating": 1,
      "location": { "type": "Point", "coordinates": [-122.131577, 49.678581] }
    },
    {
      "@search.action": "upload",
      "hotelId": "3",
      "baseRate": 279.99,
      "description": "Surprisingly expensive",
      "hotelName": "Dew Drop Inn",
      "category": "Bed and Breakfast",
      "tags": ["charming", "quaint"],
      "parkingIncluded": true,
      "smokingAllowed": false,
      "lastRenovationDate": null,
      "rating": 4,
      "location": { "type": "Point", "coordinates": [-122.33207, 47.60621] }
    },
    {
      "@search.action": "upload",
      "hotelId": "4",
      "baseRate": 220.00,
      "description": "This could be the one",
      "hotelName": "A Hotel for Everyone",
      "category": "Basic hotel",
      "tags": ["pool", "wifi"],
      "parkingIncluded": true,
      "smokingAllowed": false,
      "lastRenovationDate": null,
      "rating": 4,
      "location": { "type": "Point", "coordinates": [-122.12151, 47.67399] }
    }
    ]
  }
};
//////////////////////////////////////////////////
// OPTIONS FOR HTTP GET
// Purpose:    Used to do a perform a query
//////////////////////////////////////////////////
var optionsGET = {
  url: 'https://terkaly.search.windows.net/indexes/hotels/
    docs?search=motel&facet=category&facet=rating,
    values:1|2|3|4|5&api-version=2014-07-31-Preview',
  method: 'GET',
  json: true,
  headers: {
    'api-key': 'B7D12B8CA3D018EC09C754F95CA552D2',
    'Content-Type': 'application/json'
  },
  body: {
  }
};
request(optionsPUT, callbackPUT);
//////////////////////////////////////////////////
// Purpose:    Used to create an index
// Http Verb:  PUT
// End Result: Defines an index using the fields
// that make up the index definition.
//////////////////////////////////////////////////
function callbackPUT(error, response, body) {
  if (!error) {
    try {
      if (response.statusCode === 204) {
          console.log('***success in callbackPUT***');
          request(optionsPOST, callbackPOST);
      }
    } catch (error2) {
      console.log('***Error encountered***');
      console.log(error2);
    }
  } else {
    console.log('error');
    console.log(error);
  }
}
//////////////////////////////////////////////////
// Purpose:    Used to insert data
// End Result: Inserts a document
//////////////////////////////////////////////////
function callbackPOST(error, response, body) {
  if (!error) {
    try {
      var result = response.request.response.statusCode;
      if (result === 200) {
          console.log('***success in callbackPOST***');
          console.log("The statusCode = " + result);
        // Perform a query
        request(optionsGET, callbackGET);
      }
    } catch (error2) {
      console.log('***Error encountered***');
      console.log(error2);
    }
  } else {
    console.log('error');
    console.log(error);
  }
}
//////////////////////////////////////////////////////////////
// Purpose:    Used to retrieve information
// Http Verb:  GET
// End Result: Query searches on the term "motel" and retrieves
// facet categories for ratings.
//////////////////////////////////////////////////////////////
function callbackGET(error, response, body) {
  if (!error) {
    try {
      var result = response.request.response.statusCode;
      if (result === 200) {
          result = body.value[0];
          console.log('description = ' + result.description);
          console.log('hotel name = ' + result.hotelName);
          console.log('hotel rate = ' + result.baseRate);
      }
      console.log('***success***');
    } catch (error2) {
      console.log('***Error encountered***');
      console.log(error2);
    }
  } else {
    console.log('error');
    console.log(error);
  }
}

回檔鏈是直截了當的以及。它以簡單的 GET 開頭,然後移動到付諸表決,郵政和第二次獲得 (和查詢)。它表明你會用 Azure 搜索的核心業務。首先,創建的文檔後,您將添加架構的。使用 PUT HTTP 動詞來定義的架構。接下來,使用後插入資料。最後,使用 GET 查詢資料。

接近尾聲了

在這篇文章的目標是使一些初創企業,特別是在社會網路分析領域的世界外面發生的激動人心的事情。你可以使用 Azure 搜索作為一塊更大的解決方案中,您需要一個複雜和強大的搜索體驗,與您的 Web 網站和應用程式進行集成。它允許您使用微調的排名模型以配合業務目標,以及可靠的輸送量和存儲的搜尋結果。


Bruno Terkaly 是主要軟體工程師在微軟,目的是發展的業界領先的應用程式和服務啟用跨設備。他是負責開車穿越美國的頂級雲計算和移動的機會和從技術支援的角度之外。他説明合作夥伴帶來市場及其應用提供建築指導和深厚的技術接合 ISV 的評價、 開發和部署過程。他還密切與雲計算和移動工程群體、 提供回饋和影響路線圖 》。

感謝以下的微軟技術專家對本文的審閱:利亞姆 · 卡瓦納,Simon Gurevich,戈文德坎、 拉吉克裡希南,一些 Latchupatula,Eugene 什韋茨