blob: 238979d0a060a4b4621b28547a9095adbe317903 [file] [log] [blame]
using Lucene.Net.Analysis;
using Lucene.Net.Benchmarks.ByTask.Tasks;
using Lucene.Net.Index;
using Lucene.Net.QueryParsers.Classic;
using Lucene.Net.Search;
using Lucene.Net.Search.Spans;
using Lucene.Net.Support;
using Lucene.Net.Util;
using System;
using System.Collections.Generic;
using Console = Lucene.Net.Util.SystemConsole;
namespace Lucene.Net.Benchmarks.ByTask.Feeds
{
/*
* 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.
*/
/// <summary>
/// A <see cref="IQueryMaker"/> that makes queries devised manually (by Grant Ingersoll) for
/// searching in the Reuters collection.
/// </summary>
public class ReutersQueryMaker : AbstractQueryMaker, IQueryMaker
{
private static readonly string[] STANDARD_QUERIES = { // LUCENENET: marked readonly
//Start with some short queries
"Salomon", "Comex", "night trading", "Japan Sony",
//Try some Phrase Queries
"\"Sony Japan\"", "\"food needs\"~3",
"\"World Bank\"^2 AND Nigeria", "\"World Bank\" -Nigeria",
"\"Ford Credit\"~5",
//Try some longer queries
"airline Europe Canada destination",
"Long term pressure by trade " +
"ministers is necessary if the current Uruguay round of talks on " +
"the General Agreement on Trade and Tariffs (GATT) is to " +
"succeed"
};
private static Query[] GetPrebuiltQueries(string field)
{
// be wary of unanalyzed text
return new Query[] {
new SpanFirstQuery(new SpanTermQuery(new Term(field, "ford")), 5),
new SpanNearQuery(new SpanQuery[]{new SpanTermQuery(new Term(field, "night")), new SpanTermQuery(new Term(field, "trading"))}, 4, false),
new SpanNearQuery(new SpanQuery[]{new SpanFirstQuery(new SpanTermQuery(new Term(field, "ford")), 10), new SpanTermQuery(new Term(field, "credit"))}, 10, false),
new WildcardQuery(new Term(field, "fo*")),
};
}
/// <summary>
/// Parse the strings containing Lucene queries.
/// </summary>
/// <param name="qs">array of strings containing query expressions</param>
/// <param name="a">analyzer to use when parsing queries</param>
/// <returns>array of Lucene queries</returns>
private static Query[] CreateQueries(IList<object> qs, Analyzer a)
{
QueryParser qp = new QueryParser(
#pragma warning disable 612, 618
LuceneVersion.LUCENE_CURRENT,
#pragma warning restore 612, 618
DocMaker.BODY_FIELD, a);
List<Query> queries = new List<Query>();
for (int i = 0; i < qs.Count; i++)
{
try
{
object query = qs[i];
Query q = null;
if (query is string queryString)
{
q = qp.Parse(queryString);
}
else if (query is Query queryObj)
{
q = queryObj;
}
else
{
Console.Error.WriteLine("Unsupported Query Type: " + query);
}
if (q != null)
{
queries.Add(q);
}
}
catch (Exception e)
{
Console.Error.WriteLine(e.ToString());
}
}
return queries.ToArray();
}
protected override Query[] PrepareQueries()
{
// analyzer (default is standard analyzer)
Analyzer anlzr = NewAnalyzerTask.CreateAnalyzer(m_config.Get("analyzer",
typeof(Lucene.Net.Analysis.Standard.StandardAnalyzer).AssemblyQualifiedName));
List<object> queryList = new List<object>(20);
queryList.AddRange(STANDARD_QUERIES);
queryList.AddRange(GetPrebuiltQueries(DocMaker.BODY_FIELD));
return CreateQueries(queryList, anlzr);
}
}
}