如何在OJet项目中连接Elasticsearch并获取索引JSON数据?
在Oracle JET(OJet)项目中连接Elasticsearch并获取索引数据的实现方案
我明白你现在需要在OJet项目里对接Elasticsearch,这其实并不复杂,咱们一步步来实现,从连接到获取JSON数据都给你捋清楚。
一、准备工作:安装Elasticsearch JavaScript客户端
OJet基于JavaScript生态,官方的@elastic/elasticsearch客户端是最直接的选择,先在项目里安装依赖:
# 在项目根目录执行 npm install @elastic/elasticsearch --save # 或者用yarn yarn add @elastic/elasticsearch
二、创建Elasticsearch连接实例
在OJet项目的src/js目录下新建一个es-client.js文件,用来统一管理Elasticsearch的连接配置:
import { Client } from '@elastic/elasticsearch'; // 初始化Elasticsearch客户端 const esClient = new Client({ node: 'http://你的Elasticsearch地址:端口', // 示例:http://localhost:9200 // 如果你的ES开启了账号密码验证,添加以下配置 auth: { username: '你的ES用户名', password: '你的ES密码' } }); // 导出客户端供其他组件调用 export default esClient;
三、在OJet组件中获取索引数据
以一个ViewModel为例,展示如何调用ES客户端查询指定索引的JSON数据:
import esClient from '../es-client'; class EsDataViewModel { constructor() { // 用Knockout observableArray存储ES返回的数据 this.esIndexData = ko.observableArray([]); // 页面加载时自动获取数据 this.loadIndexData(); } async loadIndexData() { try { // 调用ES的search API查询目标索引 const response = await esClient.search({ index: '你的索引名称', // 替换为你已创建的ES索引名 // 这里可以自定义查询条件,示例是查询所有文档 query: { match_all: {} }, // 可选:指定返回的字段,减少数据传输量 _source: ['title', 'content', 'create_time'], // 可选:设置返回数据条数,默认10条 size: 20 }); // 从返回结果中提取实际数据(ES返回的结构里,hits.hits包含文档内容) const formattedData = response.hits.hits.map(item => item._source); this.esIndexData(formattedData); console.log('成功获取ES数据:', formattedData); } catch (error) { console.error('获取ES数据失败:', error); // 这里可以添加前端错误提示,比如OJet的oj-alert组件 } } } export default EsDataViewModel;
四、在OJet视图中展示数据
对应上面的ViewModel,在HTML视图中用OJet组件渲染数据:
<div class="oj-flex oj-flex-items-pad"> <h2>Elasticsearch索引数据展示</h2> <oj-list-view id="es-data-list" data="[[esIndexData]]" selection-mode="none"> <template slot="itemTemplate" data-oj-as="item"> <div class="oj-list-item"> <h4><oj-bind-text value="[[$current.item.title]]"></oj-bind-text></h4> <p><oj-bind-text value="[[$current.item.content]]"></oj-bind-text></p> <span class="oj-text-sm oj-text-secondary"> 创建时间: <oj-bind-text value="[[$current.item.create_time]]"></oj-bind-text> </span> </div> </template> </oj-list-view> </div>
关键注意事项
- 跨域问题:如果OJet项目和ES不在同一域名下,需要在ES的
elasticsearch.yml配置文件中开启CORS:http.cors.enabled: true http.cors.allow-origin: "你的OJet项目地址" # 示例:http://localhost:8000 http.cors.allow-headers: Authorization,Content-Type - 权限控制:如果ES开启了安全认证(比如X-Pack),要确保客户端配置的账号有目标索引的查询权限。
- 查询优化:避免用
match_all返回全量数据,根据业务需求编写精准的查询DSL,合理设置分页参数(from和size)。
内容的提问来源于stack exchange,提问作者Elva
相关产品推荐
相关产品推荐

