Skip to content

Commit

Permalink
Used the actual index_name when making highlighting using the posting…
Browse files Browse the repository at this point in the history
…s highlighter

Previously the field name specified in the search request was used, which isn't correct in case a custom index_name has been used for a field or the "path":"just_name" has been used in the mapping.

 Closes #4116
  • Loading branch information
javanna committed Nov 7, 2013
1 parent b27976f commit cdbd791
Show file tree
Hide file tree
Showing 2 changed files with 71 additions and 2 deletions.
Expand Up @@ -85,7 +85,7 @@ public HighlightField highlight(HighlighterContext highlighterContext) {
if (mapperHighlighterEntry == null) {
Encoder encoder = field.encoder().equals("html") ? HighlightUtils.Encoders.HTML : HighlightUtils.Encoders.DEFAULT;
CustomPassageFormatter passageFormatter = new CustomPassageFormatter(field.preTags()[0], field.postTags()[0], encoder);
BytesRef[] filteredQueryTerms = filterTerms(highlighterEntry.queryTerms, highlighterContext.fieldName, field.requireFieldMatch());
BytesRef[] filteredQueryTerms = filterTerms(highlighterEntry.queryTerms, fieldMapper.names().indexName(), field.requireFieldMatch());
mapperHighlighterEntry = new MapperHighlighterEntry(passageFormatter, filteredQueryTerms);
}

Expand All @@ -109,7 +109,7 @@ public HighlightField highlight(HighlighterContext highlighterContext) {
//we highlight every value separately calling the highlight method multiple times, only if we need to have back a snippet per value (whole value)
int values = mergeValues ? 1 : textsToHighlight.size();
for (int i = 0; i < values; i++) {
Snippet[] fieldSnippets = highlighter.highlightDoc(highlighterContext.fieldName, mapperHighlighterEntry.filteredQueryTerms, context.searcher(), hitContext.topLevelDocId(), numberOfFragments);
Snippet[] fieldSnippets = highlighter.highlightDoc(fieldMapper.names().indexName(), mapperHighlighterEntry.filteredQueryTerms, context.searcher(), hitContext.topLevelDocId(), numberOfFragments);
if (fieldSnippets != null) {
for (Snippet fieldSnippet : fieldSnippets) {
if (Strings.hasText(fieldSnippet.getText())) {
Expand Down
Expand Up @@ -2193,4 +2193,73 @@ public void testPostingsHighlighterManyDocs() throws Exception {
assertHighlight(hit, "field1", 0, 1, equalTo("Sentence " + prefix + " <em>test</em>."));
}
}

@Test //https://github.com/elasticsearch/elasticsearch/issues/4116
public void testPostingsHighlighterCustomIndexName() {
assertAcked(client().admin().indices().prepareCreate("test")
.addMapping("type1", "field1", "type=string,index_options=offsets,index_name=my_field"));
ensureGreen();

client().prepareIndex("test", "type1", "1").setSource("field1", "First sentence. Second sentence.").get();
refresh();

SearchResponse searchResponse = client().prepareSearch("test").setQuery(matchQuery("field1", "first")).addHighlightedField("field1").get();
assertHighlight(searchResponse, 0, "field1", 0, 1, equalTo("<em>First</em> sentence."));

searchResponse = client().prepareSearch("test").setQuery(matchQuery("my_field", "first")).addHighlightedField("field1").get();
assertHighlight(searchResponse, 0, "field1", 0, 1, equalTo("<em>First</em> sentence."));

searchResponse = client().prepareSearch("test").setQuery(matchQuery("my_field", "first")).addHighlightedField("my_field").get();
assertHighlight(searchResponse, 0, "my_field", 0, 1, equalTo("<em>First</em> sentence."));

searchResponse = client().prepareSearch("test").setQuery(matchQuery("my_field", "first"))
.addHighlightedField("field1").setHighlighterRequireFieldMatch(true).get();
assertHighlight(searchResponse, 0, "field1", 0, 1, equalTo("<em>First</em> sentence."));
}

@Test
public void testFastVectorHighlighterCustomIndexName() {
assertAcked(client().admin().indices().prepareCreate("test")
.addMapping("type1", "field1", "type=string,term_vector=with_positions_offsets,index_name=my_field"));
ensureGreen();

client().prepareIndex("test", "type1", "1").setSource("field1", "First sentence. Second sentence.").get();
refresh();

SearchResponse searchResponse = client().prepareSearch("test").setQuery(matchQuery("field1", "first")).addHighlightedField("field1").get();
assertHighlight(searchResponse, 0, "field1", 0, 1, equalTo("<em>First</em> sentence. Second sentence."));

searchResponse = client().prepareSearch("test").setQuery(matchQuery("my_field", "first")).addHighlightedField("field1").get();
assertHighlight(searchResponse, 0, "field1", 0, 1, equalTo("<em>First</em> sentence. Second sentence."));

searchResponse = client().prepareSearch("test").setQuery(matchQuery("my_field", "first")).addHighlightedField("my_field").get();
assertHighlight(searchResponse, 0, "my_field", 0, 1, equalTo("<em>First</em> sentence. Second sentence."));

searchResponse = client().prepareSearch("test").setQuery(matchQuery("my_field", "first"))
.addHighlightedField("field1").setHighlighterRequireFieldMatch(true).get();
assertHighlight(searchResponse, 0, "field1", 0, 1, equalTo("<em>First</em> sentence. Second sentence."));
}

@Test
public void testPlainHighlighterCustomIndexName() {
assertAcked(client().admin().indices().prepareCreate("test")
.addMapping("type1", "field1", "type=string,index_name=my_field"));
ensureGreen();

client().prepareIndex("test", "type1", "1").setSource("field1", "First sentence. Second sentence.").get();
refresh();

SearchResponse searchResponse = client().prepareSearch("test").setQuery(matchQuery("field1", "first")).addHighlightedField("field1").get();
assertHighlight(searchResponse, 0, "field1", 0, 1, equalTo("<em>First</em> sentence. Second sentence."));

searchResponse = client().prepareSearch("test").setQuery(matchQuery("my_field", "first")).addHighlightedField("field1").get();
assertHighlight(searchResponse, 0, "field1", 0, 1, equalTo("<em>First</em> sentence. Second sentence."));

searchResponse = client().prepareSearch("test").setQuery(matchQuery("my_field", "first")).addHighlightedField("my_field").get();
assertHighlight(searchResponse, 0, "my_field", 0, 1, equalTo("<em>First</em> sentence. Second sentence."));

searchResponse = client().prepareSearch("test").setQuery(matchQuery("my_field", "first"))
.addHighlightedField("field1").setHighlighterRequireFieldMatch(true).get();
assertHighlight(searchResponse, 0, "field1", 0, 1, equalTo("<em>First</em> sentence. Second sentence."));
}
}

0 comments on commit cdbd791

Please sign in to comment.