diff --git a/src/main/java/org/elasticsearch/index/mapper/internal/AnalyzerMapper.java b/src/main/java/org/elasticsearch/index/mapper/internal/AnalyzerMapper.java index a70c13fafa60a..8dfdb399ec829 100644 --- a/src/main/java/org/elasticsearch/index/mapper/internal/AnalyzerMapper.java +++ b/src/main/java/org/elasticsearch/index/mapper/internal/AnalyzerMapper.java @@ -138,16 +138,19 @@ public Analyzer setAnalyzer(HighlighterContext context){ return context.analyzer(); } - Analyzer analyzer = null; - - if (path != null) { - String analyzerName = (String) context.context.lookup().source().extractValue(path); - analyzer = context.context.mapperService().analysisService().analyzer(analyzerName); - } + Analyzer analyzer = context.mapper.indexAnalyzer(); if (analyzer == null) { - analyzer = context.context.mapperService().documentMapper(context.hitContext.hit().type()).mappers().indexAnalyzer(); + if (path != null) { + String analyzerName = (String) context.context.lookup().source().extractValue(path); + analyzer = context.context.mapperService().analysisService().analyzer(analyzerName); + } + + if (analyzer == null) { + analyzer = context.context.mapperService().documentMapper(context.hitContext.hit().type()).mappers().indexAnalyzer(); + } } + context.analyzer(analyzer); return analyzer; diff --git a/src/test/java/org/elasticsearch/search/highlight/HighlighterSearchTests.java b/src/test/java/org/elasticsearch/search/highlight/HighlighterSearchTests.java index f7ddd6fa7a71d..359f4c28fca9c 100644 --- a/src/test/java/org/elasticsearch/search/highlight/HighlighterSearchTests.java +++ b/src/test/java/org/elasticsearch/search/highlight/HighlighterSearchTests.java @@ -679,6 +679,42 @@ public void testPlainHighlighterDocumentAnalyzer() throws Exception { assertHighlight(response, 0, "text", 0, 1, equalTo("Look at me, I'm eating <1>cars.")); } + @Test + public void testPlainHighlighterDocumentAnalyzerOverriddenByFieldAnalyzer() throws Exception { + client().admin().indices().prepareCreate("test") + .addMapping("type1", XContentFactory.jsonBuilder().startObject().startObject("type1") + .startObject("_analyzer") + .field("path", "language_analyzer") + .endObject() + .startObject("properties") + .startObject("language_analyzer") + .field("type", "string") + .field("index", "not_analyzed") + .endObject() + .startObject("text") + .field("type", "string") + .field("analyzer", "standard") + .endObject() + .endObject() + .endObject().endObject()).execute().actionGet(); + ensureYellow(); + + index("test", "type1", "1", + "language_analyzer", "english", + "text", "Look at me, I'm eating cars."); + refresh(); + + // Make sure both "text" field and query string are analyzed by standard analyzer. + // If english analyzer specified in "language_analyzer" field is used for "text" field, "cars" in the field is analyzed as "car", + // which is different from analyzed query, "cars". As a result, there'll be no highlight (See #8943). + SearchResponse response = client().prepareSearch("test") + .setQuery(QueryBuilders.matchQuery("text", "cars")) + .addHighlightedField( + new HighlightBuilder.Field("text").preTags("<1>").postTags("").requireFieldMatch(true)) + .get(); + assertHighlight(response, 0, "text", 0, 1, equalTo("Look at me, I'm eating <1>cars.")); + } + @Test public void testFastVectorHighlighter() throws Exception { assertAcked(prepareCreate("test").addMapping("type1", type1TermVectorMapping()));