blob: 095a2ad8ad15a4662b8d797f1ceccd556f9ffcff [file] [log] [blame]
using Lucene.Net.Analysis;
using Lucene.Net.Index;
using Lucene.Net.Util;
using NUnit.Framework;
using System;
using System.Collections.Generic;
using Console = Lucene.Net.Util.SystemConsole;
namespace Lucene.Net.Search.Highlight.Custom
{
/*
* 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>
/// Tests the extensibility of <see cref="WeightedSpanTermExtractor"/> and
/// <see cref="QueryScorer"/> in a user defined package
/// </summary>
public class HighlightCustomQueryTest : LuceneTestCase
{
private static readonly String FIELD_NAME = "contents";
[Test]
public void TestHighlightCustomQuery()
{
String s1 = "I call our world Flatland, not because we call it so,";
// Verify that a query against the default field results in text being
// highlighted
// regardless of the field name.
CustomQuery q = new CustomQuery(new Term(FIELD_NAME, "world"));
String expected = "I call our <B>world</B> Flatland, not because we call it so,";
String observed = highlightField(q, "SOME_FIELD_NAME", s1);
if (Verbose)
Console.WriteLine("Expected: \"" + expected + "\n" + "Observed: \""
+ observed);
assertEquals(
"Query in the default field results in text for *ANY* field being highlighted",
expected, observed);
// Verify that a query against a named field does not result in any
// highlighting
// when the query field name differs from the name of the field being
// highlighted,
// which in this example happens to be the default field name.
q = new CustomQuery(new Term("text", "world"));
expected = s1;
observed = highlightField(q, FIELD_NAME, s1);
if (Verbose)
Console.WriteLine("Expected: \"" + expected + "\n" + "Observed: \""
+ observed);
assertEquals(
"Query in a named field does not result in highlighting when that field isn't in the query",
s1, highlightField(q, FIELD_NAME, s1));
}
/**
* This method intended for use with
* <tt>testHighlightingWithDefaultField()</tt>
*/
private String highlightField(Query query, String fieldName,
String text)
{
TokenStream tokenStream = new MockAnalyzer(Random, MockTokenizer.SIMPLE,
true, MockTokenFilter.ENGLISH_STOPSET).GetTokenStream(fieldName, text);
// Assuming "<B>", "</B>" used to highlight
SimpleHTMLFormatter formatter = new SimpleHTMLFormatter();
MyQueryScorer scorer = new MyQueryScorer(query, fieldName, FIELD_NAME);
Highlighter highlighter = new Highlighter(formatter, scorer);
highlighter.TextFragmenter = (new SimpleFragmenter(int.MaxValue));
String rv = highlighter.GetBestFragments(tokenStream, text, 1,
"(FIELD TEXT TRUNCATED)");
return rv.Length == 0 ? text : rv;
}
public class MyWeightedSpanTermExtractor : WeightedSpanTermExtractor
{
public MyWeightedSpanTermExtractor()
: base()
{
}
public MyWeightedSpanTermExtractor(String defaultField)
: base(defaultField)
{
}
protected override void ExtractUnknownQuery(Query query,
IDictionary<String, WeightedSpanTerm> terms)
{
if (query is CustomQuery)
{
ExtractWeightedTerms(terms, new TermQuery(((CustomQuery)query).term));
}
}
}
public class MyQueryScorer : QueryScorer
{
public MyQueryScorer(Query query, String field, String defaultField)
: base(query, field, defaultField)
{
}
protected override WeightedSpanTermExtractor NewTermExtractor(String defaultField)
{
return defaultField == null ? new MyWeightedSpanTermExtractor()
: new MyWeightedSpanTermExtractor(defaultField);
}
}
public class CustomQuery : Query
{
internal readonly Term term;
public CustomQuery(Term term)
: base()
{
this.term = term;
}
public override String ToString(String field)
{
return new TermQuery(term).ToString(field);
}
public override Query Rewrite(IndexReader reader)
{
return new TermQuery(term);
}
public override int GetHashCode()
{
int prime = 31;
int result = base.GetHashCode();
result = prime * result + ((term == null) ? 0 : term.GetHashCode());
return result;
}
public override bool Equals(Object obj)
{
if (this == obj)
return true;
if (!base.Equals(obj))
return false;
if (GetType() != obj.GetType())
return false;
CustomQuery other = (CustomQuery)obj;
if (term == null)
{
if (other.term != null)
return false;
}
else if (!term.equals(other.term))
return false;
return true;
}
}
}
}