package org.nextprot.api.solr.index;
import org.apache.solr.client.solrj.SolrQuery.ORDER;
import org.nextprot.api.commons.utils.Pair;
import org.nextprot.api.solr.AutocompleteConfiguration;
import org.nextprot.api.solr.FieldConfigSet;
import org.nextprot.api.solr.IndexConfiguration;
import org.nextprot.api.solr.IndexField;
import org.nextprot.api.solr.IndexParameter;
import org.nextprot.api.solr.IndexTemplate;
import org.nextprot.api.solr.SortConfig;
public class PublicationIndex extends IndexTemplate {
// a way to get it easily from everywhere !
static public final String NAME = "publication";
public PublicationIndex() {
super(PublicationIndex.NAME, "nppublications1");
}
@Override
protected void setupConfigurations() {
IndexConfiguration defaultConfig = new IndexConfiguration(Configurations.SIMPLE);
defaultConfig.addConfigSet(FieldConfigSet.create(IndexParameter.FL)
.add(PubField.ID)
.add(PubField.AC)
.add(PubField.YEAR)
.add(PubField.TITLE)
.add(PubField.FIRST_PAGE)
.add(PubField.LAST_PAGE)
.add(PubField.ABSTRACT)
.add(PubField.VOLUME) // to be used for for display & search
.add(PubField.TYPE)
.add(PubField.PRETTY_JOURNAL) // contains only iso abbr to be displayed
//.add(PubField.SOURCE)
.add(PubField.PRETTY_AUTHORS)
.add(PubField.FILTERS));
defaultConfig.addConfigSet(FieldConfigSet.create(IndexParameter.QF)
.add(PubField.AC, 16)
.add(PubField.YEAR, 16)
.add(PubField.TITLE, 16)
.add(PubField.ABSTRACT, 4)
.add(PubField.VOLUME, 4) // to be used for search (DO NOT USE volume_s which is not a text_split0)
.add(PubField.TYPE, 16)
.add(PubField.JOURNAL, 8) // contain both full name and iso abbr
//.add(PubField.SOURCE, 8)
.add(PubField.AUTHORS, 8));
defaultConfig.addConfigSet(FieldConfigSet.create(IndexParameter.PF)
.add(PubField.AC, 160)
.add(PubField.YEAR, 160)
.add(PubField.TITLE, 160)
.add(PubField.ABSTRACT, 40)
.add(PubField.VOLUME, 40) // to be used for search (DO NOT USE volume_s which is not a text_split0)
.add(PubField.TYPE, 160)
.add(PubField.JOURNAL, 80) // contain both full name and iso abbr
//.add(PubField.SOURCE, 80)
.add(PubField.AUTHORS, 80));
defaultConfig.addOtherParameter("defType", "edismax")
.addOtherParameter("facet", "true")
.addOtherParameter("facet.field", "filters")
.addOtherParameter("facet.limit", "10")
.addOtherParameter("facet.method", "enum")
.addOtherParameter("facet.mincount", "1")
.addOtherParameter("facet.sort", "count");
@SuppressWarnings("unchecked")
SortConfig sortConfig = SortConfig.create("default", new Pair[] {
Pair.create(PubField.YEAR, ORDER.desc),
Pair.create(PubField.PRETTY_JOURNAL, ORDER.asc),
Pair.create(PubField.VOLUME_S, ORDER.asc), // do not use VOLUME cos text_split0 (tokenized field) is not sortable !
Pair.create(PubField.FIRST_PAGE, ORDER.asc),
});
defaultConfig.addSortConfig(sortConfig);
defaultConfig.setDefaultSortName("default");
addConfiguration(defaultConfig);
setConfigAsDefault(Configurations.SIMPLE);
AutocompleteConfiguration autocompleteConfig = new AutocompleteConfiguration(Configurations.AUTOCOMPLETE, defaultConfig);
autocompleteConfig
.addOtherParameter("facet.field", "text")
.addOtherParameter("stopwords", "true");
autocompleteConfig.addSortConfig(sortConfig);
addConfiguration(autocompleteConfig);
defaultConfig
.addOtherParameter("spellcheck.dictionary", "default")
.addOtherParameter("spellcheck", "on")
.addOtherParameter("spellcheck.extendedResults", "true")
.addOtherParameter("spellcheck.count", "10")
.addOtherParameter("spellcheck.alternativeTermCount", "5")
.addOtherParameter("spellcheck.maxResultsForSuggest", "5")
.addOtherParameter("spellcheck.collate", "true")
.addOtherParameter("spellcheck.collateExtendedResults", "true")
.addOtherParameter("spellcheck.maxCollationTries", "5")
.addOtherParameter("spellcheck.maxCollations", "10")
.addOtherParameter("mm", "100%");
setConfigAsDefault(Configurations.SIMPLE);
}
class Configurations extends ConfigurationName {
public static final String SIMPLE = "simple";
public static final String AUTOCOMPLETE = "autocomplete";
}
public Class<? extends ConfigurationName> getConfigNames() {
return Configurations.class;
}
public Class<? extends IndexField> getFields() {
return PubField.class;
}
@Override
public IndexField[] getFieldValues() {
return PubField.values();
}
public static enum PubField implements IndexField {
ID("id"),
IDSP0("idsp0"), // searchable (text_split0)
AC("ac"), // PMIDs + DOIs
VOLUME_S("volume_s"), // sortable (string)
VOLUME("volume", "volume"), // searchable, also used for display by UI (text_split0)
FIRST_PAGE("first_page"),
LAST_PAGE("last_page"),
YEAR("year","year"),
DATE("date"),
TITLE("title","title"), // searchable, displayable (text_split0)
TITLE_S("title_s"), // sortable (string)
ABSTRACT("abstract","abstract"),
TYPE("type"),
JOURNAL("journal","journal"), // searchable (text_split0)
PRETTY_JOURNAL("pretty_journal"), // displayable (string)
//SOURCE("source"),
AUTHORS("authors","author"), // searchable (text_split0)
PRETTY_AUTHORS("pretty_authors"), // displayable (also text_split0 but formatted)
FILTERS("filters"), // Computed, curated, largescale
TEXT("text");
private String name;
private String publicName;
private PubField(String name) {
this.name = name;
}
private PubField(String name, String publicName) {
this.name = name;
this.publicName = publicName;
}
public String getName() {
return this.name;
}
public boolean hasPublicName() {
return this.publicName!=null && this.publicName.length()>0;
}
public String getPublicName() {
return this.publicName;
}
}
}