2017-04-05 14 views
0

我有以下模型。Hibernate搜索/ Lucene:字符串字段不能用于排序“索引与每个文档的多个值,使用SORTED_SET,而不是”

public class FeatureMeta { 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private Long id; 

    @Column(unique=true) 
    private String uri; 

    @Column 
    @Field 
    private String name; 

    @Field 
    @Column 
    private String businessDesc; 

    @Field 
    @Column 
    private String logicalDesc; 

    . 
    . 

} 

我试图用 “名” 的文件如下排序:

org.hibernate.search.jpa.FullTextQuery jpaQuery = 
        fullTextEntityManager.createFullTextQuery(aggrBuilder.build(), FeatureMeta.class); 
. 
.  

SortFieldContext sortCtx = queryBuilder.sort().byField("name",SortField.Type.STRING); 
jpaQuery.setSort(sortCtx.createSort()); 
. 

但是Lucene的抛出下面的异常?

java.lang.IllegalStateException:类型不匹配:名称与每个文档 多个值索引,使用SORTED_SET而不是在 org.apache.lucene.uninverting.FieldCacheImpl $ SortedDocValuesCache.createValue(FieldCacheImpl.java:678) 在 org.apache.lucene.uninverting.FieldCacheImpl $ Cache.get(FieldCacheImpl.java:189) 在 org.apache.lucene.uninverting.FieldCacheImpl.getTermsIndex(FieldCacheImpl.java:646) 在 org.apache .lucene.uninverting.FieldCacheImpl.getTermsIndex(FieldCacheImpl.java:626) at org.apac he.lucene.uninverting.UninvertingReader.getSortedDocValues(UninvertingReader.java:256) 在org.apache.lucene.index.DocValues.getSorted(DocValues.java:262) 在 org.apache.lucene.search.FieldComparator $ TermOrdValComparator .getSortedDocValues(FieldComparator.java:762) 在 org.apache.lucene.search.FieldComparator $ TermOrdValComparator.getLeafComparator(FieldComparator.java:767) 在 org.apache.lucene.search.FieldValueHitQueue.getComparators(FieldValueHitQueue.java :183) at org.apache.lucene.search.TopFieldCollector $ SimpleFieldCollector.getLeafCollector(TopFieldCollector.java:164) at org.apache.lucene.search.IndexSearcher.search(IndexSearcher.jav一:812) 在 org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:535) 在 org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:523) 在 有机.hibernate.search.query.engine.impl.LazyQueryState.search(LazyQueryState.java:103)

任何提示?

回答

1

编辑:其实,在别的之前,你应该检查你在name字段上使用的分析仪。分析器可能有一个标记器,这将导致多值字段,无法排序。 尝试添加不同的字段进行排序,并在此领域使用的分析仪具有KeywordTokenizer

@AnalyzerDef(name = "sort_analyzer", 
    tokenizer = @TokenizerDef(factory = KeywordTokenizerFactory.class), 
    filters = { 
     @TokenFilterDef(factory = ASCIIFoldingFilterFactory.class), 
     @TokenFilterDef(factory = LowerCaseFilterFactory.class) 
    } 
) 
public class FeatureMeta { 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private Long id; 

    @Column(unique=true) 
    private String uri; 

    @Column 
    @Field 
    @Field(name = "name_sort", analyzer = @Analyzer(definition = "sort_analyzer")) 
    private String name; 

    @Field 
    @Column 
    private String businessDesc; 

    @Field 
    @Column 
    private String logicalDesc; 

    . 
    . 

} 

在这个新的领域的排序之后,而不是默认的一个:

SortFieldContext sortCtx = queryBuilder.sort().byField("name_sort",SortField.Type.STRING); 

原始答案(我提出的观点仍然有效):

不确定是什么原因导致您的案例发生异常,但是尝试在代码中修复这些问题:

  1. 添加在name财产
  2. 一个@SortableField注释不要使用queryBuilder.sort().byField("name",SortField.Type.STRING),只是用queryBuilder.sort().byField("name")

如果它不工作,也许你应该试着擦索引和重建索引。

+0

谢谢你的回答。但是,我无法为字段使用两次Field注解。 Eclipse给出错误:“不可重复类型字段的重复注释。只有标记为可重复的注释类型可以在一个目标上多次使用。” –

+0

我只是在模型中创建一个新的属性。 –

+1

似乎你使用的是旧版本的Hibernate Search;使用@Fields({@Field(...),@Field(...)}) –

相关问题