文档
代理 Elasticsearch
使用 Express.js

使用 Express.js 代理

在生产环境中,我们不建议直接从浏览器调用 Elasticsearch。幸运的是,Searchkit 提供了一种通过 Node API 代理搜索请求的方法。这非常容易设置。

下面创建了一个 API,它将从浏览器发送的 instantsearch 请求转换为 Elasticsearch 查询,并将响应转换为 instantsearch 结果。

使用 Express.js 入门

安装依赖项

yarn add @searchkit/api searchkit express

创建服务器文件

我们将使用 ESM 模块,因此我们需要在 package.json 文件中添加一个 type 字段。

{
  "name": "with-express-javascript-esm",
  "version": "0.0.1",
  "description": "",
  "main": "index.js",
  "type": "module",
  "scripts": {
    "start": "node index.js"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "@searchkit/api": "latest",
    "express": "4.18.1",
    "isomorphic-unfetch": "^4.0.2",
    "searchkit": "latest"
  }
}
 

然后创建一个名为 server.js 的文件,内容如下。

import express from "express";
import Client from "@searchkit/api";
import 'isomorphic-unfetch' // required for searchkit which uses fetch
 
const app = express();
 
const config = {
  connection: {
    host: '<HOST>'
    // if you are authenticating with api key
    // https://searchkit.elastic.ac.cn/docs/guides/setup-elasticsearch#connecting-with-api-key
    // apiKey: '###'
    // if you are authenticating with username/password
    // https://searchkit.elastic.ac.cn/docs/guides/setup-elasticsearch#connecting-with-usernamepassword
    // auth: {
    //   username: "elastic",
    //   password: "changeme"
    // },
  },
  search_settings: {
    highlight_attributes: ['title'],
    search_attributes: [{ field: 'title', weight: 3 }, 'actors', 'plot'],
    result_attributes: ['title', 'actors', 'poster', 'plot'],
    facet_attributes: [
      'type',
      { attribute: 'actors', field: 'actors.keyword', type: 'string' },
      'rated',
      { attribute: 'imdbrating', type: 'numeric', field: 'imdbrating' },
      { attribute: 'metascore', type: 'numeric', field: 'metascore' }
    ],
    snippet_attributes: ['plot'],
    query_rules: []
  }
}
 
const apiClient = Client(config);
 
app.use(express.json());
 
app.post("/api/search", async function (req, res) {
  const response = await apiClient.handleRequest(req.body);
  res.send(response);
});
 
 
app.listen(3001, () => {
  console.log("Server running on port 3001");
});

然后在本地运行您的服务器

node server.js

更新前端的 Searchkit 客户端

然后我们将 instantsearch 客户端更新为使用 API。

不再需要 searchkit 配置和导入。搜索状态不再在浏览器中生成和执行 Elasticsearch 请求,而是发送到 API,然后 API 在服务器上生成并执行对 Elasticsearch 的请求。

const searchClient = instantsearch({
  indexName: "imdb_movies",
  searchClient: SearchkitInstantsearchClient({
    url: "https://127.0.0.1:3001/api/search",
  }),
});
 

更多不同运行时的示例

CodeSandbox 示例


Apache 2.0 2024 © Joseph McElroy。
需要帮助?加入 Discord