This commit is contained in:
Vincent Letard 2024-03-06 16:30:19 -05:00
parent e2a961a509
commit 8801851525
No known key found for this signature in database
2 changed files with 36 additions and 18 deletions

View File

@ -100,11 +100,8 @@ public class UnifiedHighlighter {
public static final int DEFAULT_CACHE_CHARS_THRESHOLD = 524288; // ~ 1 MB (2 byte chars) public static final int DEFAULT_CACHE_CHARS_THRESHOLD = 524288; // ~ 1 MB (2 byte chars)
public static final Set<Class<? extends Query>> QUERIES_WITH_NO_HL_EFFECT = Set.of( public static final Set<Class<? extends Query>> QUERIES_WITH_NO_HL_EFFECT =
MatchAllDocsQuery.class, Set.of(MatchAllDocsQuery.class, MatchNoDocsQuery.class, FunctionQuery.class);
MatchNoDocsQuery.class,
FunctionQuery.class
);
protected static final LabelledCharArrayMatcher[] ZERO_LEN_AUTOMATA_ARRAY = protected static final LabelledCharArrayMatcher[] ZERO_LEN_AUTOMATA_ARRAY =
new LabelledCharArrayMatcher[0]; new LabelledCharArrayMatcher[0];
@ -1138,7 +1135,8 @@ public class UnifiedHighlighter {
public void visitLeaf(Query query) { public void visitLeaf(Query query) {
if (MultiTermHighlighting.canExtractAutomataFromLeafQuery(query) == false) { if (MultiTermHighlighting.canExtractAutomataFromLeafQuery(query) == false) {
boolean no_effect_query = false; boolean no_effect_query = false;
for (Class<? extends Query> queryType: UnifiedHighlighter.QUERIES_WITH_NO_HL_EFFECT) { for (Class<? extends Query> queryType :
UnifiedHighlighter.QUERIES_WITH_NO_HL_EFFECT) {
if (queryType.isInstance(query)) { if (queryType.isInstance(query)) {
no_effect_query = true; no_effect_query = true;
break; break;

View File

@ -1669,15 +1669,17 @@ public class TestUnifiedHighlighter extends UnifiedHighlighterTestBase {
public void testPostingsOffsetStrategy() throws Exception { public void testPostingsOffsetStrategy() throws Exception {
if (this.fieldType.indexOptions() != IndexOptions.DOCS_AND_FREQS_AND_POSITIONS_AND_OFFSETS if (this.fieldType.indexOptions() != IndexOptions.DOCS_AND_FREQS_AND_POSITIONS_AND_OFFSETS
|| this.fieldType.storeTermVectors()) || this.fieldType.storeTermVectors()) {
// ignore if fieldType is not POSTINGS only // ignore if fieldType is not POSTINGS only
return; return;
}
final UnifiedHighlighter.OffsetSource expectedOffsetSource; final UnifiedHighlighter.OffsetSource expectedOffsetSource;
if (this.fieldType.storeTermVectors()) if (this.fieldType.storeTermVectors()) {
expectedOffsetSource = UnifiedHighlighter.OffsetSource.POSTINGS_WITH_TERM_VECTORS; expectedOffsetSource = UnifiedHighlighter.OffsetSource.POSTINGS_WITH_TERM_VECTORS;
else } else {
expectedOffsetSource = UnifiedHighlighter.OffsetSource.POSTINGS; expectedOffsetSource = UnifiedHighlighter.OffsetSource.POSTINGS;
}
RandomIndexWriter iw = newIndexOrderPreservingWriter(); RandomIndexWriter iw = newIndexOrderPreservingWriter();
@ -1700,22 +1702,40 @@ public class TestUnifiedHighlighter extends UnifiedHighlighterTestBase {
TopDocs topDocs = searcher.search(query, 10, Sort.INDEXORDER); TopDocs topDocs = searcher.search(query, 10, Sort.INDEXORDER);
Set<Term> queryTerms = UnifiedHighlighter.extractTerms(query); Set<Term> queryTerms = UnifiedHighlighter.extractTerms(query);
FieldHighlighter fieldHighlighter = highlighter.getFieldHighlighter("body", query, queryTerms, 1); FieldHighlighter fieldHighlighter =
assertEquals(expectedOffsetSource, fieldHighlighter.getOffsetSource()); // TermQuery is compatible with POSTINGS offset strategy highlighter.getFieldHighlighter("body", query, queryTerms, 1);
assertEquals(
expectedOffsetSource,
fieldHighlighter
.getOffsetSource()); // TermQuery is compatible with POSTINGS offset strategy
String[] snippets = highlighter.highlight("body", query, topDocs); String[] snippets = highlighter.highlight("body", query, topDocs);
for (Query noEffectQuery: new Query[] {new MatchAllDocsQuery(), new MatchNoDocsQuery(), new FunctionQuery(new ConstValueSource(5))}) { for (Query noEffectQuery :
final Query booleanQuery = new BooleanQuery.Builder() new Query[] {
.add(noEffectQuery, BooleanClause.Occur.MUST) new MatchAllDocsQuery(),
.add(query, BooleanClause.Occur.MUST) new MatchNoDocsQuery(),
.build(); new FunctionQuery(new ConstValueSource(5))
}) {
final Query booleanQuery =
new BooleanQuery.Builder()
.add(noEffectQuery, BooleanClause.Occur.MUST)
.add(query, BooleanClause.Occur.MUST)
.build();
queryTerms = UnifiedHighlighter.extractTerms(booleanQuery); queryTerms = UnifiedHighlighter.extractTerms(booleanQuery);
fieldHighlighter = highlighter.getFieldHighlighter("body", booleanQuery, queryTerms, 1); fieldHighlighter = highlighter.getFieldHighlighter("body", booleanQuery, queryTerms, 1);
assertEquals(noEffectQuery.getClass().toString(), expectedOffsetSource, fieldHighlighter.getOffsetSource()); // combining to a query with no effet (on highlighting) should lead to the same highlighter behavior assertEquals(
noEffectQuery.getClass().toString(),
expectedOffsetSource,
fieldHighlighter
.getOffsetSource()); // combining to a query with no effet (on highlighting) should
// lead to the same highlighter behavior
String[] bqSnippets = highlighter.highlight("body", query, topDocs); String[] bqSnippets = highlighter.highlight("body", query, topDocs);
assertArrayEquals(bqSnippets.toString(), snippets, bqSnippets); // ensuring that the combined query does produce the same output assertArrayEquals(
Arrays.toString(bqSnippets),
snippets,
bqSnippets); // ensuring that the combined query does produce the same output
} }
ir.close(); ir.close();