%PDF- %PDF-
Direktori : /home/waritko/yacy/source/net/yacy/cora/federate/solr/ |
Current File : //home/waritko/yacy/source/net/yacy/cora/federate/solr/Ranking.java |
/** * Ranking * Copyright 2013 by Michael Peter Christen * First released 12.03.2013 at http://yacy.net * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program in the file lgpl21.txt * If not, see <http://www.gnu.org/licenses/>. */ package net.yacy.cora.federate.solr; import java.util.LinkedHashMap; import java.util.Map; import java.util.Set; import net.yacy.cora.util.CommonPattern; import net.yacy.cora.util.ConcurrentLog; import net.yacy.search.schema.CollectionSchema; /** * The Ranking class is the solr ranking definition file for boosts and query functions. */ public class Ranking { // for minTokenLen = 2 the quantRate value should not be below 0.24; for minTokenLen = 3 the quantRate value must be not below 0.5! private static float quantRate = 0.5f; // to be filled with search.ranking.solr.doubledetection.quantrate private static int minTokenLen = 3; // to be filled with search.ranking.solr.doubledetection.minlength private Map<SchemaDeclaration, Float> fieldBoosts; private String name, filterQuery, boostQuery, boostFunction, queryFields; public Ranking() { super(); this.name = ""; this.fieldBoosts = new LinkedHashMap<SchemaDeclaration, Float>(); this.filterQuery = ""; this.boostQuery = ""; this.boostFunction = ""; this.queryFields = null; } public String getName() { return name; } public void setName(String name) { this.name = name; } public void putFieldBoost(SchemaDeclaration schema, float boost) { this.fieldBoosts.put(schema, boost); } public Float getFieldBoost(SchemaDeclaration schema) { return this.fieldBoosts.get(schema); } public Set<Map.Entry<SchemaDeclaration,Float>> getBoostMap() { return this.fieldBoosts.entrySet(); } /** * The boost fields are the fields to query used as Solr QF parameter * This is currently used in local and remote queries, asure anticipated search relevant * remote index fields are part of query fields (recommended: at least core * metadata/Dublin Core text fields) even if disabled locally. * * @return queryfield string for Solr QF query parameter (list of fields with optonal boost factor "field1^5.0 field2 field3^2.0") */ public String getQueryFields() { if (this.queryFields != null) return this.queryFields; StringBuilder qf = new StringBuilder(80); for (Map.Entry<SchemaDeclaration, Float> entry : this.fieldBoosts.entrySet()) { SchemaDeclaration field = entry.getKey(); if ((field.getType() == SolrType.num_integer) // numerical and logical fields not usefull as default query field || (field.getType() == SolrType.num_long) || (field.getType() == SolrType.num_float) || (field.getType() == SolrType.num_double) || (field.getType() == SolrType.bool)) { continue; } qf.append(field.getSolrFieldName()); final Float boost = entry.getValue(); if (boost != null) { qf.append('^').append(boost.toString()).append(' '); } else { qf.append(' '); } } // make sure Dublin Core Metadata core/text fields are set as default query field if (!this.fieldBoosts.containsKey(CollectionSchema.title)) qf.append(CollectionSchema.title.getSolrFieldName()).append(' '); if (!this.fieldBoosts.containsKey(CollectionSchema.text_t)) qf.append(CollectionSchema.text_t.getSolrFieldName()).append(' '); if (!this.fieldBoosts.containsKey(CollectionSchema.description_txt)) qf.append(CollectionSchema.description_txt.getSolrFieldName()).append(' '); if (!this.fieldBoosts.containsKey(CollectionSchema.keywords)) qf.append(CollectionSchema.keywords.getSolrFieldName()); this.queryFields = qf.toString().trim(); // doesn't change often, cache it return this.queryFields; } /** * the updateDef is a definition string that comes from a configuration file. * It should be a comma-separated list of field^boost values * This should be called with the field in search.ranking.solr.boost * @param boostDef the definition string */ public void updateBoosts(String boostDef) { // call i.e. with "sku^20.0,url_paths_sxt^20.0,title^15.0,h1_txt^11.0,h2_txt^10.0,author^8.0,description_txt^5.0,keywords^2.0,text_t^1.0,fuzzy_signature_unique_b^100000.0" if (boostDef == null || boostDef.length() == 0) return; String[] bf = CommonPattern.COMMA.split(boostDef); this.queryFields = null; // empty cached qf this.fieldBoosts.clear(); for (String boost: bf) { int p = boost.indexOf('^'); if (p < 0) continue; String boostkey = boost.substring(0, p); try { CollectionSchema field = CollectionSchema.valueOf(boostkey); Float factor = Float.parseFloat(boost.substring(p + 1)); this.fieldBoosts.put(field, factor); } catch (IllegalArgumentException e) { // boostkey is unknown; ignore it but print warning ConcurrentLog.warn("Ranking", "unknwon boost key '" + boostkey + "'"); } } } /** * set a filter query which will be added as fq-attribute to the query * @param filterQuery */ public void setFilterQuery(String filterQuery) { this.filterQuery = filterQuery; } /** * get a string that can be added as a filter query at the fq-attribute * @return */ public String getFilterQuery() { return this.filterQuery; } /** * set a boost query which will be added as bq-attribute to the query * @param boostQuery */ public void setBoostQuery(String boostQuery) { this.boostQuery = boostQuery; } /** * get a string that can be added as a 'boost query' at the bq-attribute * @return */ public String getBoostQuery() { return this.boostQuery; } public void setBoostFunction(String boostFunction) { this.boostFunction = boostFunction; } /** * produce a boost function * @return */ public String getBoostFunction() { return this.boostFunction; } /* * duplicate check static methods */ public static void setQuantRate(float newquantRate) { quantRate = newquantRate; } public static void setMinTokenLen(int newminTokenLen) { minTokenLen = newminTokenLen; } public static float getQuantRate() { return quantRate; } public static int getMinTokenLen() { return minTokenLen; } }