开始使用

本章节介绍如何在应用程序中使用搜索扩展组件。

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

首先,安装并配置扩展组件:

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

  2. 根据服务地址 配置 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.search-index-name-prefix = sample_prefix_

索引处理队列

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

创建搜索界面

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

  2. 在界面的 XML 根元素中添加 xmlns:search="http://jmix.io/schema/search/ui 命名空间:

    <window xmlns="http://jmix.io/schema/ui/window"
            xmlns:search="http://jmix.io/schema/search/ui"
            caption="msg://searchScreen.caption">
  3. layout 元素内添加 searchField 组件:

    <layout>
        <search:searchField id="mySearchField"/>
    </layout>

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

测试搜索

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

首先,添加一些 CustomerOrder 实体。

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

search screen

搜索结果在另一界面展示。

search result

点击一条结果,会打开编辑界面。