使用 UI 中的搜索
可视化组件
搜索扩展组件提供两个 UI 组件:SearchField
和 FullTextFilter
。如需在界面中使用这些组件,需要在界面 XML 描述的根元素声明 search
命名空间:
<window xmlns="http://jmix.io/schema/ui/window"
xmlns:search="http://jmix.io/schema/search/ui"
caption="msg://searchScreen.caption">
SearchField
SearchField
组件提供一个文本框和一个执行搜索的按钮。
界面中使用 SearchField
的示例:
<layout>
<search:searchField id="mySearchField"/>
</layout>
SearchField
的属性:
-
searchStrategy
- 搜索策略。如未定义,则使用默认策略。 -
entities
- 在指定的实体内进行搜索。多个实体可用逗号分隔:<search:searchField id="mySearchField" entities="search_Customer,search_Order"/>
默认情况下,searchField
打开内置的 SearchResultsScreen
界面展示搜索结果列表。如需自定义该行为,可以设置 SearchCompletedHandler
:
@Autowired
SearchField mySearchField;
@Autowired
private ScreenBuilders screenBuilders;
@Install(to = "mySearchField", subject = "searchCompletedHandler")
public void mySearchFieldSearchCompletedHandler(
SearchField.SearchCompletedEvent event) {
SearchResult searchResult = event.getSearchResult();
screenBuilders.screen(this)
.withScreenClass(SearchResultsScreen.class)
.withOpenMode(OpenMode.DIALOG)
.build()
.setSearchResult(searchResult)
.show();
}
另外,也可以使用组件的 setSearchCompletedHandler()
方法设置。
FullTextFilter
FullTextFilter
组件与 PropertyFilter 类似。
界面中使用 fullTextFilter
的示例:
<layout expand="ordersTable" spacing="true">
<search:fullTextFilter dataLoader="ordersDl"/>
<!-- ... -->
</layout>
FullTextFilter
的属性:
-
dataLoader
- 需要过滤的DataLoader
。 -
searchStrategy
- 搜索策略。如未定义,则使用默认策略。 -
autoApply
- 如果设置为true
,则在组件值发生变更时filter
组件自动对DataLoader
使用过滤。
FullTextFilter
的工作流程:首先使用全文搜索找到实体的 id,然后在数据加载器中添加带这些 ID 的过滤条件。最后,关联至同一个加载器的 Table
或 DataGrid
只展示符合全文搜索条件的记录,如果列表组件有其他过滤器,也会生效。
搜索策略
搜索策略定义如何处理搜索词。
SearchField
和 FullTextFilter
组件支持下列搜索策略:
-
anyTermAnyField
- 文档的任何索引字段匹配至少一个输入词。 -
allTermsAnyField
- 文档的任何索引字段以任何顺序匹配上所有的输入词。这是默认策略。 -
allTermsSingleField
- 文档至少有一个字段包含任意顺序的所有输入词。 -
phrase
- 文档至少有一个字段包含输入顺序的所有输入词。
可以使用 strategy
属性设置合适的搜索策略,示例:
<search:searchField id="mySearchField" strategy="allTermsAnyField"/>
如需覆盖默认策略,在 application.properties
文件添加下列应用程序属性:
jmix.search.default-search-strategy = allTermsSingleField
另外,也可以创建自己的搜索策略。为此,首先创建一个继承自 io.jmix.search.searching.SearchStrategy
的 bean,实现下列方法:
-
String getName()
- 返回策略的唯一名称。 -
void configureRequest(SearchRequest searchRequest, SearchContext searchContext)
- 根据需要配置传入的SearchRequest
。
然后,可以在 SearchField
或 FullTextFilter
组件使用策略名称设置策略。
过滤器组件中的全文搜索条件
当项目中添加了搜索扩展组件后,Filter
组件的 Add condition(添加条件) 窗口会出现一个新的条件:
在 Full-text filter condition editor(全文过滤条件编辑) 窗口,你可以为全文过滤器设置标题并选择一个搜索策略。如果未设置,则使用默认策略。
与过滤器关联的列表组件中的记录会基于全文搜索结果过滤。
界面中使用搜索 API
界面控制器中可以使用搜索 API,示例:
@Autowired
private EntitySearcher entitySearcher;
@Autowired
private SearchResultProcessor searchResultProcessor;
@Subscribe("searchBtn") (1)
public void onSearchBtnClick(Button.ClickEvent event) {
SearchContext searchContext = new SearchContext("silver") (2)
.setSize(20) (3)
.setEntities("search_Order"); (4)
SearchResult searchResult = entitySearcher.search(searchContext); (5)
Collection<Object> instances =
searchResultProcessor.loadEntityInstances(searchResult); (6)
// ...
}
1 | 点击按钮时,从界面控制器调用 API。 |
2 | 定义搜索字符串,这一步是必须的,会搜索所有的索引字段,并找出其中是否包含 "silver" 。 |
3 | 设置返回结果集中包含的记录数量。默认值为 10 。 |
4 | 设置搜索的实体。默认会搜素全部的索引实体。 |
5 | 使用 EntitySearcher 服务启动搜索。 |
6 | 使用 SearchResultProcessor 从搜索结果中获取实体。 |