【问题标题】:Hibernate Search: configure Facet for custom FieldBridgeHibernate Search:为自定义 FieldBridge 配置 Facet
【发布时间】:2018-02-27 05:50:56
【问题描述】:

在这个例子中DateSplitBridge.java动态字段被添加到索引文档中:

public class DateSplitBridge implements FieldBridge {
...
   public void set(String name, Object value, Document document, LuceneOptions luceneOptions) {
...
      luceneOptions.addFieldToDocument( name + ".year", String.valueOf( year ), document);
...

如何为此类临时字段配置 Facet? 是否可以在 FieldBridge 本身中完成?

【问题讨论】:

    标签: java lucene hibernate-search facet


    【解决方案1】:

    https://hibernate.atlassian.net/browse/HSEARCH-1686?page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel&showAll=true找到解决方案

    这里采用的版本:companyId是实体成员(Long),isFavorite也是成员(布尔)。结果:在索引文档中有类似的字段:customFieldFacet_1234,其值为:“true”或“false”。注意:没有@Facet注解

    用法:

    @Field(analyze = Analyze.NO, store = Store.YES, bridge = @FieldBridge(impl = CustomFieldBridge.class))
    @Transient
    public CustomField getFacetingCustomField() {
        return new CustomField("customFieldFacet_" + companyId, isFavorite);
    }
    

    场桥:

    import org.apache.lucene.document.Document;
    import org.apache.lucene.facet.sortedset.SortedSetDocValuesFacetField;
    import org.hibernate.search.bridge.FieldBridge;
    import org.hibernate.search.bridge.LuceneOptions;
    
    import java.io.IOException;
    
    public class CustomFieldBridge implements FieldBridge {
    
        public void set(String name, Object value, Document document, LuceneOptions luceneOptions) {
            if (value != null) {
                CustomField customField = (CustomField) value;
                if (customField.getFieldValue() != null) {
                    String fieldName = customField.getFieldName();
                    String fieldValue = customField.getFieldValue();
                    CustomFacetsConfig config = new CustomFacetsConfig();
                    config.setIndexFieldName(fieldName, fieldName);
                    Document doc = new Document();
                    doc.add(new SortedSetDocValuesFacetField(fieldName, fieldValue));
                    try {
                        config.CustomBuild(doc, document);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    

    CustomFacetConfig:

    import org.apache.lucene.document.Document;
    import org.apache.lucene.document.Field;
    import org.apache.lucene.document.SortedSetDocValuesField;
    import org.apache.lucene.document.StringField;
    import org.apache.lucene.facet.FacetsConfig;
    import org.apache.lucene.facet.sortedset.SortedSetDocValuesFacetField;
    import org.apache.lucene.facet.taxonomy.FacetLabel;
    import org.apache.lucene.index.IndexableField;
    import org.apache.lucene.util.BytesRef;
    
    import java.io.IOException;
    import java.util.*;
    
    public class CustomFacetsConfig extends FacetsConfig {
    
        public Document CustomBuild(Document doc, Document destDocument) throws IOException {
            Map<String, List<SortedSetDocValuesFacetField>> dvByField = new HashMap<>();
            Set<String> seenDims = new HashSet<>();
            for (IndexableField field : doc.getFields()) {
                if (field.fieldType() == SortedSetDocValuesFacetField.TYPE) {
                    SortedSetDocValuesFacetField facetField = (SortedSetDocValuesFacetField) field;
                    FacetsConfig.DimConfig dimConfig = getDimConfig(facetField.dim);
                    if (dimConfig.multiValued == false) {
                        checkSeen(seenDims, facetField.dim);
                    }
                    String indexFieldName = dimConfig.indexFieldName;
                    List<SortedSetDocValuesFacetField> fields = dvByField.get(indexFieldName);
                    if (fields == null) {
                        fields = new ArrayList<>();
                        dvByField.put(indexFieldName, fields);
                    }
                    fields.add(facetField);
                }
            }
            processSSDVFacetFields(dvByField, destDocument);
            return destDocument;
        }
    
        private void checkSeen(Set<String> seenDims, String dim) {
            if (seenDims.contains(dim)) {
                throw new IllegalArgumentException("dimension " + dim + " is not multiValued, but it appears more than once in this document");
            }
            seenDims.add(dim);
        }
    
        private void processSSDVFacetFields(Map<String, List<SortedSetDocValuesFacetField>> byField, Document doc) throws IOException {
            for (Map.Entry<String, List<SortedSetDocValuesFacetField>> ent : byField.entrySet()) {
                String indexFieldName = ent.getKey();
                for (SortedSetDocValuesFacetField facetField : ent.getValue()) {
                    FacetLabel cp = new FacetLabel(facetField.dim, facetField.label);
                    String fullPath = pathToString(cp.components, cp.length);
                    doc.add(new SortedSetDocValuesField(indexFieldName, new BytesRef(fullPath)));
                    doc.add(new StringField(indexFieldName, fullPath, Field.Store.YES));
                }
            }
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2020-03-14
      • 1970-01-01
      • 1970-01-01
      • 2013-11-15
      • 1970-01-01
      • 1970-01-01
      • 2014-11-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多