/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System;
namespace Lucene.Net.Search.Function
{
/// A query that scores each document as the value of the numeric input field.
///
/// The query matches all documents, and scores each document according to the numeric
/// value of that field.
///
/// It is assumed, and expected, that:
///
/// - The field used here is indexed, and has exactly
/// one token in every scored document.
/// - Best if this field is un_tokenized.
/// - That token is parsable to the selected type.
///
///
/// Combining this query in a FunctionQuery allows much freedom in affecting document scores.
/// Note, that with this freedom comes responsibility: it is more than likely that the
/// default Lucene scoring is superior in quality to scoring modified as explained here.
/// However, in some cases, and certainly for research experiments, this capability may turn useful.
///
/// When contructing this query, select the appropriate type. That type should match the data stored in the
/// field. So in fact the "right" type should be selected before indexing. Type selection
/// has effect on the RAM usage:
///
/// - consumes 1 * maxDocs bytes.
/// - consumes 2 * maxDocs bytes.
/// - consumes 4 * maxDocs bytes.
/// - consumes 8 * maxDocs bytes.
///
///
/// Caching:
/// Values for the numeric field are loaded once and cached in memory for further use with the same IndexReader.
/// To take advantage of this, it is extremely important to reuse index-readers or index-searchers,
/// otherwise, for instance if for each query a new index reader is opened, large penalties would be
/// paid for loading the field values into memory over and over again!
///
///
/// WARNING: The status of the Search.Function package is experimental.
/// The APIs introduced here might change in the future and will not be
/// supported anymore in such a case.
///
[Serializable]
public class FieldScoreQuery:ValueSourceQuery
{
/// Type of score field, indicating how field values are interpreted/parsed.
///
/// The type selected at search search time should match the data stored in the field.
/// Different types have different RAM requirements:
///
/// - consumes 1 * maxDocs bytes.
/// - consumes 2 * maxDocs bytes.
/// - consumes 4 * maxDocs bytes.
/// - consumes 8 * maxDocs bytes.
///
///
public class Type
{
/// field values are interpreted as numeric byte values.
public static readonly Type BYTE = new Type("byte");
/// field values are interpreted as numeric short values.
public static readonly Type SHORT = new Type("short");
/// field values are interpreted as numeric int values.
public static readonly Type INT = new Type("int");
/// field values are interpreted as numeric float values.
public static readonly Type FLOAT = new Type("float");
private System.String typeName;
internal Type(System.String name)
{
this.typeName = name;
}
/*(non-Javadoc) Create a FieldScoreQuery - a query that scores each document as the value of the numeric input field.
///
/// The type param tells how to parse the field string values into a numeric score value.
///
/// the numeric field to be used.
///
/// the type of the field: either
/// , , , or .
///
public FieldScoreQuery(System.String field, Type type):base(GetValueSource(field, type))
{
}
// create the appropriate (cached) field value source.
private static ValueSource GetValueSource(System.String field, Type type)
{
if (type == Type.BYTE)
{
return new ByteFieldSource(field);
}
if (type == Type.SHORT)
{
return new ShortFieldSource(field);
}
if (type == Type.INT)
{
return new IntFieldSource(field);
}
if (type == Type.FLOAT)
{
return new FloatFieldSource(field);
}
throw new System.ArgumentException(type + " is not a known Field Score Query Type!");
}
}
}