开始使用

本章节介绍如何在应用程序中使用搜索功能。

假设你需要在应用程序中添加一些实体,并配置对实体属性进行搜索。

首先,需要完成下面几步:

  1. 根据 安装 部分的说明在项目中添加搜索扩展组件。

  2. 根据 ES 服务的地址 配置 ES 的连接。

创建数据模型和视图

创建下列类:

  1. Status 枚举,枚举值为 SILVERGOLD 值。

  2. Customer(客户) 实体,具有下列属性:

    • firstName,类型为 String

    • lastName,类型为 String

    • status,类型为 Status

    • card,类型为 FileRef

  3. Order(订单) 实体,具有下列属性:

    • date,类型为 Date

    • number,类型为 String

    • amount,类型为 Integer

    • product,类型为 String

    • customer 关联至 Customer 实体,多对一关系

Order 实体配置 实例名称,用于在搜索结果中展示。

CustomerOrder 实体创建列表和详情视图。

创建索引定义接口

然后,需要创建索引定义(Index Definition),这是一个接口,定义哪些实体和属性需要进行索引。假设我们需要通过订单的编号、产品名、客户状态或客户的姓搜索订单。在索引定义接口内,我们创建一个方法定义需要索引的属性。

@JmixEntitySearchIndex(entity = Order.class)
public interface OrderIndexDefinition {

    @AutoMappedField(includeProperties =
            {"number", "product", "customer.status", "customer.lastName"})
    void orderMapping();
}
  1. 接口需要使用 @JmixEntitySearchIndex 注解和必要参数 entity

  2. 接口可以任意命名。

  3. @AutoMappedField 注解能自动映射需要的属性。这里,使用 includeProperties 参数指定需要进行索引的属性名。

  4. 方法可以任意命名。

配置索引名称

默认情况下,项目中创建的索引名使用 search_index_ 前缀。由于同一个 ES 服务可以用在多个项目中,因此为了保证索引名的唯一性,我们建议修改项目中索引的默认前缀。在 application.properties 文件添加:

jmix.search.searchIndexNamePrefix = demo_prefix_

索引处理队列

Jmix 应用程序能监控数据的修改,但是不会自动将数据同步至 ES。如需定期更新 ES 索引,在项目添加 Quartz 扩展组件。搜索组件会用 Quartz 定期处理默认配置的索引队列。

创建搜索视图

  1. 使用 Studio 的 Blank view 模板创建一个空界面,命名为 Search

  2. 点击操作面板的 Add Component,找到 SearchField 并双击。

  3. 新增的 searchField 元素会同时在 Jmix UI 层级面板和 XML 中显示。与其他 UI 组件 一样,可以配置其 idheightwidth 等属性。

    <search:searchField id="searchField"/>

现在,视图中有了一个用于输入搜索关键字的文本框和一个执行搜索的按钮。

测试搜索

上面步骤完成后,可以运行应用程序并测试搜索功能了。

首先,添加一些 CustomerOrder 实体。

打开 Search 并搜索 Silver 状态的客户。

搜索结果在 Search Result 视图展示。

search result

点击一条结果,会打开实体详情视图。