<tfoot id='deykt'></tfoot>
<i id='deykt'><tr id='deykt'><dt id='deykt'><q id='deykt'><span id='deykt'><b id='deykt'><form id='deykt'><ins id='deykt'></ins><ul id='deykt'></ul><sub id='deykt'></sub></form><legend id='deykt'></legend><bdo id='deykt'><pre id='deykt'><center id='deykt'></center></pre></bdo></b><th id='deykt'></th></span></q></dt></tr></i><div id='deykt'><tfoot id='deykt'></tfoot><dl id='deykt'><fieldset id='deykt'></fieldset></dl></div>

<small id='deykt'></small><noframes id='deykt'>

<legend id='deykt'><style id='deykt'><dir id='deykt'><q id='deykt'></q></dir></style></legend>

      <bdo id='deykt'></bdo><ul id='deykt'></ul>

    1. Hibernate Search:为自定义 FieldBridge 配置 Facet

      时间:2023-06-28
      <tfoot id='aQTSV'></tfoot>
        <bdo id='aQTSV'></bdo><ul id='aQTSV'></ul>
          • <legend id='aQTSV'><style id='aQTSV'><dir id='aQTSV'><q id='aQTSV'></q></dir></style></legend>
              <tbody id='aQTSV'></tbody>

            • <small id='aQTSV'></small><noframes id='aQTSV'>

              <i id='aQTSV'><tr id='aQTSV'><dt id='aQTSV'><q id='aQTSV'><span id='aQTSV'><b id='aQTSV'><form id='aQTSV'><ins id='aQTSV'></ins><ul id='aQTSV'></ul><sub id='aQTSV'></sub></form><legend id='aQTSV'></legend><bdo id='aQTSV'><pre id='aQTSV'><center id='aQTSV'></center></pre></bdo></b><th id='aQTSV'></th></span></q></dt></tr></i><div id='aQTSV'><tfoot id='aQTSV'></tfoot><dl id='aQTSV'><fieldset id='aQTSV'></fieldset></dl></div>

                本文介绍了Hibernate Search:为自定义 FieldBridge 配置 Facet的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

                问题描述

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

                In this example DateSplitBridge.java dynamic fields are added to indexed document:

                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 本身中完成吗?

                How do I configure Facet for such ad hoc fields? Can it be done in FieldBridge itself?

                推荐答案

                在 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注解

                Here is adopted version: companyId is entity member (Long), isFavorite also member (Boolean). As result: in the indexed document there are fields like: customFieldFacet_1234 with values: "true" or "false". Note: there is no @Facet annotation

                用法:

                @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:

                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));
                            }
                        }
                    }
                
                }
                

                这篇关于Hibernate Search:为自定义 FieldBridge 配置 Facet的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                上一篇:Lucene 与 EclipseLink 的集成 下一篇:为什么 Query、TermQuery 等不再在 Lucene 4.0 中实现 Serializable?

                相关文章

                  • <bdo id='ae93d'></bdo><ul id='ae93d'></ul>

                  1. <legend id='ae93d'><style id='ae93d'><dir id='ae93d'><q id='ae93d'></q></dir></style></legend>

                  2. <tfoot id='ae93d'></tfoot>

                    <small id='ae93d'></small><noframes id='ae93d'>

                    <i id='ae93d'><tr id='ae93d'><dt id='ae93d'><q id='ae93d'><span id='ae93d'><b id='ae93d'><form id='ae93d'><ins id='ae93d'></ins><ul id='ae93d'></ul><sub id='ae93d'></sub></form><legend id='ae93d'></legend><bdo id='ae93d'><pre id='ae93d'><center id='ae93d'></center></pre></bdo></b><th id='ae93d'></th></span></q></dt></tr></i><div id='ae93d'><tfoot id='ae93d'></tfoot><dl id='ae93d'><fieldset id='ae93d'></fieldset></dl></div>