使用 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",
}),
});
更多不同运行时的示例
- with-express-javascript-esm (在新标签页中打开)
- with-express-javascript-cjs (在新标签页中打开)
- with-express-typescript-esm (在新标签页中打开)
- with-express-typescript-cjs (在新标签页中打开)