This is an automated email from the ASF dual-hosted git repository. madhan pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/atlas.git
The following commit(s) were added to refs/heads/master by this push: new 0c1c390dd ATLAS-5073: ensure propertyKey is created before using it (#401) 0c1c390dd is described below commit 0c1c390dd94b6aed05b0386f80c43fb5de5d4566 Author: Madhan Neethiraj <mad...@apache.org> AuthorDate: Wed Jul 16 08:39:22 2025 -0700 ATLAS-5073: ensure propertyKey is created before using it (#401) --- addons/kafka-bridge/pom.xml | 6 -- .../repository/graph/GraphBackedSearchIndexer.java | 24 ++++++++ .../store/graph/v2/AtlasAbstractDefStoreV2.java | 8 +++ .../store/graph/v2/AtlasEnumDefStoreV2.java | 55 ++++++++++++++--- .../store/graph/v2/AtlasStructDefStoreV2.java | 71 ++++++++++++++++------ .../resources/solr/core-template/solrconfig.xml | 2 +- 6 files changed, 133 insertions(+), 33 deletions(-) diff --git a/addons/kafka-bridge/pom.xml b/addons/kafka-bridge/pom.xml index 1f0f54eab..ba4923000 100644 --- a/addons/kafka-bridge/pom.xml +++ b/addons/kafka-bridge/pom.xml @@ -342,12 +342,6 @@ </resources> </configuration> </execution> - </executions> - </plugin> - - <plugin> - <artifactId>maven-resources-plugin</artifactId> - <executions> <execution> <id>copy-solr-resources</id> <goals> diff --git a/repository/src/main/java/org/apache/atlas/repository/graph/GraphBackedSearchIndexer.java b/repository/src/main/java/org/apache/atlas/repository/graph/GraphBackedSearchIndexer.java index 4512ac63d..3abb3db3f 100755 --- a/repository/src/main/java/org/apache/atlas/repository/graph/GraphBackedSearchIndexer.java +++ b/repository/src/main/java/org/apache/atlas/repository/graph/GraphBackedSearchIndexer.java @@ -90,6 +90,8 @@ import static org.apache.atlas.model.typedef.AtlasBaseTypeDef.ATLAS_TYPE_INT; import static org.apache.atlas.model.typedef.AtlasBaseTypeDef.ATLAS_TYPE_LONG; import static org.apache.atlas.model.typedef.AtlasBaseTypeDef.ATLAS_TYPE_SHORT; import static org.apache.atlas.model.typedef.AtlasBaseTypeDef.ATLAS_TYPE_STRING; +import static org.apache.atlas.repository.Constants.ATTRIBUTE_INDEX_PROPERTY_KEY; +import static org.apache.atlas.repository.Constants.ATTRIBUTE_KEY_PROPERTY_KEY; import static org.apache.atlas.repository.Constants.BACKING_INDEX; import static org.apache.atlas.repository.Constants.CLASSIFICATION_EDGE_IS_PROPAGATED_PROPERTY_KEY; import static org.apache.atlas.repository.Constants.CLASSIFICATION_EDGE_NAME_PROPERTY_KEY; @@ -121,6 +123,11 @@ import static org.apache.atlas.repository.Constants.PROPAGATED_TRAIT_NAMES_PROPE import static org.apache.atlas.repository.Constants.PROPERTY_KEY_AUDIT_REDUCTION_NAME; import static org.apache.atlas.repository.Constants.PROPERTY_KEY_INDEX_RECOVERY_NAME; import static org.apache.atlas.repository.Constants.PROVENANCE_TYPE_KEY; +import static org.apache.atlas.repository.Constants.RELATIONSHIPTYPE_CATEGORY_KEY; +import static org.apache.atlas.repository.Constants.RELATIONSHIPTYPE_END1_KEY; +import static org.apache.atlas.repository.Constants.RELATIONSHIPTYPE_END2_KEY; +import static org.apache.atlas.repository.Constants.RELATIONSHIPTYPE_LABEL_KEY; +import static org.apache.atlas.repository.Constants.RELATIONSHIPTYPE_TAG_PROPAGATION_KEY; import static org.apache.atlas.repository.Constants.RELATIONSHIP_GUID_PROPERTY_KEY; import static org.apache.atlas.repository.Constants.RELATIONSHIP_TYPE_PROPERTY_KEY; import static org.apache.atlas.repository.Constants.STATE_PROPERTY_KEY; @@ -131,8 +138,13 @@ import static org.apache.atlas.repository.Constants.TASK_STATUS; import static org.apache.atlas.repository.Constants.TASK_TYPE_PROPERTY_KEY; import static org.apache.atlas.repository.Constants.TIMESTAMP_PROPERTY_KEY; import static org.apache.atlas.repository.Constants.TRAIT_NAMES_PROPERTY_KEY; +import static org.apache.atlas.repository.Constants.TYPEDESCRIPTION_PROPERTY_KEY; import static org.apache.atlas.repository.Constants.TYPENAME_PROPERTY_KEY; +import static org.apache.atlas.repository.Constants.TYPEOPTIONS_PROPERTY_KEY; import static org.apache.atlas.repository.Constants.TYPESERVICETYPE_PROPERTY_KEY; +import static org.apache.atlas.repository.Constants.TYPEVERSION_PROPERTY_KEY; +import static org.apache.atlas.repository.Constants.TYPE_CATEGORY_PROPERTY_KEY; +import static org.apache.atlas.repository.Constants.VERSION_PROPERTY_KEY; import static org.apache.atlas.repository.Constants.VERTEX_INDEX; import static org.apache.atlas.repository.Constants.VERTEX_TYPE_PROPERTY_KEY; import static org.apache.atlas.repository.graphdb.AtlasCardinality.LIST; @@ -631,9 +643,21 @@ public class GraphBackedSearchIndexer implements SearchIndexer, ActiveStateChang // create fulltext indexes createFullTextIndex(management, ENTITY_TEXT_PROPERTY_KEY, String.class, SINGLE); + createPropertyKey(management, TYPE_CATEGORY_PROPERTY_KEY, String.class, SINGLE); + createPropertyKey(management, TYPEDESCRIPTION_PROPERTY_KEY, String.class, SINGLE); + createPropertyKey(management, TYPEVERSION_PROPERTY_KEY, String.class, SINGLE); + createPropertyKey(management, VERSION_PROPERTY_KEY, Long.class, SINGLE); + createPropertyKey(management, TYPEOPTIONS_PROPERTY_KEY, String.class, SINGLE); createPropertyKey(management, IS_PROXY_KEY, Boolean.class, SINGLE); createPropertyKey(management, PROVENANCE_TYPE_KEY, Integer.class, SINGLE); createPropertyKey(management, HOME_ID_KEY, String.class, SINGLE); + createPropertyKey(management, ATTRIBUTE_INDEX_PROPERTY_KEY, Integer.class, SINGLE); + createPropertyKey(management, ATTRIBUTE_KEY_PROPERTY_KEY, String.class, SINGLE); + createPropertyKey(management, RELATIONSHIPTYPE_END1_KEY, String.class, SINGLE); + createPropertyKey(management, RELATIONSHIPTYPE_END2_KEY, String.class, SINGLE); + createPropertyKey(management, RELATIONSHIPTYPE_CATEGORY_KEY, String.class, SINGLE); + createPropertyKey(management, RELATIONSHIPTYPE_LABEL_KEY, String.class, SINGLE); + createPropertyKey(management, RELATIONSHIPTYPE_TAG_PROPAGATION_KEY, String.class, SINGLE); commit(management); diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasAbstractDefStoreV2.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasAbstractDefStoreV2.java index e98d60efb..1d61aa978 100644 --- a/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasAbstractDefStoreV2.java +++ b/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasAbstractDefStoreV2.java @@ -27,6 +27,8 @@ import org.apache.atlas.exception.AtlasBaseException; import org.apache.atlas.model.typedef.AtlasBaseTypeDef; import org.apache.atlas.model.typedef.AtlasStructDef; import org.apache.atlas.query.AtlasDSL; +import org.apache.atlas.repository.graphdb.AtlasCardinality; +import org.apache.atlas.repository.graphdb.AtlasGraphManagement; import org.apache.atlas.repository.graphdb.AtlasVertex; import org.apache.atlas.repository.store.graph.AtlasDefStore; import org.apache.atlas.type.AtlasType; @@ -169,4 +171,10 @@ abstract class AtlasAbstractDefStoreV2<T extends AtlasBaseTypeDef> implements At public boolean isInvalidTypeDefName(String typeName) { return INVALID_TYPEDEF_NAMES_LIST.contains(typeName); } + + protected static void createPropertyKey(String propertyKey, Class<?> clz, AtlasCardinality cardinality, AtlasGraphManagement management) { + if (!management.containsPropertyKey(propertyKey)) { + management.makePropertyKey(propertyKey, clz, cardinality); + } + } } diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasEnumDefStoreV2.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasEnumDefStoreV2.java index 7cca4e2a7..6977b737f 100644 --- a/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasEnumDefStoreV2.java +++ b/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasEnumDefStoreV2.java @@ -25,6 +25,9 @@ import org.apache.atlas.exception.AtlasBaseException; import org.apache.atlas.model.typedef.AtlasEnumDef; import org.apache.atlas.model.typedef.AtlasEnumDef.AtlasEnumElementDef; import org.apache.atlas.repository.Constants; +import org.apache.atlas.repository.IndexException; +import org.apache.atlas.repository.graphdb.AtlasCardinality; +import org.apache.atlas.repository.graphdb.AtlasGraphManagement; import org.apache.atlas.repository.graphdb.AtlasVertex; import org.apache.atlas.type.AtlasTypeRegistry; import org.apache.atlas.typesystem.types.DataTypes.TypeCategory; @@ -37,6 +40,8 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import static org.apache.atlas.repository.store.graph.v2.AtlasGraphUtilsV2.encodePropertyKey; + /** * EnumDef store in v2 format. */ @@ -239,14 +244,11 @@ class AtlasEnumDefStoreV2 extends AtlasAbstractDefStoreV2<AtlasEnumDef> { throw new AtlasBaseException(AtlasErrorCode.MISSING_MANDATORY_ATTRIBUTE, enumDef.getName(), "values"); } + createPropertyKeys(enumDef); + List<String> values = new ArrayList<>(enumDef.getElementDefs().size()); for (AtlasEnumElementDef element : enumDef.getElementDefs()) { - // Validate the enum element - if (StringUtils.isEmpty(element.getValue()) || null == element.getOrdinal()) { - throw new AtlasBaseException(AtlasErrorCode.MISSING_MANDATORY_ATTRIBUTE, enumDef.getName(), "elementValue"); - } - String elemKey = AtlasGraphUtilsV2.getTypeDefPropertyKey(enumDef, element.getValue()); AtlasGraphUtilsV2.setProperty(vertex, elemKey, element.getOrdinal()); @@ -259,10 +261,9 @@ class AtlasEnumDefStoreV2 extends AtlasAbstractDefStoreV2<AtlasEnumDef> { values.add(element.getValue()); } - AtlasGraphUtilsV2.setProperty(vertex, AtlasGraphUtilsV2.getTypeDefPropertyKey(enumDef), values); - String defaultValueKey = AtlasGraphUtilsV2.getTypeDefPropertyKey(enumDef, "defaultValue"); - AtlasGraphUtilsV2.setProperty(vertex, defaultValueKey, enumDef.getDefaultValue()); + AtlasGraphUtilsV2.setProperty(vertex, AtlasGraphUtilsV2.getTypeDefPropertyKey(enumDef), values); + AtlasGraphUtilsV2.setProperty(vertex, AtlasGraphUtilsV2.getTypeDefPropertyKey(enumDef, "defaultValue"), enumDef.getDefaultValue()); } private AtlasEnumDef toEnumDef(AtlasVertex vertex) { @@ -281,7 +282,13 @@ class AtlasEnumDefStoreV2 extends AtlasAbstractDefStoreV2<AtlasEnumDef> { typeDefStore.vertexToTypeDef(vertex, ret); List<AtlasEnumElementDef> elements = new ArrayList<>(); - List<String> elemValues = vertex.getProperty(AtlasGraphUtilsV2.getTypeDefPropertyKey(ret), List.class); + Object names = vertex.getProperty(AtlasGraphUtilsV2.getTypeDefPropertyKey(ret), Object.class); + List<String> elemValues = names instanceof List ? (List<String>) names : new ArrayList<>(); + + if (names == null) { + LOG.warn("failed to load element names for enum {}", ret.getName()); + } + for (String elemValue : elemValues) { String elemKey = AtlasGraphUtilsV2.getTypeDefPropertyKey(ret, elemValue); String descKey = AtlasGraphUtilsV2.getTypeDefPropertyKey(elemKey, "description"); @@ -299,4 +306,34 @@ class AtlasEnumDefStoreV2 extends AtlasAbstractDefStoreV2<AtlasEnumDef> { return ret; } + + private void createPropertyKeys(AtlasEnumDef enumDef) throws AtlasBaseException { + AtlasGraphManagement management = typeDefStore.atlasGraph.getManagementSystem(); + + // create property keys first + for (AtlasEnumElementDef element : enumDef.getElementDefs()) { + // Validate the enum element + if (StringUtils.isEmpty(element.getValue()) || null == element.getOrdinal()) { + throw new AtlasBaseException(AtlasErrorCode.MISSING_MANDATORY_ATTRIBUTE, enumDef.getName(), "elementValue"); + } + + String elemKey = AtlasGraphUtilsV2.getTypeDefPropertyKey(enumDef, element.getValue()); + + createPropertyKey(encodePropertyKey(elemKey), Integer.class, AtlasCardinality.SINGLE, management); + } + + String typeDefKey = AtlasGraphUtilsV2.getTypeDefPropertyKey(enumDef); + String defaultValueKey = AtlasGraphUtilsV2.getTypeDefPropertyKey(enumDef, "defaultValue"); + + createPropertyKey(encodePropertyKey(typeDefKey), Object.class, AtlasCardinality.SINGLE, management); + createPropertyKey(encodePropertyKey(defaultValueKey), String.class, AtlasCardinality.SINGLE, management); + + try { + management.commit(); + } catch (Exception e) { + LOG.error("PropertyKey creation failed", e); + + throw new AtlasBaseException(new IndexException("Index commit failed", e)); + } + } } diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasStructDefStoreV2.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasStructDefStoreV2.java index b5ef5ab51..3c891bbcb 100644 --- a/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasStructDefStoreV2.java +++ b/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasStructDefStoreV2.java @@ -28,6 +28,9 @@ import org.apache.atlas.model.typedef.AtlasStructDef; import org.apache.atlas.model.typedef.AtlasStructDef.AtlasAttributeDef; import org.apache.atlas.model.typedef.AtlasStructDef.AtlasConstraintDef; import org.apache.atlas.repository.Constants; +import org.apache.atlas.repository.IndexException; +import org.apache.atlas.repository.graphdb.AtlasCardinality; +import org.apache.atlas.repository.graphdb.AtlasGraphManagement; import org.apache.atlas.repository.graphdb.AtlasVertex; import org.apache.atlas.type.AtlasRelationshipType; import org.apache.atlas.type.AtlasStructType; @@ -64,28 +67,19 @@ public class AtlasStructDefStoreV2 extends AtlasAbstractDefStoreV2<AtlasStructDe public static void updateVertexPreCreate(AtlasStructDef structDef, AtlasStructType structType, AtlasVertex vertex, AtlasTypeDefGraphStoreV2 typeDefStore) throws AtlasBaseException { List<String> attrNames = new ArrayList<>(structDef.getAttributeDefs().size()); - for (AtlasAttributeDef attributeDef : structDef.getAttributeDefs()) { - // Validate the mandatory features of an attribute (compatibility with legacy type system) - if (StringUtils.isEmpty(attributeDef.getName())) { - throw new AtlasBaseException(AtlasErrorCode.MISSING_MANDATORY_ATTRIBUTE, structDef.getName(), "name"); - } - - if (StringUtils.isEmpty(attributeDef.getTypeName())) { - throw new AtlasBaseException(AtlasErrorCode.MISSING_MANDATORY_ATTRIBUTE, structDef.getName(), "typeName"); - } + createPropertyKeys(structDef, typeDefStore); - String propertyKey = AtlasGraphUtilsV2.getTypeDefPropertyKey(structDef, attributeDef.getName()); - String encodedPropertyKey = AtlasGraphUtilsV2.encodePropertyKey(propertyKey); + for (AtlasAttributeDef attributeDef : structDef.getAttributeDefs()) { + String propertyKey = AtlasGraphUtilsV2.getTypeDefPropertyKey(structDef, attributeDef.getName()); - vertex.setProperty(encodedPropertyKey, toJsonFromAttribute(structType.getAttribute(attributeDef.getName()))); + vertex.setProperty(AtlasGraphUtilsV2.encodePropertyKey(propertyKey), toJsonFromAttribute(structType.getAttribute(attributeDef.getName()))); attrNames.add(attributeDef.getName()); } - String typeNamePropertyKey = AtlasGraphUtilsV2.getTypeDefPropertyKey(structDef); - String encodedtypeNamePropertyKey = AtlasGraphUtilsV2.encodePropertyKey(typeNamePropertyKey); + String typeNamePropertyKey = AtlasGraphUtilsV2.getTypeDefPropertyKey(structDef); - vertex.setProperty(encodedtypeNamePropertyKey, attrNames); + vertex.setProperty(AtlasGraphUtilsV2.encodePropertyKey(typeNamePropertyKey), attrNames); } public static void updateVertexPreUpdate(AtlasStructDef structDef, AtlasStructType structType, AtlasVertex vertex, AtlasTypeDefGraphStoreV2 typeDefStore) throws AtlasBaseException { @@ -99,12 +93,15 @@ public class AtlasStructDefStoreV2 extends AtlasAbstractDefStoreV2<AtlasStructDe String structDefPropertyKey = AtlasGraphUtilsV2.getTypeDefPropertyKey(structDef); String encodedStructDefPropertyKey = encodePropertyKey(structDefPropertyKey); - List<String> currAttrNames = vertex.getProperty(encodedStructDefPropertyKey, List.class); + Object names = vertex.getProperty(encodedStructDefPropertyKey, Object.class); + List<String> currAttrNames = names instanceof List ? (List<String>) names : new ArrayList<>(); // delete attributes that are not present in updated structDef if (CollectionUtils.isNotEmpty(currAttrNames)) { List<String> removedAttributes = null; + createPropertyKeys(structDef, typeDefStore); + for (String currAttrName : currAttrNames) { if (!attrNames.contains(currAttrName)) { if (RequestContext.get().isInTypePatching()) { @@ -136,6 +133,10 @@ public class AtlasStructDefStoreV2 extends AtlasAbstractDefStoreV2<AtlasStructDe vertex.removeProperty(propertyKey); } } + } else { + if (names == null) { + LOG.warn("failed to load attribute names for type {}", structDef.getName()); + } } typeDefStore.updateTypeVertex(structDef, vertex); @@ -207,7 +208,8 @@ public class AtlasStructDefStoreV2 extends AtlasAbstractDefStoreV2<AtlasStructDe List<AtlasAttributeDef> attributeDefs = new ArrayList<>(); String typePropertyKey = AtlasGraphUtilsV2.getTypeDefPropertyKey(ret); String encodedTypePropertyKey = AtlasGraphUtilsV2.encodePropertyKey(typePropertyKey); - List<String> attrNames = vertex.getProperty(encodedTypePropertyKey, List.class); + Object names = vertex.getProperty(encodedTypePropertyKey, Object.class); + List<String> attrNames = names instanceof List ? (List<String>) names : new ArrayList<>(); if (CollectionUtils.isNotEmpty(attrNames)) { for (String attrName : attrNames) { @@ -223,6 +225,10 @@ public class AtlasStructDefStoreV2 extends AtlasAbstractDefStoreV2<AtlasStructDe attributeDefs.add(toAttributeDefFromJson(structDef, AtlasType.fromJson(attrJson, Map.class), typeDefStore)); } + } else { + if (names == null) { + LOG.warn("failed to load attribute names for type {}", structDef); + } } ret.setAttributeDefs(attributeDefs); @@ -638,4 +644,35 @@ public class AtlasStructDefStoreV2 extends AtlasAbstractDefStoreV2<AtlasStructDe } } } + + private static void createPropertyKeys(AtlasStructDef structDef, AtlasTypeDefGraphStoreV2 typeDefStore) throws AtlasBaseException { + AtlasGraphManagement management = typeDefStore.atlasGraph.getManagementSystem(); + + for (AtlasAttributeDef attributeDef : structDef.getAttributeDefs()) { + // Validate the mandatory features of an attribute (compatibility with legacy type system) + if (StringUtils.isEmpty(attributeDef.getName())) { + throw new AtlasBaseException(AtlasErrorCode.MISSING_MANDATORY_ATTRIBUTE, structDef.getName(), "name"); + } + + if (StringUtils.isEmpty(attributeDef.getTypeName())) { + throw new AtlasBaseException(AtlasErrorCode.MISSING_MANDATORY_ATTRIBUTE, structDef.getName(), "typeName"); + } + + String propertyKey = AtlasGraphUtilsV2.getTypeDefPropertyKey(structDef, attributeDef.getName()); + + createPropertyKey(AtlasGraphUtilsV2.encodePropertyKey(propertyKey), String.class, AtlasCardinality.SINGLE, management); + } + + String typeNamePropertyKey = AtlasGraphUtilsV2.getTypeDefPropertyKey(structDef); + + createPropertyKey(AtlasGraphUtilsV2.encodePropertyKey(typeNamePropertyKey), Object.class, AtlasCardinality.SINGLE, management); + + try { + management.commit(); + } catch (Exception e) { + LOG.error("PropertyKey creation failed", e); + + throw new AtlasBaseException(new IndexException("Index commit failed", e)); + } + } } diff --git a/test-tools/src/main/resources/solr/core-template/solrconfig.xml b/test-tools/src/main/resources/solr/core-template/solrconfig.xml index c7ee388c7..e39ca9e81 100644 --- a/test-tools/src/main/resources/solr/core-template/solrconfig.xml +++ b/test-tools/src/main/resources/solr/core-template/solrconfig.xml @@ -445,7 +445,7 @@ --> <lst name="defaults"> <str name="defType">edismax</str> - <str name="qf">35x_t 5j9_t 7wl_t a9x_t but_t dfp_l f0l_t i6d_l iyt_l jr9_t kjp_s lc5_t m4l_s mx1_t ohx_t xz9_i 1151_t 12px_t 14at_l 15vp_t 1891_t 19tx_t 1bet_t 1czp_t 1ekl_t 1gxx_t 1iit_l 1k3p_t 1lol_t 1o1x_t 1qf9_t 1ssl_t 1v5x_t 1wqt_t 1z45_t 20p1_t 4ttx_t 56h1_s 54w5_s 52it_s 50xx_s 543p_t 5c05_t 581x_t 59mt_l 5af9_t 5gqt_t 5f5x_t 5ibp_t 5pfp_t 5uyt_t 5zph_t 5xc5_t 5y4l_t 5wjp_t 6611_t 658l_t 6d51_l 6epx_l 66th_t 6ccl_t 6net_l 6ozp_l 6ltx_t 6k91_t 6qkl_t 6gat_t 6h39_t 6io5_ [...] + <str name="qf">35x_t 5j9_t 7wl_t a9x_t but_t dfp_l f0l_t i6d_l iyt_l jr9_t kjp_s lc5_t m4l_s mx1_t ohx_t xz9_i 1151_t 12px_t 14at_l 15vp_t 1891_t 19tx_t 1bet_t 1czp_t 1ekl_t 1gxx_t 1iit_l 1k3p_t 1lol_t 1o1x_t 1qf9_t 1ssl_t 1v5x_t 1wqt_t 1z45_t 20p1_t 4wzp_t 59mt_s 581x_s 55ol_s 543p_s 579h_t 5f5x_t 5b7p_t 5csl_l 5dl1_t 5jwl_t 5ibp_t 5lhh_t 5slh_t 5y4l_t 62v9_t 60hx_t 61ad_t 5zph_t 696t_t 68ed_t 6gat_l 6hvp_l 69z9_t 6fid_t 6qkl_l 6s5h_l 6ozp_t 6net_t 6tqd_t 6jgl_t 6k91_t 6ltx_ [...] <str name="hl.fl">*</str> <bool name="hl.requireFieldMatch">true</bool> <bool name="lowercaseOperators">true</bool>