搜尋
首頁web前端js教程使用Node.js和Elasticsearch構建搜索引擎

Build a Search Engine with Node.js and Elasticsearch

本文經Mark Brown、Vildan Softic和Moritz Kröger同行評審。感謝所有SitePoint的同行評審員,讓SitePoint的內容盡善盡美!

Elasticsearch是一個開源搜索引擎,因其高性能和分佈式架構而日益普及。本文將探討其關鍵特性,並指導您如何使用它來創建一個Node.js搜索引擎。

關鍵要點

  • Elasticsearch是一個高性能的分佈式搜索引擎,基於Apache Lucene構建,主要用於實時索引和搜索數據。
  • 該系統是無模式的,可以自動檢測數據結構和類型,並通過使用HTTP上的JSON的RESTful API支持大量操作。
  • Elasticsearch可以使用ZIP文件或Homebrew等包管理器輕鬆安裝在主要操作系統上,並且需要Java運行時環境才能運行。
  • Node.js的官方Elasticsearch模塊促進了Elasticsearch的功能與Node.js應用程序的集成,允許高效的數據索引和查詢。
  • Elasticsearch的關鍵概念包括索引、類型和搜索,能夠執行複雜的查詢、過濾器和聚合來細化和分析數據。
  • Elasticsearch支持實時搜索,這意味著新索引的數據幾乎可以立即搜索,從而提高依賴於最新信息的應用程序的響應速度。
  • 本教程提供了關於使用Node.js設置Elasticsearch、執行各種類型的搜索以及使用數據聚合和建議等高級功能的實用示例和代碼片段。

Elasticsearch簡介

Elasticsearch構建在Apache Lucene之上,Apache Lucene是一個高性能的文本搜索引擎庫。雖然Elasticsearch可以執行數據的存儲和檢索,但其主要目的不是充當數據庫,而是一個搜索引擎(服務器),其主要目標是索引、搜索和提供數據的實時統計信息。

Elasticsearch具有分佈式架構,可以通過添加更多節點並利用額外的硬件來實現水平擴展。它支持數千個節點來處理PB級的數據。它的水平擴展也意味著它具有高可用性,如果任何節點發生故障,它可以重新平衡數據。

導入數據後,它會立即可用以進行搜索。 Elasticsearch是無模式的,將數據存儲在JSON文檔中,並且可以自動檢測數據結構和類型。

Elasticsearch也是完全由API驅動的。這意味著幾乎所有操作都可以通過使用HTTP上的JSON數據的簡單的RESTful API來完成。它幾乎為任何編程語言都提供了許多客戶端庫,包括Node.js。在本教程中,我們將使用官方客戶端庫。

Elasticsearch在硬件和軟件需求方面非常靈活。雖然推薦的生產環境是64GB內存和盡可能多的CPU內核,但您仍然可以在資源受限的系統上運行它並獲得不錯的性能(假設您的數據集不是很大)。要遵循本文中的示例,具有2GB內存和單個CPU內核的系統就足夠了。

您可以在所有主要操作系統(Linux、Mac OS和Windows)上運行Elasticsearch。為此,您需要安裝最新版本的Java運行時環境(請參閱“安裝Elasticsearch”部分)。要遵循本文中的示例,您還需要安裝Node.js(v0.11.0之後的任何版本都可以),以及npm。

Elasticsearch術語

Elasticsearch使用它自己的術語,在某些情況下與典型的數據庫系統不同。以下是Elasticsearch中常用術語及其含義的列表。

索引: 此術語在Elasticsearch上下文中具有兩種含義。首先是添加數據的操作。當添加數據時,文本會被分解成標記(例如單詞),並且每個標記都會被索引。但是,索引也指的是所有索引數據存儲的位置。基本上,當您導入數據時,它會被索引到一個索引中。每次您想要對數據執行任何操作時,都需要指定其索引名稱。

類型: Elasticsearch提供了對索引中文檔的更詳細的分類,稱為類型。索引中的每個文檔也應該有一個類型。例如,我們可以定義一個庫索引,然後將多種類型的數據(例如文章、書籍、報告和演示文稿)索引到其中。由於索引幾乎具有固定的開銷,因此建議使用較少的索引和較多的類型,而不是較多的索引和較少的類型。

搜索: 此術語的含義可能與您想像的一樣。您可以在不同的索引和類型中搜索數據。 Elasticsearch提供了許多類型的搜索查詢,例如術語、短語、範圍、模糊,甚至地理數據的查詢。

過濾器: Elasticsearch允許您根據不同的條件過濾搜索結果,以進一步縮小結果範圍。如果您向一組文檔添加新的搜索查詢,它可能會根據相關性更改順序,但如果您將相同的查詢添加為過濾器,則順序保持不變。

聚合: 這些提供了對聚合數據的不同類型的統計信息,例如最小值、最大值、平均值、總和、直方圖等等。

建議: Elasticsearch為輸入文本提供不同類型的建議。這些建議可以基於術語或短語,甚至可以完成建議。

安裝Elasticsearch

Elasticsearch在Apache 2許可下可用;可以免費下載、使用和修改。在安裝它之前,您需要確保您的計算機上安裝了Java運行時環境(JRE)。 Elasticsearch是用Java編寫的,並依賴於Java庫才能運行。要檢查您的系統上是否安裝了Java,您可以在命令行中鍵入以下內容。

<code>java -version</code>

建議使用最新穩定版本的Java(在撰寫本文時為1.8)。您可以在此處找到有關在您的系統上安裝Java的指南。

接下來,要下載最新版本的Elasticsearch(在撰寫本文時為2.4.0),請訪問下載頁面並下載ZIP文件。 Elasticsearch不需要安裝,單個zip文件包含在所有受支持的操作系統上運行程序的完整文件集。解壓縮下載的文件,就完成了!還有其他幾種方法可以運行Elasticsearch,例如獲取TAR文件或不同Linux發行版的軟件包(請查看此處)。

如果您運行的是Mac OS X並且安裝了Homebrew,則可以使用brew install elasticsearch安裝Elasticsearch。 Homebrew會自動將可執行文件添加到您的路徑並安裝所需的服務。它還可以幫助您使用單個命令更新應用程序:brew upgrade elasticsearch。

要在Windows上運行Elasticsearch,從解壓縮的目錄中,從命令行運行binelasticsearch.bat。對於其他所有操作系統,請從終端運行./bin/elasticsearch。此時它應該在您的系統上運行。

正如我前面提到的,幾乎所有您可以使用Elasticsearch執行的操作都可以通過REST API來完成。 Elasticsearch默認使用端口9200。要確保您正確運行它,請在瀏覽器中訪問http://localhost:9200/,它應該顯示有關您正在運行的實例的一些基本信息。

有關安裝和故障排除的更多信息,您可以訪問文檔。

圖形用戶界面

Elasticsearch通過REST API提供幾乎所有功能,並且不附帶圖形用戶界面(GUI)。雖然我介紹瞭如何通過API和Node.js執行所有必要的操作,但有一些GUI工具可以提供有關索引和數據的可視化信息,甚至是一些高級分析。

由同一家公司開發的Kibana提供了數據的實時摘要,以及一些自定義的可視化和分析選項。 Kibana是免費的,並且有詳細的文檔。

社區還開發了其他工具,包括elasticsearch-head、Elasticsearch GUI,甚至是一個名為ElasticSearch Toolbox的Chrome擴展程序。這些工具可以幫助您在瀏覽器中瀏覽索引和數據,甚至可以嘗試不同的搜索和聚合查詢。所有這些工具都提供了安裝和使用的演練。

設置Node.js環境

Elasticsearch為Node.js提供了一個官方模塊,稱為elasticsearch。首先,您需要將模塊添加到您的項目文件夾中,並保存依賴項以備將來使用。

<code>npm install elasticsearch --save</code>

然後,您可以按如下方式在腳本中導入模塊:

<code>java -version</code>

最後,您需要設置處理與Elasticsearch通信的客戶端。在本例中,我假設您在本地機器上運行Elasticsearch,IP地址為127.0.0.1,端口為9200(默認設置)。

<code>npm install elasticsearch --save</code>

log選項確保記錄所有錯誤。在本文的其餘部分,我將使用相同的esClient對象與Elasticsearch進行通信。此處提供了節點模塊的完整文檔。

注意:本教程的所有源代碼都提供在GitHub上。最簡單的遵循方法是將存儲庫克隆到您的PC並從那裡運行示例:

<code>const elasticsearch = require('elasticsearch');</code>

導入數據

在本教程中,我將使用具有隨機生成內容的學術文章數據集。數據以JSON格式提供,數據集中有1000篇文章。為了顯示數據的樣式,下面顯示了數據集中的一項。

<code>const esClient = new elasticsearch.Client({
  host: '127.0.0.1:9200',
  log: 'error'
});</code>

字段名稱是不言自明的。需要注意的唯一一點是此處未顯示body字段,因為它包含完整的隨機生成的文稿(包含100到200個段落)。您可以在此處找到完整的數據集。

雖然Elasticsearch提供了索引、更新和刪除單個數據點的方法,但我們將使用Elasticserch的批量方法來導入數據,該方法用於更有效地對大型數據集執行操作:

<code>git clone https://github.com:sitepoint-editors/node-elasticsearch-tutorial.git
cd node-elasticsearch-tutorial
npm install</code>

在這裡,我們調用bulkIndex函數,將library作為索引名稱、article作為類型以及我們希望索引的JSON數據傳遞給它。 bulkIndex函數依次調用esClient對像上的bulk方法。此方法將一個具有body屬性的對像作為參數。提供給body屬性的值是一個數組,每個操作有兩個條目。在第一個條目中,操作的類型被指定為一個JSON對象。在這個對像中,index屬性確定要執行的操作(在本例中是索引文檔),以及索引名稱、類型名稱和文檔ID。下一個條目對應於文檔本身。

請注意,將來您可以通過這種方式向同一索引中添加其他類型的文檔(例如書籍或報告)。我們還可以為每個文檔分配一個唯一的ID,但這可選項——如果您不提供一個,Elasticsearch將為您為每個文檔分配一個唯一的隨機生成的ID。

假設您已經克隆了存儲庫,您現在可以通過從項目根目錄執行以下命令來將數據導入Elasticsearch:

<code>{
    "_id": "57508457f482c3a68c0a8ab3",
    "title": "Nostrud anim proident cillum non.",
    "journal": "qui ea",
    "volume": 54,
    "number": 11,
    "pages": "109-117",
    "year": 2014,
    "authors": [
      {
        "firstname": "Allyson",
        "lastname": "Ellison",
        "institution": "Ronbert",
        "email": "Allyson@Ronbert.tv"
      },
      ...
    ],
    "abstract": "Do occaecat reprehenderit dolore ...",
    "link": "http://mollit.us/57508457f482c3a68c0a8ab3.pdf",
    "keywords": [
      "sunt",
      "fugiat",
      ...
    ],
    "body": "removed to save space"
  }</code>

檢查數據是否已正確索引

Elasticsearch的一大特性是近乎實時的搜索。這意味著一旦文檔被索引,它們就會在一秒鐘內可用以進行搜索(請參閱此處)。一旦數據被索引,您可以通過運行indices.js(鏈接到源代碼)來檢查索引信息:

// index.js

const bulkIndex = function bulkIndex(index, type, data) {
  let bulkBody = [];

  data.forEach(item => {
    bulkBody.push({
      index: {
        _index: index,
        _type: type,
        _id: item.id
      }
    });

    bulkBody.push(item);
  });

  esClient.bulk({body: bulkBody})
  .then(response => {
    console.log('here');
    let errorCount = 0;
    response.items.forEach(item => {
      if (item.index && item.index.error) {
        console.log(++errorCount, item.index.error);
      }
    });
    console.log(
      `Successfully indexed ${data.length - errorCount}
       out of ${data.length} items`
    );
  })
  .catch(console.err);
};

const test = function test() {
  const articlesRaw = fs.readFileSync('data.json');
  bulkIndex('library', 'article', articles);
};

客戶端的cat對像中的方法提供了有關當前正在運行的實例的不同信息。 indices方法列出了所有索引、它們的運行狀況、文檔數量以及它們在磁盤上的大小。 v選項會向cat方法的響應添加標題。

當您運行上述代碼片段時,您會注意到它輸出一個顏色代碼來指示集群的運行狀況。紅色表示集群出現問題並且沒有運行。黃色表示集群正在運行,但存在警告,綠色表示一切正常。很可能(取決於您的設置)您在本地機器上運行時會獲得黃色狀態。這是因為默認設置包含集群的五個節點,但在您的本地機器上只有一個實例正在運行。雖然您應該始終在生產環境中爭取綠色狀態,但為了本教程的目的,您可以繼續在黃色狀態下使用Elasticsearch。

<code>java -version</code>

動態和自定義映射

正如我前面提到的,Elasticsearch是無模式的。這意味著您不必在導入數據之前定義數據的結構(類似於在SQL數據庫中定義表),而是Elasticsearch會自動為您檢測它。但是,儘管被稱為無模式,但數據結構有一些限制。

Elasticsearch將數據的結構稱為映射。如果不存在映射,則在索引數據時,Elasticsearch會查看JSON數據的每個字段,並根據其類型自動定義映射。如果該字段已存在映射條目,則它確保添加的新數據遵循相同的格式。否則,它將引發錯誤。

例如,如果已索引{"key1": 12},則Elasticsearch會自動將字段key1映射為long。現在,如果您嘗試索引{"key1": "value1", "key2": "value2"},它會引發錯誤,因為它期望字段key1的類型為long。同時,對象{"key1": 13, "key2": "value2"}將被無問題地索引,並將類型為string的key2添加到映射中。

映射超出了本文的範圍,在大多數情況下,自動映射工作得很好。我建議查看elasticsearch文檔,其中提供了對映射的深入討論。

構建搜索引擎

一旦數據被索引,我們就可以實現搜索引擎了。 Elasticsearch提供了一個名為Query DSL的直觀的全文搜索查詢結構——它基於JSON——來定義查詢。有許多類型的搜索查詢可用,但在本文中,我們將研究其中幾種更常見的查詢。此處可以找到Query DSL的完整文檔。

請記住,我為此處顯示的每個示例都提供了代碼鏈接。設置好環境並索引測試數據後,您可以克隆存儲庫並在您的機器上運行任何示例。為此,只需從命令行運行node filename.js即可。

返回一個或多個索引中的所有文檔

為了執行搜索,我們將使用客戶端提供的各種搜索方法。最簡單的查詢是match_all,它返回一個或多個索引中的所有文檔。下面的示例顯示了我們如何獲取索引中的所有存儲文檔(鏈接到源代碼)。

<code>java -version</code>

主要的搜索查詢包含在query對像中。正如我們稍後將看到的,我們可以向此對象添加不同類型的搜索查詢。對於每個查詢,我們添加一個鍵,其中包含查詢類型(在此示例中為match_all),其值為包含搜索選項的對象。此示例中沒有選項,因為我們希望返回索引中的所有文檔。

除了query對象之外,搜索主體還可以包含其他可選屬性,包括size和from。 size屬性確定要包含在響應中的文檔數量。如果此值不存在,則默認返回十個文檔。 from屬性確定返回文檔的起始索引。這對於分頁很有用。

理解搜索API響應

如果您要記錄搜索API的響應(上述示例中的results),它最初看起來可能很複雜,因為它包含大量信息。

<code>npm install elasticsearch --save</code>

在最高級別,響應包括一個took屬性,用於表示查找結果所花費的毫秒數,timed_out,僅當在允許的最大時間內未找到結果時才為true,_shards,用於提供有關不同節點狀態的信息(如果部署為節點集群),以及hits,其中包含搜索結果。

在hits屬性中,我們有一個對象,其中包含以下屬性:

  • total——指示匹配項的總數
  • max_score——找到的項目的最高分數
  • hits——一個包含找到的項目的數組。 hits數組中的每個文檔中,我們都有索引、類型、文檔ID、分數和文檔本身(在_source元素中)。

它非常複雜,但好消息是,一旦您實現了一種提取結果的方法,無論您的搜索查詢是什麼,您都將始終以相同的格式獲得結果。

另請注意,Elasticsearch的優點之一是它會自動為每個匹配的文檔分配一個分數。此分數用於量化文檔的相關性,並且默認情況下,結果按分數遞減的順序返回。在我們使用match_all檢索所有文檔的情況下,分數毫無意義,所有分數都計算為1.0。

匹配字段中包含特定值的文檔

現在,讓我們來看一些更有趣的例子。為了匹配字段中包含特定值的文檔,我們可以使用match查詢。下面顯示了一個帶有match查詢的簡單搜索主體(鏈接到源代碼)。

<code>const elasticsearch = require('elasticsearch');</code>

正如我前面提到的,我們首先向一個query對像中添加一個條目,其中包含搜索類型,在此示例中為match。在搜索類型對象內,我們標識要搜索的文檔字段,此處為title。在其中,我們放入與搜索相關的數據,包括query屬性。我希望在測試了上述示例後,您會開始對搜索速度感到驚嘆。

上述搜索查詢返回其title字段與query屬性中的任何單詞匹配的文檔。我們可以設置匹配項的最小數量,如下所示。

<code>java -version</code>

此查詢匹配其標題中至少有三個指定單詞的文檔。如果查詢中少於三個單詞,則所有單詞都必須出現在標題中才能匹配文檔。另一個添加到搜索查詢的有用功能是模糊性。如果用戶在編寫查詢時輸入錯誤,這將非常有用,因為模糊匹配將查找拼寫相近的術語。對於字符串,模糊性值基於每個術語允許的最大萊文斯坦距離。下面是一個帶有模糊性的示例。

<code>npm install elasticsearch --save</code>

在多個字段中搜索

如果您想在多個字段中搜索,可以使用multi_match搜索類型。它類似於match,只是我們不是將字段作為搜索查詢對像中的鍵,而是添加一個fields鍵,這是一個要搜索的字段數組。在這裡,我們在title、authors.firstname和authors.lastname字段中搜索。 (鏈接到源代碼)

<code>const elasticsearch = require('elasticsearch');</code>

multi_match查詢支持其他搜索屬性,例如minimum_should_match和fuzziness。 Elasticsearch支持通配符(例如*)來匹配多個字段,因此我們可以將上述示例縮短為['title', 'authors.*name']。

匹配完整的短語

Elasticsearch還可以精確匹配輸入的短語,而不會在術語級別進行匹配。此查詢是常規match查詢的擴展,稱為match_phrase。下面是一個match_phrase的示例。 (鏈接到源代碼)

<code>const esClient = new elasticsearch.Client({
  host: '127.0.0.1:9200',
  log: 'error'
});</code>

組合多個查詢

到目前為止,在示例中,我們每個請求只使用了一個查詢。但是,Elasticsearch允許您組合多個查詢。最常見的複合查詢是bool。 bool查詢接受四種類型的鍵:must、should、must_not和filter。顧名思義,結果中的文檔必須匹配must中的查詢,不能匹配must_not中的查詢,如果它們匹配should中的查詢,則會獲得更高的分數。上述每個元素都可以接收多個查詢,形式為查詢數組。

下面,我們將bool查詢與一種新的查詢類型query_string一起使用。這允許您使用AND和OR等關鍵字編寫更高級的查詢。此處可以找到query_string語法的完整文檔。此外,我們使用範圍查詢(此處有文檔),它允許我們將字段限制在給定範圍內。 (鏈接到源代碼)

<code>git clone https://github.com:sitepoint-editors/node-elasticsearch-tutorial.git
cd node-elasticsearch-tutorial
npm install</code>

在上述示例中,查詢返回作者的姓名包含term1他們的姓氏包含term2,並且他們的標題包含term3,並且它們未在2011年、2012年或2013年發表的文檔。此外,在其正文中包含給定短語的文檔將獲得更高的分數,並顯示在結果的頂部(因為match查詢位於should子句中)。

過濾器、聚合和建議

除了其高級搜索功能外,Elasticsearch還提供其他功能。在這裡,我們來看三個更常見的特性。

過濾器

通常,您可能希望根據特定條件細化搜索結果。 Elasticsearch通過過濾器提供此功能。在我們的文章數據中,假設您的搜索返回了幾篇文章,您希望從中只選擇在五個特定年份發表的文章。您可以簡單地從搜索結果中過濾掉任何不符合您條件的內容,而無需更改搜索順序。

過濾器與bool查詢的must子句中的相同查詢之間的區別在於,過濾器不會影響搜索分數,而must查詢會影響。當返回搜索結果並且用戶根據某些特定條件進行過濾時,他們不希望更改原始結果順序,而是只希望從結果中刪除不相關的文檔。過濾器遵循與搜索相同的格式,但更常見的是,它們是在具有確定值的字段上定義的,而不是文本字符串。 Elasticsearch建議通過bool複合搜索查詢的filter子句添加過濾器。

繼續上面的示例,假設我們想將搜索結果限制在2011年至2015年發表的文章。為此,我們只需要向原始搜索查詢的filter部分添加一個範圍查詢即可。這將從結果中刪除任何不匹配的文檔。下面是一個過濾查詢的示例。 (鏈接到源代碼)

<code>java -version</code>

聚合

聚合框架根據搜索查詢提供各種聚合數據和統計信息。聚合的兩種主要類型是度量和分組,其中度量聚合跟踪和計算一組文檔上的度量,而分組聚合構建桶,每個桶都與一個鍵和一個文檔條件相關聯。度量聚合的示例包括平均值、最小值、最大值、總和和值計數。分組聚合的示例包括範圍、日期範圍、直方圖和術語。此處可以找到聚合器的深入解釋。

聚合放置在aggregations對象內,該對象本身直接放置在搜索對象主體中。在aggregations對像中,每個鍵都是用戶為聚合器分配的名稱。聚合器類型和選項應作為該鍵的值放置。下面,我們來看兩個不同的聚合器,一個度量聚合器和一個桶聚合器。作為度量聚合器,我們嘗試在數據集中找到最小年份值(最舊的文章),對於桶聚合器,我們嘗試查找每個關鍵字出現的次數。 (鏈接到源代碼)

<code>npm install elasticsearch --save</code>

在上述示例中,我們將度量聚合器命名為min_year(此名稱可以是任何名稱),它是在year字段上進行的min類型的聚合。桶聚合器命名為keywords,它是在keywords字段上進行的terms類型的聚合。聚合的結果包含在響應中的aggregations元素中,在更深一層,它們包含每個定義的聚合器(此處為min_year和keywords)及其結果。以下是此示例的部分響應。

<code>const elasticsearch = require('elasticsearch');</code>

默認情況下,響應中最多返回10個桶。您可以在請求中的字段旁邊添加size鍵來確定返回的桶的最大數量。如果您想接收所有桶,請將此值設置為0。

建議

Elasticsearch有多種類型的建議器,可以為輸入的術語提供替換或完成建議(此處有文檔)。我們將在此處查看術語和短語建議器。術語建議器為輸入文本中的每個術語提供建議(如有),而短語建議器將輸入文本視為一個完整的短語(而不是將其分解為術語),並提供其他短語建議(如有) 。要使用建議API,我們需要調用Node.js客戶端上的suggest方法。下面是一個術語建議器的示例。 (鏈接到源代碼)

<code>java -version</code>

在請求主體中,與所有其他客戶端方法一致,我們有一個index字段,用於確定搜索的索引。在body屬性中,我們添加了我們正在尋找建議的文本,並且(與聚合對像一樣),我們為每個建議器指定一個名稱(在本例中為titleSuggester)。它的值確定建議器的類型和選項。在本例中,我們正在為title字段使用術語建議器,並將每個標記的建議最大數量限制為五個(size: 5)。

suggest API的響應包含您請求的每個建議器的一個鍵,該鍵是一個數組,其大小與文本字段中術語的數量相同。對於該數組中的每個對象,都有一個options對象,其text字段中包含建議。以下是上述請求的部分響應。

<code>npm install elasticsearch --save</code>

要獲取短語建議,我們可以遵循與上述相同的格式,只需將建議器類型替換為phrase即可。在下面的示例中,響應遵循與上面解釋相同的格式。 (鏈接到源代碼)

<code>const elasticsearch = require('elasticsearch');</code>

進一步閱讀

Elasticsearch提供了廣泛的功能,遠超本文的範圍。在本文中,我試圖從高級別解釋其功能,並參考適當的資源以供進一步學習。 Elasticsearch非常可靠,並且具有出色的性能(我希望您在運行示例時已經註意到這一點)。這加上不斷增長的社區支持,增加了Elasticsearch在行業中的採用率,尤其是在處理實時數據或大數據的公司中。

在仔細閱讀此處提供的示例後,我強烈建議您查看文檔。他們提供了兩個主要來源,一個是Elasticsearch及其功能的參考,另一個是更側重於實現、用例和最佳實踐的指南。您還可以在此處找到Node.js客戶端的詳細文檔。

您是否已經在使用Elasticsearch?您的經驗如何?或者您是否在閱讀本文後打算嘗試一下?請在下面的評論中告訴我。

關於搜索引擎Node Elasticsearch的常見問題解答 (FAQ)

Elasticsearch與其他搜索引擎(如Elasticlunr或Minisearch)有何區別?

Elasticsearch是一個功能強大、分佈式且開源的搜索和分析引擎。它旨在處理大量數據並提供實時搜索結果。另一方面,Elasticlunr和Minisearch是用於JavaScript的輕量級客戶端搜索庫。它們專為較小的數據集而設計,通常用於基於瀏覽器的應用程序。雖然Elasticsearch提供了更高級的功能,例如分佈式搜索、數據分析和機器學習功能,但Elasticlunr和Minisearch對於基本的搜索功能來說更簡單易用。

如何在Node.js應用程序中實現Elasticsearch?

在Node.js應用程序中實現Elasticsearch涉及幾個步驟。首先,您需要使用npm安裝Elasticsearch包。然後,您需要創建一個Elasticsearch客戶端實例並將其連接到您的Elasticsearch服務器。之後,您可以使用客戶端的方法執行各種操作,例如索引文檔、搜索數據和管理您的Elasticsearch集群。

我可以使用Elasticsearch在瀏覽器中構建搜索引擎嗎?

雖然Elasticsearch主要設計用於服務器端應用程序,但藉助Node.js服務器,可以在基於瀏覽器的應用程序中使用它。服務器可以在瀏覽器和Elasticsearch服務器之間充當代理,處理所有搜索請求和響應。但是,對於更簡單的用例,像Elasticlunr或Minisearch這樣的客戶端搜索庫可能是更好的選擇。

Elasticsearch與其他npm搜索包相比如何?

Elasticsearch是npm上最流行的搜索包之一,這要歸功於其強大的功能和可擴展性。它提供了一套全面的API,用於索引、搜索和分析數據。但是,它比其他npm搜索包更複雜且資源密集。如果您正在從事小型項目,或者您需要簡單的搜索功能,則其他npm包(如search-index或js-search)可能更合適。

如何使用JavaScript構建簡單的瀏覽器內搜索引擎?

使用JavaScript構建簡單的瀏覽器內搜索引擎包括創建數據的索引、實現搜索功能和顯示搜索結果。您可以使用像Elasticlunr或Minisearch這樣的JavaScript搜索庫來簡化此過程。這些庫提供了易於使用的API來索引和搜索數據,並且可以直接在瀏覽器中使用,無需服務器。

在我的應用程序中使用Elasticsearch進行搜索功能的優勢是什麼?

Elasticsearch為在您的應用程序中實現搜索功能提供了許多優勢。它提供實時搜索結果,這意味著一旦文檔被索引,它就會變得可搜索。它還支持複雜的搜索查詢,允許您根據多個條件搜索數據。此外,Elasticsearch高度可擴展,可以處理大量數據而不會影響性能。

Elasticsearch如何處理數據索引?

Elasticsearch使用稱為倒排索引的數據結構進行數據索引。這允許它快速查找與搜索查詢匹配的文檔。當文檔被索引時,Elasticsearch會分析內容並創建唯一單詞列表,然後將這些單詞與有關它們在文檔中位置的信息一起存儲在倒排索引中。

我可以使用Elasticsearch進行數據分析嗎?

是的,Elasticsearch不僅是一個搜索引擎,還是一個強大的數據分析工具。它支持聚合,允許您以各種方式匯總和分析您的數據。您可以使用Elasticsearch執行複雜的數據分析任務,例如計算平均值、總和或計數,查找最小值或最大值,根據特定條件對數據進行分組等等。

Elasticsearch是否適合大數據應用程序?

是的,Elasticsearch旨在處理大數據應用程序。它是一個分佈式系統,這意味著它可以通過向集群添加更多節點來水平擴展。這允許它處理大量數據,即使在負載很重的情況下也能提供快速的搜索結果。此外,Elasticsearch支持分片和復制,這進一步增強了其可擴展性和可靠性。

如何優化Elasticsearch應用程序的性能?

有多種方法可以優化Elasticsearch應用程序的性能。首先,您應該正確配置Elasticsearch集群,包括節點、分片和副本的數量。其次,您應該通過使用批量索引、禁用刷新和使用正確的分析器來優化索引過程。最後,您應該通過盡可能使用過濾器而不是查詢來優化搜索查詢,避免繁重的聚合,並使用“explain”API來了解查詢是如何執行的。

以上是使用Node.js和Elasticsearch構建搜索引擎的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
在JavaScript中替換字符串字符在JavaScript中替換字符串字符Mar 11, 2025 am 12:07 AM

JavaScript字符串替換方法詳解及常見問題解答 本文將探討兩種在JavaScript中替換字符串字符的方法:在JavaScript代碼內部替換和在網頁HTML內部替換。 在JavaScript代碼內部替換字符串 最直接的方法是使用replace()方法: str = str.replace("find","replace"); 該方法僅替換第一個匹配項。要替換所有匹配項,需使用正則表達式並添加全局標誌g: str = str.replace(/fi

自定義Google搜索API設置教程自定義Google搜索API設置教程Mar 04, 2025 am 01:06 AM

本教程向您展示瞭如何將自定義的Google搜索API集成到您的博客或網站中,提供了比標準WordPress主題搜索功能更精緻的搜索體驗。 令人驚訝的是簡單!您將能夠將搜索限制為Y

8令人驚嘆的jQuery頁面佈局插件8令人驚嘆的jQuery頁面佈局插件Mar 06, 2025 am 12:48 AM

利用輕鬆的網頁佈局:8 ESTISSEL插件jQuery大大簡化了網頁佈局。 本文重點介紹了簡化該過程的八個功能強大的JQuery插件,對於手動網站創建特別有用

構建您自己的Ajax Web應用程序構建您自己的Ajax Web應用程序Mar 09, 2025 am 12:11 AM

因此,在這裡,您準備好了解所有稱為Ajax的東西。但是,到底是什麼? AJAX一詞是指用於創建動態,交互式Web內容的一系列寬鬆的技術。 Ajax一詞,最初由Jesse J創造

什麼是這個&#x27;在JavaScript?什麼是這個&#x27;在JavaScript?Mar 04, 2025 am 01:15 AM

核心要點 JavaScript 中的 this 通常指代“擁有”該方法的對象,但具體取決於函數的調用方式。 沒有當前對象時,this 指代全局對象。在 Web 瀏覽器中,它由 window 表示。 調用函數時,this 保持全局對象;但調用對象構造函數或其任何方法時,this 指代對象的實例。 可以使用 call()、apply() 和 bind() 等方法更改 this 的上下文。這些方法使用給定的 this 值和參數調用函數。 JavaScript 是一門優秀的編程語言。幾年前,這句話可

10張移動秘籍用於移動開發10張移動秘籍用於移動開發Mar 05, 2025 am 12:43 AM

該帖子編寫了有用的作弊表,參考指南,快速食譜以及用於Android,BlackBerry和iPhone應用程序開發的代碼片段。 沒有開發人員應該沒有他們! 觸摸手勢參考指南(PDF)是Desig的寶貴資源

通過來源查看器提高您的jQuery知識通過來源查看器提高您的jQuery知識Mar 05, 2025 am 12:54 AM

jQuery是一個很棒的JavaScript框架。但是,與任何圖書館一樣,有時有必要在引擎蓋下發現發生了什麼。也許是因為您正在追踪一個錯誤,或者只是對jQuery如何實現特定UI感到好奇

如何創建和發布自己的JavaScript庫?如何創建和發布自己的JavaScript庫?Mar 18, 2025 pm 03:12 PM

文章討論了創建,發布和維護JavaScript庫,專注於計劃,開發,測試,文檔和促銷策略。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前By尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
1 個月前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
1 個月前By尊渡假赌尊渡假赌尊渡假赌

熱工具

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。