From 671b48e0076bca96e76495e54e4bce6614a33ddc Mon Sep 17 00:00:00 2001 From: Igor Motov Date: Mon, 16 May 2011 09:53:11 -0400 Subject: [PATCH] Fix possible false matches with multiple percolators. --- .../index/percolator/PercolatorExecutor.java | 2 +- .../percolator/SimplePercolatorTests.java | 50 +++++++++++++++++++ 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/modules/elasticsearch/src/main/java/org/elasticsearch/index/percolator/PercolatorExecutor.java b/modules/elasticsearch/src/main/java/org/elasticsearch/index/percolator/PercolatorExecutor.java index 31461eb6367..78e63dfe235 100644 --- a/modules/elasticsearch/src/main/java/org/elasticsearch/index/percolator/PercolatorExecutor.java +++ b/modules/elasticsearch/src/main/java/org/elasticsearch/index/percolator/PercolatorExecutor.java @@ -340,8 +340,8 @@ public class PercolatorExecutor extends AbstractIndexComponent { List matches = new ArrayList(); if (request.query() == null) { - Lucene.ExistsCollector collector = new Lucene.ExistsCollector(); for (Map.Entry entry : queries.entrySet()) { + Lucene.ExistsCollector collector = new Lucene.ExistsCollector(); try { searcher.search(entry.getValue(), collector); } catch (IOException e) { diff --git a/modules/test/integration/src/test/java/org/elasticsearch/test/integration/percolator/SimplePercolatorTests.java b/modules/test/integration/src/test/java/org/elasticsearch/test/integration/percolator/SimplePercolatorTests.java index b0d9efd4824..1987e6bc47a 100644 --- a/modules/test/integration/src/test/java/org/elasticsearch/test/integration/percolator/SimplePercolatorTests.java +++ b/modules/test/integration/src/test/java/org/elasticsearch/test/integration/percolator/SimplePercolatorTests.java @@ -248,6 +248,56 @@ public class SimplePercolatorTests extends AbstractNodesTests { } } + @Test public void multiplePercolators() throws Exception { + try { + client.admin().indices().prepareDelete("test").execute().actionGet(); + } catch (Exception e) { + // ignore + } + try { + client.admin().indices().prepareDelete("_percolator").execute().actionGet(); + } catch (Exception e) { + // ignore + } + client.admin().indices().prepareCreate("test").setSettings(settingsBuilder().put("index.number_of_shards", 1)).execute().actionGet(); + client.admin().cluster().prepareHealth().setWaitForGreenStatus().execute().actionGet(); + + logger.info("--> register a query 1"); + client.prepareIndex("_percolator", "test", "kuku") + .setSource(jsonBuilder().startObject() + .field("color", "blue") + .field("query", termQuery("field1", "value1")) + .endObject()) + .setRefresh(true) + .execute().actionGet(); + client.admin().cluster().prepareHealth().setWaitForGreenStatus().setWaitForActiveShards(4).execute().actionGet(); + + logger.info("--> register a query 2"); + client.prepareIndex("_percolator", "test", "bubu") + .setSource(jsonBuilder().startObject() + .field("color", "green") + .field("query", termQuery("field1", "value2")) + .endObject()) + .setRefresh(true) + .execute().actionGet(); + + + PercolateResponse percolate = client.preparePercolate("test", "type1").setSource(jsonBuilder().startObject().startObject("doc") + .field("field1", "value1") + .endObject().endObject()) + .execute().actionGet(); + assertThat(percolate.matches().size(), equalTo(1)); + assertThat(percolate.matches(), hasItem("kuku")); + + percolate = client.preparePercolate("test", "type1").setSource(jsonBuilder().startObject().startObject("doc").startObject("type1") + .field("field1", "value2") + .endObject().endObject().endObject()) + .execute().actionGet(); + assertThat(percolate.matches().size(), equalTo(1)); + assertThat(percolate.matches(), hasItem("bubu")); + + } + @Test public void dynamicAddingRemovingQueries() throws Exception { try { client.admin().indices().prepareDelete("test").execute().actionGet();