@SortableFieldを付けるとそのFieldに対してソート用のインデックスが作成されるようになる。
@Field(analyze = Analyze.NO)
@SortableField
private String description;
但し、ソート可能とするFieldはトークン化してはいけない。そのため、FieldをAnalyze.NOとするか、Normalizerを指定する必要がある。(AnalyzerとNormalizerは排他的なのでNormalizerを指定すると結果的にAnalyze.NOになっている)
@NormalizerDef(name = "novelSort", filters = @TokenFilterDef(factory = LowerCaseFilterFactory.class))
public class Novel extends BaseObject implements Serializable {
@Field
@Field(name = "descriptionSort", normalizer = @Normalizer(definition = "novelSort"))
@SortableField(forField = "descriptionSort")
private String description;
実は@SortableFieldを指定しなくてもソート自体は出来るがインデックスが無いので、パフォーマンスが悪い。
Sort sort = new Sort(new SortField("descriptionSort", SortField.Type.STRING))
FullTextQuery query = ...
query.setSort(sort);