如何对 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();
  }
}
  1. 您将可排序字段命名为 employees.id_forSort,但在搜索时,您正在使用另一个字段进行排序:employees.id。使用用于排序的字段。将 String sortField = "employees.id"; 替换为 String sortField = "employees.id_forSort"; 不好意思,我没有看到 getSort 方法中的字段名称添加后缀的奇怪代码。然后消息很奇怪。万一你的索引是空的?
  2. 不支持对多值字段进行排序。您可能会从一次执行中得到不同的结果,因为搜索引擎必须 select 一个用于排序的值,而哪个值是 selected 是未定义的。

无论技术方面如何,我都不确定您要实现的目标。结果您得到 Company 个实例,并希望它们按 Employee ID 排序,其中每个 Company 有很多。这是什么意思?你想要员工最年长的公司优先?还有别的吗?如果您只是想稳定点击顺序,我建议您改用公司 ID。