Hibernate搜索 - 通过现场桥设置构面

时间:2016-02-26 00:11:48

标签: java hibernate-search

在Hibernate Search 5.3中引入了@Facet注释,必须使用它来将字段存储为Facet。我想知道的是,如果它们是一种在自定义字段桥中添加字段作为构面的方法,而不使用@Facet注释。

我的用例是我有一个带有类别的产品,类别树路径存储为字符串,如此

"0/10/100/1000"

我希望能够使用构面获得某个类别中所有产品的数量。类别的计数应包括所有子类别的计数,因此每个产品应为每个父类别都有一个方面

所以我想做的是:

public class CategoryPathFacetFieldBridge implements FieldBridge {
    public void set(String name, Object value, Document document, LuceneOptions luceneOptions) {
        String[] pathHolder = ((String)value).split("/");
        for (String id : pathHolder) {
            Field fieldForFacet = new Field(name, id, Field.Store.YES, Field.Index.NOT_ANALYZED);
            document.add(fieldForFacet);
        }
    }
}

我实际上已经提出了一种解决方法,但我首选的方法是使用上面的自定义字段桥。有谁知道这在hibernate search 5.3+中是否可行?

我的解决方法如下:

public void setCategoryPath(String categoryPath) {
    this.categoryPath = categoryPath;
    String[] pathHolder = categoryPath.split("/");
    for (String id : pathHolder) {
        this.categoryPathList.add(new CategoryWrap(id));
    }
}

@Transient
@IndexedEmbedded
@OneToMany
public List<CategoryWrap> getCategoryPathList() {
    return this.categoryPathList;
}

class CategoryWrap{

    @Field(analyze = Analyze.NO)
    @Facet(encoding = FacetEncodingType.STRING)
    String categoryId;

    public CategoryWrap(String categoryId) {
        this.categoryId = categoryId;
    }
}

0 个答案:

没有答案