From c2424e62a27af239e08eed5584c2759dd7214c62 Mon Sep 17 00:00:00 2001 From: David Pilato Date: Fri, 6 Dec 2013 21:50:06 +0100 Subject: [PATCH] Query String caching could cause matched_filters not working When searching with a query containing query_strings inside a bool query, the specified _name is randomly missing from the results due to caching. Closes #4361. Closes #4371. --- .../index/query/QueryStringQueryParser.java | 3 ++ .../matchedqueries/MatchedQueriesTests.java | 48 +++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/src/main/java/org/elasticsearch/index/query/QueryStringQueryParser.java b/src/main/java/org/elasticsearch/index/query/QueryStringQueryParser.java index 07eea1fa9a5ce..d78daeaac5da3 100644 --- a/src/main/java/org/elasticsearch/index/query/QueryStringQueryParser.java +++ b/src/main/java/org/elasticsearch/index/query/QueryStringQueryParser.java @@ -204,6 +204,9 @@ public Query parse(QueryParseContext parseContext) throws IOException, QueryPars Query query = parseContext.indexCache().queryParserCache().get(qpSettings); if (query != null) { + if (queryName != null) { + parseContext.addNamedQuery(queryName, query); + } return query; } diff --git a/src/test/java/org/elasticsearch/search/matchedqueries/MatchedQueriesTests.java b/src/test/java/org/elasticsearch/search/matchedqueries/MatchedQueriesTests.java index 01de4d1178f12..b2054c4c8b02c 100644 --- a/src/test/java/org/elasticsearch/search/matchedqueries/MatchedQueriesTests.java +++ b/src/test/java/org/elasticsearch/search/matchedqueries/MatchedQueriesTests.java @@ -203,4 +203,52 @@ public void testIndicesFilterSupportsName() { } } } + + /** + * Test case for issue #4361: https://github.com/elasticsearch/elasticsearch/issues/4361 + */ + @Test + public void testMatchedWithShould() throws Exception { + createIndex("test"); + ensureGreen(); + + client().prepareIndex("test", "type1", "1").setSource("content", "Lorem ipsum dolor sit amet").get(); + client().prepareIndex("test", "type1", "2").setSource("content", "consectetur adipisicing elit").get(); + refresh(); + + // Execute search a first time to load it in cache + client().prepareSearch() + .setQuery( + boolQuery() + .minimumNumberShouldMatch(1) + .should(queryString("dolor").queryName("dolor")) + .should(queryString("elit").queryName("elit")) + ) + .setPreference("_primary") + .get(); + + SearchResponse searchResponse = client().prepareSearch() + .setQuery( + boolQuery() + .minimumNumberShouldMatch(1) + .should(queryString("dolor").queryName("dolor")) + .should(queryString("elit").queryName("elit")) + ) + .setPreference("_primary") + .get(); + + //_primary + assertHitCount(searchResponse, 2l); + for (SearchHit hit : searchResponse.getHits()) { + if (hit.id().equals("1")) { + assertThat(hit.matchedQueries().length, equalTo(1)); + assertThat(hit.matchedQueries(), hasItemInArray("dolor")); + } else if (hit.id().equals("2")) { + assertThat(hit.matchedQueries().length, equalTo(1)); + assertThat(hit.matchedQueries(), hasItemInArray("elit")); + } else { + fail("Unexpected document returned with id " + hit.id()); + } + } + } }