Author: bpoussin Date: 2012-02-03 19:26:20 +0100 (Fri, 03 Feb 2012) New Revision: 1413 Url: http://nuiton.org/repositories/revision/wikitty/1413 Log: Anomalie #1941: If entity use two extension with same field name, *.fieldname faild Anomalie #1942: Search with *.fieldname faild if this entity is in WikittyTreeNode Evolution #1943: Field *.fieldname must be sortable - deplacement de la creation des champs speciaux #ft.all, #all, *_sortable pour les mettre au plus tard (juste avant le commit vers solr) de cette facon on simule le comportement que devrait avoir solr s'il etait capable de faire des copies de champs en utilisant des regexp Modified: trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/SolrResource.java trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittyQueryVisitorToSolr.java trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySolrConstant.java trunk/wikitty-solr/src/main/resources/schema.xml Modified: trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/SolrResource.java =================================================================== --- trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/SolrResource.java 2012-02-03 18:08:40 UTC (rev 1412) +++ trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/SolrResource.java 2012-02-03 18:26:20 UTC (rev 1413) @@ -42,6 +42,8 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import org.apache.commons.lang3.StringUtils; +import org.nuiton.wikitty.WikittyUtil; /** * Use to plug solr indexation in JTA transaction. @@ -131,6 +133,7 @@ synchronized (this) { Collection<SolrInputDocument> docs = getAddedDocs().values(); if (!docs.isEmpty()) { + addAllSolrfield(docs); solrServer.add(docs); } List<String> ids = getDeletedDocs(); @@ -147,6 +150,95 @@ } } + /** + * On fait ici le travail de SolR car il ne sait pas faire des copies de + * champs avec des regexp evaluee. + * Ce que l'on voudrait: + * <li> "ExtName.FieldName_s" avec "*\.(*)_*" devient #all.$1 et #ft.all.$1 + * + * @param docs + */ + protected void addAllSolrfield(Collection<SolrInputDocument> docs) { + for (SolrInputDocument doc : docs) { + Collection<String> fieldnames = new ArrayList<String>(doc.getFieldNames()); + // on boucle une premiere fois pour supprimer les anciennes valeurs + // on ne peut pas le faire juste avant le add, car au final plusieurs + // champs pourrait devoir etre stocker dans le meme champs (si deux + // extension on un champs portant le meme nom. ex: Titi.name et Toto.name) + for (String solrFqFieldName : fieldnames) { + if (!solrFqFieldName.startsWith(WikittySolrConstant.SOLR_WIKITTY_PREFIX)) { + String fqfieldName = StringUtils.substringBeforeLast( + solrFqFieldName, WikittySolrConstant.SOLR_WIKITTY_SUFFIX); + + // #all.<fieldname> + // permet de faire des recherches inter extension sur un champs ayant + // le meme nom. ex:Person.name et User.name + // Quoi qu'il arrive pour le #all on utilise du multivalue + String solrAllFieldName = + WikittySolrConstant.SOLR_ALL_EXTENSIONS + + WikittyUtil.FQ_FIELD_NAME_SEPARATOR + + WikittyUtil.getFieldNameFromFQFieldName(solrFqFieldName); + + // idem mais un champs sur plusieurs extension peut avoir des types + // different, on ajoute donc un champs pour la recherche fulltext + String solrFulltextAllFieldName = + WikittySolrConstant.SOLR_FULLTEXT_ALL_EXTENSIONS + + WikittyUtil.FQ_FIELD_NAME_SEPARATOR + + WikittyUtil.getFieldNameFromFQFieldName(fqfieldName); + + // sortable solr field name for this field ex: myExt.myField_s_sortable + String solrFqFieldNameSortable = + solrFqFieldName + WikittySolrConstant.SUFFIX_SORTABLE; + + doc.remove(solrAllFieldName); // #all.myField_s + doc.remove(solrFulltextAllFieldName); // #fulltext.all.myField + doc.remove(solrFqFieldNameSortable); // myExt.myField_s_sortable + } + } + + for (String solrFqFieldName : fieldnames) { + if (!solrFqFieldName.startsWith(WikittySolrConstant.SOLR_WIKITTY_PREFIX) + && !solrFqFieldName.endsWith(WikittySolrConstant.SUFFIX_SORTABLE)) { + Object fieldValue = doc.getFieldValue(solrFqFieldName); + String fqfieldName = StringUtils.substringBeforeLast( + solrFqFieldName, WikittySolrConstant.SOLR_WIKITTY_SUFFIX); + + // #all.<fieldname> + // permet de faire des recherches inter extension sur un champs ayant + // le meme nom. ex:Person.name et User.name + // Quoi qu'il arrive pour le #all on utilise du multivalue + String solrAllFieldName = WikittySolrConstant.SOLR_ALL_EXTENSIONS + + WikittyUtil.FQ_FIELD_NAME_SEPARATOR + + WikittyUtil.getFieldNameFromFQFieldName(solrFqFieldName); + + // idem mais un champs sur plusieurs extension peut avoir des types + // different, on ajoute donc un champs pour la recherche fulltext + String solrFulltextAllFieldName = WikittySolrConstant.SOLR_FULLTEXT_ALL_EXTENSIONS + + WikittyUtil.FQ_FIELD_NAME_SEPARATOR + + WikittyUtil.getFieldNameFromFQFieldName(fqfieldName); + + // sortable solr field name for this field ex: myExt.myField_s_sortable + String solrFqFieldNameSortable = + solrFqFieldName + WikittySolrConstant.SUFFIX_SORTABLE; + + doc.addField(solrAllFieldName, fieldValue); + doc.addField(solrFulltextAllFieldName, fieldValue); + + // add sortable for field #all. + Object oneFieldValue = SolrUtil.getOneValue(fieldValue); + doc.setField(solrAllFieldName + WikittySolrConstant.SUFFIX_SORTABLE, + oneFieldValue); + // add sortable for field #ft.all. + doc.setField(solrFulltextAllFieldName + WikittySolrConstant.SUFFIX_SORTABLE, + oneFieldValue); + // add sortable for real field + doc.setField(solrFqFieldNameSortable, oneFieldValue); + } + } + } + + } + @Override public int rollback() { clear(); Modified: trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittyQueryVisitorToSolr.java =================================================================== --- trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittyQueryVisitorToSolr.java 2012-02-03 18:08:40 UTC (rev 1412) +++ trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittyQueryVisitorToSolr.java 2012-02-03 18:26:20 UTC (rev 1413) @@ -96,6 +96,47 @@ this.elementModifier = elementModifier; } + /** + * Impossible de trouver le bon analyser Solr pour la recherche fulltext. + * Solr meme si on lui dit de mettre en minuscule et d'enlever les accents + * le fait pour l'indexation, mais pas la recherche :(. On le fait donc pour + * lui ici tant que le bon analyser n'est pas trouve + * + * Apres recherche il semble que ce soit normal :( + * sur la page + * http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#Analyzers + * on peut lire + * <pre> + * On wildcard and fuzzy searches, no text analysis is performed on the search word. + * </pre> + * Donc dès qu'on met des '*' les transformations ne sont plus faites :( + * + * plus d'explication: + * <li> http://java.dzone.com/articles/what%E2%80%99s-lowercasing-wildcard + * <li> http://wiki.apache.org/solr/MultitermQueryAnalysis + * + * @param element2solr + * @param value + * @return + */ + private String fixSolrBug(String element2solr, String value) { + String result = value; + if (element2solr.equals(WikittySolrConstant.SOLR_FULLTEXT) || + element2solr.startsWith(WikittySolrConstant.SOLR_FULLTEXT_ALL_EXTENSIONS) || + element2solr.endsWith(WikittySolrConstant.SUFFIX_STRING_FULLTEXT)|| + element2solr.endsWith(WikittySolrConstant.SUFFIX_STRING_LOWERCASE)) { // is string + // TODO poussin 20120107 impossible de comprendre pourquoi il faut force + // la chaine en lower case, ca devrait etre le role de solr/lucene via + // la description du schema de mettre la chaine dans la bonne forme + // pour la recheche en fonction du type du champs souhaite (ici fulltext) + // tant que ca marche pas on force a la main + // idem pour les accents :( + result = StringUtils.stripAccents(result); + result = result.toLowerCase(); + } + return result; + } + private String element2solr(Element element) { String result = elementModifier.convertToSolr(tx, element); return result; @@ -253,8 +294,14 @@ @Override public boolean visitEnter(Between o) { - solrQuery += element2solr(o.getElement()) - + ":[" + evalConditionValue(o.getMin()) + " TO " + evalConditionValue(o.getMax()) + "]"; + String element2solr = element2solr(o.getElement()); + String min = evalConditionValue(o.getMin()); + String max = evalConditionValue(o.getMax()); + + min = fixSolrBug(element2solr, min); + max = fixSolrBug(element2solr, max); + + solrQuery += element2solr + ":[" + min + " TO " + max + "]"; return false; } @@ -271,14 +318,17 @@ @Override public boolean visitEnter(ContainsAll o) { - solrQuery += element2solr(o.getElement()) - + ":("; + String element2solr = element2solr(o.getElement()); + + solrQuery += element2solr + ":("; + String sep = ""; for(String e : evalConditionValueAsList(o.getValues())) { - solrQuery += sep + e; + solrQuery += sep + fixSolrBug(element2solr, e); sep = " AND "; } solrQuery += ")"; + return false; } @@ -295,11 +345,12 @@ @Override public boolean visitEnter(ContainsOne o) { - solrQuery += element2solr(o.getElement()) - + ":("; + String element2solr = element2solr(o.getElement()); + + solrQuery += element2solr + ":("; String sep = ""; for(String e : evalConditionValueAsList(o.getValues())) { - solrQuery += sep + e; + solrQuery += sep + fixSolrBug(element2solr, e); sep = " OR "; } solrQuery += ")"; @@ -320,14 +371,17 @@ @Override public boolean visitEnter(Equals o) { String element2solr = element2solr(o.getElement()); + String value = evalConditionValue(o.getValue()); + if (element2solr.endsWith(WikittySolrConstant.SUFFIX_STRING)) { // is string if (o.isIgnoreCaseAndAccent()) { element2solr += WikittySolrConstant.SUFFIX_STRING_LOWERCASE; } } - solrQuery += element2solr - + ":" + evalConditionValue(o.getValue()); + value = fixSolrBug(element2solr, value); + + solrQuery += element2solr + ":" + value; return false; } @@ -340,14 +394,18 @@ @Override public boolean visitEnter(NotEquals o) { String element2solr = element2solr(o.getElement()); + String value = evalConditionValue(o.getValue()); + if (element2solr.endsWith(WikittySolrConstant.SUFFIX_STRING)) { // is string if (o.isIgnoreCaseAndAccent()) { element2solr += WikittySolrConstant.SUFFIX_STRING_LOWERCASE; } } + + value= fixSolrBug(element2solr, value); - solrQuery += "-" + element2solr - + ":" + evalConditionValue(o.getValue()); + solrQuery += "-" + element2solr + ":" + value; + return false; } @@ -358,8 +416,12 @@ @Override public boolean visitEnter(Greater o) { - solrQuery += element2solr(o.getElement()) - + ":{" + evalConditionValue(o.getValue()) + " TO *}"; + String element2solr = element2solr(o.getElement()); + String value = evalConditionValue(o.getValue()); + + value = fixSolrBug(element2solr, value); + + solrQuery += element2solr + ":{" + value + " TO *}"; return false; } @@ -370,8 +432,12 @@ @Override public boolean visitEnter(GreaterOrEquals o) { - solrQuery += element2solr(o.getElement()) - + ":[" + evalConditionValue(o.getValue()) + " TO *]"; + String element2solr = element2solr(o.getElement()); + String value = evalConditionValue(o.getValue()); + + value = fixSolrBug(element2solr, value); + + solrQuery += element2solr + ":[" + value + " TO *]"; return false; } @@ -383,15 +449,9 @@ @Override public boolean visitEnter(Keyword o) { String value = evalConditionValue(o.getValue()); - // TODO poussin 20120107 impossible de comprendre pourquoi il faut force - // la chaine en lower case, ca devrait etre le role de solr/lucene via - // la description du schema de mettre la chaine dans la bonne forme - // pour la recheche en fonction du type du champs souhaite (ici fulltext) - // tant que ca marche pas on force a la main - value = value.toLowerCase(); - // idem pour les accents :( - value = StringUtils.stripAccents(value); + value = fixSolrBug(WikittySolrConstant.SOLR_FULLTEXT, value); + // pour keyword on ajout automatiquement les *, sinon il faut faire un like value = "*" + value + "*"; solrQuery += value; @@ -405,8 +465,12 @@ @Override public boolean visitEnter(Less o) { - solrQuery += element2solr(o.getElement()) - + ":{* TO " + evalConditionValue(o.getValue()) + "}"; + String element2solr = element2solr(o.getElement()); + String value = evalConditionValue(o.getValue()); + + value = fixSolrBug(element2solr, value); + + solrQuery += element2solr + ":{* TO " + value + "}"; return false; } @@ -417,8 +481,12 @@ @Override public boolean visitEnter(LessOrEquals o) { - solrQuery += element2solr(o.getElement()) - + ":[* TO " + evalConditionValue(o.getValue()) + "]"; + String element2solr = element2solr(o.getElement()); + String value = evalConditionValue(o.getValue()); + + value = fixSolrBug(element2solr, value); + + solrQuery += element2solr + ":[* TO " + value + "]"; return false; } @@ -430,20 +498,13 @@ @Override public boolean visitEnter(Like o) { String element2solr = element2solr(o.getElement()); + String value = evalConditionValue(o.getValue()); + if (element2solr.endsWith(WikittySolrConstant.SUFFIX_STRING)) { // is string - // FIXME poussin 20111230 check la config solr et peut etre utiliser le lowercase ? element2solr += WikittySolrConstant.SUFFIX_STRING_FULLTEXT; } - String value = evalConditionValue(o.getValue()); - // TODO poussin 20120107 impossible de comprendre pourquoi il faut force - // la chaine en lower case, ca devrait etre le role de solr/lucene via - // la description du schema de mettre la chaine dans la bonne forme - // pour la recheche en fonction du type du champs souhaite (ici fulltext) - // tant que ca marche pas on force a la main - value = value.toLowerCase(); - // idem pour les accents :( - value = StringUtils.stripAccents(value); + value = fixSolrBug(element2solr, value); solrQuery += element2solr + ":" + value; return false; @@ -457,20 +518,13 @@ @Override public boolean visitEnter(Unlike o) { String element2solr = element2solr(o.getElement()); + String value = evalConditionValue(o.getValue()); + if (element2solr.endsWith(WikittySolrConstant.SUFFIX_STRING)) { // is string - // FIXME poussin 20111230 check la config solr et peut etre utiliser le lowercase ? element2solr += WikittySolrConstant.SUFFIX_STRING_FULLTEXT; } - String value = evalConditionValue(o.getValue()); - // TODO poussin 20120107 impossible de comprendre pourquoi il faut force - // la chaine en lower case, ca devrait etre le role de solr/lucene via - // la description du schema de mettre la chaine dans la bonne forme - // pour la recheche en fonction du type du champs souhaite (ici fulltext) - // tant que ca marche pas on force a la main - value = value.toLowerCase(); - // idem pour les accents :( - value = StringUtils.stripAccents(value); + value = fixSolrBug(element2solr, value); solrQuery += "-" + element2solr + ":" + value; return false; Modified: trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java =================================================================== --- trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java 2012-02-03 18:08:40 UTC (rev 1412) +++ trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java 2012-02-03 18:26:20 UTC (rev 1413) @@ -939,48 +939,17 @@ } else { String solrFqFieldName; -// FIXME REMOVE IT if search on multivalued work with new hack (specific sortable field -// if (collection) { -// solrFqFieldName = SolrUtil.getSolrCollectionFieldName(fqfieldName, type); -// } else { // add suffix like _s for string type ex: myExt.myField_s solrFqFieldName = SolrUtil.getSolrFieldName(fqfieldName, type); -// } - // #all.<fieldname> - // permet de faire des recherches inter extension sur un champs ayant - // le meme nom. ex:Person.name et User.name - // Quoi qu'il arrive pour le #all on utilise du multivalue -// FIXME REMOVE IT if search on multivalued work with new hack (specific sortable field -// String solrAllFqFieldName = SolrUtil.getSolrCollectionFieldName(fqfieldName, type); - String solrAllFieldName = SOLR_ALL_EXTENSIONS - + WikittyUtil.FQ_FIELD_NAME_SEPARATOR - + WikittyUtil.getFieldNameFromFQFieldName(solrFqFieldName); - - // idem mais un champs sur plusieurs extension peut avoir des types - // different, on ajoute donc un champs pour la recherche fulltext - String solrFulltextAllFieldName = SOLR_FULLTEXT_ALL_EXTENSIONS - + WikittyUtil.FQ_FIELD_NAME_SEPARATOR - + WikittyUtil.getFieldNameFromFQFieldName(fqfieldName); - String solrNullFieldFqFieldName = SOLR_NULL_FIELD + fqfieldName; - // sortable solr field name for this field ex: myExt.myField_s_sortable - String solrFqFieldNameSortable = solrFqFieldName + SUFFIX_SORTABLE; - doc.remove(solrFqFieldName); // myExt.myField_s doc.remove(solrNullFieldFqFieldName); // #null_field-myExt.myField - doc.remove(solrAllFieldName); // #all.myField_s - doc.remove(solrFulltextAllFieldName); // #fulltext.all.myField - doc.remove(solrFqFieldNameSortable); // myExt.myField_s_sortable String solrNullFieldFqFieldNameValue = "true"; if(fieldValue != null) { doc.addField(solrFqFieldName, fieldValue); - doc.addField(solrAllFieldName, fieldValue); - doc.addField(solrFulltextAllFieldName, fieldValue); - Object oneFieldValue = SolrUtil.getOneValue(fieldValue); - doc.addField(solrFqFieldNameSortable, oneFieldValue); solrNullFieldFqFieldNameValue = "false"; if (log.isTraceEnabled()) { log.trace(String.format("index field '%s' with value '%s'", @@ -1042,7 +1011,7 @@ SolrInputDocument doc = new SolrInputDocument(); addToIndexDocument(doc, w, SOLR_ID); addToIndexDocument(doc, w, SOLR_EXTENSIONS); - // iter sur tous les champs et pas seulement sont qui ont une valeur + // iter sur tous les champs et pas seulement ceux qui ont une valeur // pour pouvoir les indexer comme des champs a null for (String fqfieldName : w.getAllFieldNames()) { addToIndexDocument(doc, w, fqfieldName); Modified: trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySolrConstant.java =================================================================== --- trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySolrConstant.java 2012-02-03 18:08:40 UTC (rev 1412) +++ trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySolrConstant.java 2012-02-03 18:26:20 UTC (rev 1413) @@ -80,27 +80,28 @@ used for facetisation. Le champs est cree dynamiquement par solr via schema.xml */ static final public String TREENODE_ATTACHED_ALL = TREENODE_PREFIX + "attached-all"; - static final public String SUFFIX_BINARY = "_bi"; - static final public String SUFFIX_BOOLEAN = "_b"; - static final public String SUFFIX_NUMERIC = "_d"; - static final public String SUFFIX_DATE = "_dt"; - static final public String SUFFIX_STRING = "_s"; - static final public String SUFFIX_WIKITTY = "_w"; + static final public String SOLR_WIKITTY_SUFFIX = "_"; + static final public String SUFFIX_BINARY = SOLR_WIKITTY_SUFFIX + "bi"; + static final public String SUFFIX_BOOLEAN = SOLR_WIKITTY_SUFFIX + "b"; + static final public String SUFFIX_NUMERIC = SOLR_WIKITTY_SUFFIX + "d"; + static final public String SUFFIX_DATE = SOLR_WIKITTY_SUFFIX + "dt"; + static final public String SUFFIX_STRING = SOLR_WIKITTY_SUFFIX + "s"; + static final public String SUFFIX_WIKITTY = SOLR_WIKITTY_SUFFIX + "w"; - static final public String SUFFIX_SORTABLE = "_sortable"; + static final public String SUFFIX_SORTABLE = SOLR_WIKITTY_SUFFIX + "sortable"; // FIXME REMOVE IT if search on multivalued work with new hack (specific sortable field -// static final public String SUFFIX_BINARY_MULTIVALUED = "_bim"; -// static final public String SUFFIX_BOOLEAN_MULTIVALUED = "_bm"; -// static final public String SUFFIX_NUMERIC_MULTIVALUED = "_dm"; -// static final public String SUFFIX_DATE_MULTIVALUED = "_dtm"; -// static final public String SUFFIX_STRING_MULTIVALUED = "_sm"; -// static final public String SUFFIX_WIKITTY_MULTIVALUED = "_wm"; +// static final public String SUFFIX_BINARY_MULTIVALUED = SOLR_WIKITTY_SUFFIX + "bim"; +// static final public String SUFFIX_BOOLEAN_MULTIVALUED = SOLR_WIKITTY_SUFFIX + "bm"; +// static final public String SUFFIX_NUMERIC_MULTIVALUED = SOLR_WIKITTY_SUFFIX + "dm"; +// static final public String SUFFIX_DATE_MULTIVALUED = SOLR_WIKITTY_SUFFIX + "dtm"; +// static final public String SUFFIX_STRING_MULTIVALUED = SOLR_WIKITTY_SUFFIX + "sm"; +// static final public String SUFFIX_WIKITTY_MULTIVALUED = SOLR_WIKITTY_SUFFIX + "wm"; - static final public String SUFFIX_STRING_LOWERCASE = "_c"; - static final public String SUFFIX_STRING_FULLTEXT = "_t"; + static final public String SUFFIX_STRING_LOWERCASE = SOLR_WIKITTY_SUFFIX + "c"; + static final public String SUFFIX_STRING_FULLTEXT = SOLR_WIKITTY_SUFFIX + "t"; // FIXME REMOVE IT if search on multivalued work with new hack (specific sortable field -// public static final String SUFFIX_STRING_FULLTEXT_LOWERCASE = "_cm"; -// public static final String SUFFIX_STRING_FULLTEXT_MULTIVALUED = "_tm"; +// public static final String SUFFIX_STRING_FULLTEXT_LOWERCASE = SOLR_WIKITTY_SUFFIX + "cm"; +// public static final String SUFFIX_STRING_FULLTEXT_MULTIVALUED = SOLR_WIKITTY_SUFFIX + "tm"; } Modified: trunk/wikitty-solr/src/main/resources/schema.xml =================================================================== --- trunk/wikitty-solr/src/main/resources/schema.xml 2012-02-03 18:08:40 UTC (rev 1412) +++ trunk/wikitty-solr/src/main/resources/schema.xml 2012-02-03 18:26:20 UTC (rev 1413) @@ -74,14 +74,19 @@ Duplicate tokens at the same position (which may result from Stemmed Synonyms or WordDelim parts) are removed. --> + <!-- plus de details sur les analyzer: + http://lucene.apache.org/solr/api/org/apache/solr/analysis/package-summary.h... + http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters + --> <fieldType name="text" class="solr.TextField" positionIncrementGap="100"> <analyzer> + <!-- découpage selon les espaces --> + <tokenizer class="solr.WhitespaceTokenizerFactory"/> + <!-- suppression des accents --> <filter class="solr.ASCIIFoldingFilterFactory"/> <!-- <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>--> - <!-- découpage selon les espaces --> - <tokenizer class="solr.WhitespaceTokenizerFactory"/> <!-- suppression de la ponctuation --> <filter class="solr.PatternReplaceFilterFactory" pattern="^(\p{Punct}*)(.*?)(\p{Punct}*)$" replacement="$2"/> @@ -95,10 +100,16 @@ <!-- suppression des élisions (l', qu',...) --> <!--filter class="solr.ElisionFilterFactory" articles="elisionwords.txt"/--> <!-- découpage des mots composés --> - <filter class="solr.WordDelimiterFilterFactory" splitOnCaseChange="1" - splitOnNumerics="1" generateWordParts="1" - generateNumberParts="1" catenateWords="1" catenateNumbers="1" - catenateAll="1" preserveOriginal="1" protected="protwords.txt"/> + <filter class="solr.WordDelimiterFilterFactory" + splitOnCaseChange="1" + splitOnNumerics="1" + generateWordParts="1" + generateNumberParts="1" + catenateWords="1" + catenateNumbers="1" + catenateAll="1" + preserveOriginal="1" + protected="protwords.txt"/> <!-- suppression des mots insignifiants --> <filter class="solr.StopFilterFactory" ignoreCase="1" words="stopwords_fr.txt" enablePositionIncrements="true"/> @@ -139,13 +150,17 @@ <!-- to prevent error if we try to sort on no sortable field (multivalued) ATTENTION: solr ne prend pas l'ordre de definition, mais tri sur la longueur du nom des champs dynamique. Donc il faut que _sortable soit plus long que #ft_all --> - <dynamicField name="*_sortable" type="string" indexed="true" stored="false" multiValued="false"/> + <dynamicField name="*_sortable" type="string" indexed="true" stored="true" multiValued="false"/> <dynamicField name="#tree.attached.*" type="string" indexed="true" stored="true" multiValued="true"/> <dynamicField name="#null_field-*" type="boolean" indexed="true" stored="true" multiValued="false"/> + <!-- copied field, in wikitty code, not stored --> <!-- pour tous les champs on les indexes aussi en fulltext --> <dynamicField name="#ft.all.*" type="text" indexed="true" stored="false" multiValued="true"/> + <!-- Il serait bien de pouvoir mettre des * au milieu mais solr ne le permet pas :( + donc les champs #all.*_X qui ne devrait pas etre store le son :( --> +<!-- <dynamicField name="#all.*_s_t" type="text" indexed="true" stored="false" multiValued="true"/>--> <!-- copied field not stored --> <dynamicField name="*_s_c" type="string_lc" indexed="true" stored="false" multiValued="true"/>