@SortableFieldを付けるとそのFieldに対してソート用のインデックスが作成されるようになる。
1 2 3 | @Field (analyze = Analyze.NO) @SortableField private String description; |
但し、ソート可能とするFieldはトークン化してはいけない。そのため、FieldをAnalyze.NOとするか、Normalizerを指定する必要がある。(AnalyzerとNormalizerは排他的なのでNormalizerを指定すると結果的にAnalyze.NOになっている)
1 2 3 4 5 6 7 | @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を指定しなくてもソート自体は出来るがインデックスが無いので、パフォーマンスが悪い。
1 2 3 4 | Sort sort = new Sort( new SortField( "descriptionSort" , SortField.Type.STRING)) FullTextQuery query = ... query.setSort(sort); |