Переглянути джерело

Merge pull request #20673

Add test for using fuzziness parameter in multi_match query
Christoph Büscher 9 роки тому
батько
коміт
c3e564a9cd

+ 37 - 0
core/src/test/java/org/elasticsearch/search/query/MultiMatchQueryIT.java

@@ -635,6 +635,43 @@ public class MultiMatchQueryIT extends ESIntegTestCase {
         assertFirstHit(searchResponse, hasId("ultimate1"));
     }
 
+    /**
+     * Test for edge case where field level boosting is applied to field that doesn't exist on documents on
+     * one shard. There was an issue reported in https://github.com/elastic/elasticsearch/issues/18710 where a
+     * `multi_match` query using the fuzziness parameter with a boost on one of two fields returns the
+     * same document score if both documents are placed on different shard. This test recreates that scenario
+     * and checks that the returned scores are different.
+     */
+    public void testFuzzyFieldLevelBoosting() throws InterruptedException, ExecutionException {
+        String idx = "test18710";
+        CreateIndexRequestBuilder builder = prepareCreate(idx).setSettings(Settings.builder()
+                .put(indexSettings())
+                .put(SETTING_NUMBER_OF_SHARDS, 3)
+                .put(SETTING_NUMBER_OF_REPLICAS, 0)
+                );
+        assertAcked(builder.addMapping("type", "title", "type=string", "body", "type=string"));
+        ensureGreen();
+        List<IndexRequestBuilder> builders = new ArrayList<>();
+        builders.add(client().prepareIndex(idx, "type", "1").setSource(
+                "title", "foo",
+                "body", "bar"));
+        builders.add(client().prepareIndex(idx, "type", "2").setSource(
+                "title", "bar",
+                "body", "foo"));
+        indexRandom(true, false, builders);
+
+        SearchResponse searchResponse = client().prepareSearch(idx)
+                .setExplain(true)
+                .setQuery(multiMatchQuery("foo").field("title", 100).field("body")
+                        .fuzziness(0)
+                        ).get();
+        SearchHit[] hits = searchResponse.getHits().getHits();
+        assertNotEquals("both documents should be on different shards", hits[0].getShard().getShardId(), hits[1].getShard().getShardId());
+        assertEquals("1", hits[0].getId());
+        assertEquals("2", hits[1].getId());
+        assertThat(hits[0].getScore(), greaterThan(hits[1].score()));
+    }
+
     private static void assertEquivalent(String query, SearchResponse left, SearchResponse right) {
         assertNoFailures(left);
         assertNoFailures(right);