簡體   English   中英

Hibernate 帶有枚舉字段的搜索/Lucene 范圍查詢不返回任何結果

[英]Hibernate Search/Lucene range query with enum field doesn't return any results

使用 Hibernate 時搜索以下枚舉字段:

public class UserSkill {
    @Enumerated
    @Field
    private UserSkillLevel level; // <- this is the field we're using on the ranged query
}

public class User { // <- this is the root class
    @IndexedEmbedded
    private Set<UserSkill> skills = new HashSet<>();
}

這是枚舉:

public enum UserSkillLevel {
    JUNIOR,
    CONFIRMED,
    ADVANCED,
    EXPERT
}

嘗試進行范圍查詢時:

var fullTextEntityManager = Search.getFullTextEntityManager(entityManager);

var queryBuilder = fullTextEntityManager.getSearchFactory().buildQueryBuilder().forEntity(User.class).get();

var bq = new BooleanQuery.Builder();

var q = queryBuilder.range().onField("skills.level").above(UserSkillLevel.ADVANCED).createQuery();
bq.add(q, BooleanClause.Occur.MUST);

return fullTextEntityManager.createFullTextQuery(bq.build(), User.class).getResultList();

問題是即使用戶具有高級或專家技能,也不會返回任何結果。

默認情況下,枚舉是作為字符串的索引,因此您要求的范圍實際上是“名稱按字母順序排列在單詞 'ADVANCED' 之后的每個技能級別”

因此,我希望這可以匹配所有內容 也許您在更改映射后忘記重新索引數據?

無論如何......如果您想將您的枚舉索引為它們的序數,請實現一個自定義橋:

public class EnumAsIntegerBridge implements MetadataProvidingFieldBridge {
    @Override
    public void configureFieldMetadata(String name, FieldMetadataBuilder builder) {
        builder.field( name, FieldType.INTEGER );
    }

    @Override
    public void set(String name, Object value, Document document, LuceneOptions luceneOptions) {
        Enum<?> enum = (Enum<?>) value;

        if ( enum != null ) {
            luceneOptions.addNumericFieldToDocument( name, enum.ordinal(), document );
        }
    }
}

然后在您的映射中使用它:

public class UserSkill {
    @Enumerated
    @Field(bridge = @FieldBridge(impl = EnumAsIntegerBridge.class))
    private UserSkillLevel level;
}

public class User {
    @IndexedEmbedded
    private Set<UserSkill> skills = new HashSet<>();
}

並將序數而不是枚舉傳遞給查詢:

var q = queryBuilder.range().onField("skills.level").above(UserSkillLevel.ADVANCED.ordinal()).createQuery();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM