如何对 indexedEmbedded 中的字段进行排序
How to sort on a field in indexedEmbedded
我在 class 中有一个具有 @OneToMany 关系的 indexedEmbedded 对象,我想使用该对象中包含的字段进行排序。
当我调用我的搜索方法时,我得到了这个异常:
"Unexpected docvalues type NONE for field 'employees.id_forSort' (expected=NUMERIC). Use UninvertingReader or index with docvalues"
提前致谢!
这是我的代码:
public Company {
....
@IndexedEmbedded(prefix = "students.", includeEmbeddedObjectId = true)
@OneToMany(mappedBy = "company")
private Set<Employee> employees= new HashSet<>();
}
public Employee{
....
@SortableField(forField = "id_forSort")
@Field(name = "id_forSort", analyze = Analyze.NO)
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
}
public class CompanySearchRepository{
....
public List<Company> searchCompany(
DataTablePagination pagination, Long id, SearchCriteria searchCriteria) {
FilterField[] filterFields = validateFilterFields(searchCriteria.getFilterFields());
// Sorting
String sortField = "employees.id";
Sort sort = getSort(sortField, pagination.getSortDirection());
Query query;
if (filterFields.length > 0) {
query = getFilterableColumnsQuery(filterFields);
} else {
// global search
query = getGlobalSearchQuery(searchableFields, searchCriteria.getSearchTerm());
}
FullTextQuery fullTextQuery = getFullTextQuery(query);
initPagination(
fullTextQuery,
sort,
pagination.getPage(),
pagination.getPageSize());
List<Company> data = fullTextQuery.getResultList();
}
Sort getSort(String sortField, SortDirection sortDirection) {
SortFieldContext sortFieldContext =
getQueryBuilder().sort().byField(sortField.concat("_forSort"));
return sortDirection.equals(SortDirection.ASC)
? sortFieldContext.asc().createSort()
: sortFieldContext.desc().createSort();
}
}
您将可排序字段命名为 employees.id_forSort
,但在搜索时,您正在使用另一个字段进行排序:employees.id
。使用用于排序的字段。将 String sortField = "employees.id";
替换为 String sortField = "employees.id_forSort";
不好意思,我没有看到 getSort
方法中的字段名称添加后缀的奇怪代码。然后消息很奇怪。万一你的索引是空的?
- 不支持对多值字段进行排序。您可能会从一次执行中得到不同的结果,因为搜索引擎必须 select 一个用于排序的值,而哪个值是 selected 是未定义的。
无论技术方面如何,我都不确定您要实现的目标。结果您得到 Company
个实例,并希望它们按 Employee
ID 排序,其中每个 Company
有很多。这是什么意思?你想要员工最年长的公司优先?还有别的吗?如果您只是想稳定点击顺序,我建议您改用公司 ID。
我在 class 中有一个具有 @OneToMany 关系的 indexedEmbedded 对象,我想使用该对象中包含的字段进行排序。
当我调用我的搜索方法时,我得到了这个异常:
"Unexpected docvalues type NONE for field 'employees.id_forSort' (expected=NUMERIC). Use UninvertingReader or index with docvalues"
提前致谢!
这是我的代码:
public Company {
....
@IndexedEmbedded(prefix = "students.", includeEmbeddedObjectId = true)
@OneToMany(mappedBy = "company")
private Set<Employee> employees= new HashSet<>();
}
public Employee{
....
@SortableField(forField = "id_forSort")
@Field(name = "id_forSort", analyze = Analyze.NO)
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
}
public class CompanySearchRepository{
....
public List<Company> searchCompany(
DataTablePagination pagination, Long id, SearchCriteria searchCriteria) {
FilterField[] filterFields = validateFilterFields(searchCriteria.getFilterFields());
// Sorting
String sortField = "employees.id";
Sort sort = getSort(sortField, pagination.getSortDirection());
Query query;
if (filterFields.length > 0) {
query = getFilterableColumnsQuery(filterFields);
} else {
// global search
query = getGlobalSearchQuery(searchableFields, searchCriteria.getSearchTerm());
}
FullTextQuery fullTextQuery = getFullTextQuery(query);
initPagination(
fullTextQuery,
sort,
pagination.getPage(),
pagination.getPageSize());
List<Company> data = fullTextQuery.getResultList();
}
Sort getSort(String sortField, SortDirection sortDirection) {
SortFieldContext sortFieldContext =
getQueryBuilder().sort().byField(sortField.concat("_forSort"));
return sortDirection.equals(SortDirection.ASC)
? sortFieldContext.asc().createSort()
: sortFieldContext.desc().createSort();
}
}
您将可排序字段命名为不好意思,我没有看到employees.id_forSort
,但在搜索时,您正在使用另一个字段进行排序:employees.id
。使用用于排序的字段。将String sortField = "employees.id";
替换为String sortField = "employees.id_forSort";
getSort
方法中的字段名称添加后缀的奇怪代码。然后消息很奇怪。万一你的索引是空的?- 不支持对多值字段进行排序。您可能会从一次执行中得到不同的结果,因为搜索引擎必须 select 一个用于排序的值,而哪个值是 selected 是未定义的。
无论技术方面如何,我都不确定您要实现的目标。结果您得到 Company
个实例,并希望它们按 Employee
ID 排序,其中每个 Company
有很多。这是什么意思?你想要员工最年长的公司优先?还有别的吗?如果您只是想稳定点击顺序,我建议您改用公司 ID。