public void testPercolatorQueryWithHighlighting()

in modules/percolator/src/internalClusterTest/java/org/elasticsearch/percolator/PercolatorQuerySearchIT.java [503:754]


    public void testPercolatorQueryWithHighlighting() throws Exception {
        StringBuilder fieldMapping = new StringBuilder("type=text").append(",store=").append(randomBoolean());
        if (randomBoolean()) {
            fieldMapping.append(",term_vector=with_positions_offsets");
        } else if (randomBoolean()) {
            fieldMapping.append(",index_options=offsets");
        }
        assertAcked(
            indicesAdmin().prepareCreate("test")
                .setMapping("id", "type=keyword", "field1", fieldMapping.toString(), "query", "type=percolator")
        );
        prepareIndex("test").setId("1")
            .setSource(jsonBuilder().startObject().field("id", "1").field("query", matchQuery("field1", "brown fox")).endObject())
            .get();
        prepareIndex("test").setId("2")
            .setSource(jsonBuilder().startObject().field("id", "2").field("query", matchQuery("field1", "lazy dog")).endObject())
            .get();
        prepareIndex("test").setId("3")
            .setSource(jsonBuilder().startObject().field("id", "3").field("query", termQuery("field1", "jumps")).endObject())
            .get();
        prepareIndex("test").setId("4")
            .setSource(jsonBuilder().startObject().field("id", "4").field("query", termQuery("field1", "dog")).endObject())
            .get();
        prepareIndex("test").setId("5")
            .setSource(jsonBuilder().startObject().field("id", "5").field("query", termQuery("field1", "fox")).endObject())
            .get();
        indicesAdmin().prepareRefresh().get();

        BytesReference document = BytesReference.bytes(
            jsonBuilder().startObject().field("field1", "The quick brown fox jumps over the lazy dog").endObject()
        );
        assertResponse(
            prepareSearch().setQuery(new PercolateQueryBuilder("query", document, XContentType.JSON))
                .highlighter(new HighlightBuilder().field("field1"))
                .addSort("id", SortOrder.ASC),
            searchResponse -> {
                assertHitCount(searchResponse, 5);

                assertThat(
                    searchResponse.getHits().getAt(0).getHighlightFields().get("field1").fragments()[0].string(),
                    equalTo("The quick <em>brown</em> <em>fox</em> jumps over the lazy dog")
                );
                assertThat(
                    searchResponse.getHits().getAt(1).getHighlightFields().get("field1").fragments()[0].string(),
                    equalTo("The quick brown fox jumps over the <em>lazy</em> <em>dog</em>")
                );
                assertThat(
                    searchResponse.getHits().getAt(2).getHighlightFields().get("field1").fragments()[0].string(),
                    equalTo("The quick brown fox <em>jumps</em> over the lazy dog")
                );
                assertThat(
                    searchResponse.getHits().getAt(3).getHighlightFields().get("field1").fragments()[0].string(),
                    equalTo("The quick brown fox jumps over the lazy <em>dog</em>")
                );
                assertThat(
                    searchResponse.getHits().getAt(4).getHighlightFields().get("field1").fragments()[0].string(),
                    equalTo("The quick brown <em>fox</em> jumps over the lazy dog")
                );
            }
        );

        BytesReference document1 = BytesReference.bytes(
            jsonBuilder().startObject().field("field1", "The quick brown fox jumps").endObject()
        );
        BytesReference document2 = BytesReference.bytes(jsonBuilder().startObject().field("field1", "over the lazy dog").endObject());
        assertResponse(
            prepareSearch().setQuery(
                boolQuery().should(new PercolateQueryBuilder("query", document1, XContentType.JSON).setName("query1"))
                    .should(new PercolateQueryBuilder("query", document2, XContentType.JSON).setName("query2"))
            ).highlighter(new HighlightBuilder().field("field1")).addSort("id", SortOrder.ASC),
            searchResponse -> {
                logger.info("searchResponse={}", searchResponse);
                assertHitCount(searchResponse, 5);

                assertThat(
                    searchResponse.getHits().getAt(0).getHighlightFields().get("query1_field1").fragments()[0].string(),
                    equalTo("The quick <em>brown</em> <em>fox</em> jumps")
                );
                assertThat(
                    searchResponse.getHits().getAt(1).getHighlightFields().get("query2_field1").fragments()[0].string(),
                    equalTo("over the <em>lazy</em> <em>dog</em>")
                );
                assertThat(
                    searchResponse.getHits().getAt(2).getHighlightFields().get("query1_field1").fragments()[0].string(),
                    equalTo("The quick brown fox <em>jumps</em>")
                );
                assertThat(
                    searchResponse.getHits().getAt(3).getHighlightFields().get("query2_field1").fragments()[0].string(),
                    equalTo("over the lazy <em>dog</em>")
                );
                assertThat(
                    searchResponse.getHits().getAt(4).getHighlightFields().get("query1_field1").fragments()[0].string(),
                    equalTo("The quick brown <em>fox</em> jumps")
                );
            }
        );

        assertResponse(
            prepareSearch().setQuery(
                new PercolateQueryBuilder(
                    "query",
                    Arrays.asList(
                        BytesReference.bytes(jsonBuilder().startObject().field("field1", "dog").endObject()),
                        BytesReference.bytes(jsonBuilder().startObject().field("field1", "fox").endObject()),
                        BytesReference.bytes(jsonBuilder().startObject().field("field1", "jumps").endObject()),
                        BytesReference.bytes(jsonBuilder().startObject().field("field1", "brown fox").endObject())
                    ),
                    XContentType.JSON
                )
            ).highlighter(new HighlightBuilder().field("field1")).addSort("id", SortOrder.ASC),
            searchResponse -> {
                assertHitCount(searchResponse, 5);
                assertThat(
                    searchResponse.getHits().getAt(0).getFields().get("_percolator_document_slot").getValues(),
                    equalTo(Arrays.asList(1, 3))
                );
                assertThat(
                    searchResponse.getHits().getAt(0).getHighlightFields().get("1_field1").fragments()[0].string(),
                    equalTo("<em>fox</em>")
                );
                assertThat(
                    searchResponse.getHits().getAt(0).getHighlightFields().get("3_field1").fragments()[0].string(),
                    equalTo("<em>brown</em> <em>fox</em>")
                );
                assertThat(
                    searchResponse.getHits().getAt(1).getFields().get("_percolator_document_slot").getValues(),
                    equalTo(Collections.singletonList(0))
                );
                assertThat(
                    searchResponse.getHits().getAt(1).getHighlightFields().get("0_field1").fragments()[0].string(),
                    equalTo("<em>dog</em>")
                );
                assertThat(
                    searchResponse.getHits().getAt(2).getFields().get("_percolator_document_slot").getValues(),
                    equalTo(Collections.singletonList(2))
                );
                assertThat(
                    searchResponse.getHits().getAt(2).getHighlightFields().get("2_field1").fragments()[0].string(),
                    equalTo("<em>jumps</em>")
                );
                assertThat(
                    searchResponse.getHits().getAt(3).getFields().get("_percolator_document_slot").getValues(),
                    equalTo(Collections.singletonList(0))
                );
                assertThat(
                    searchResponse.getHits().getAt(3).getHighlightFields().get("0_field1").fragments()[0].string(),
                    equalTo("<em>dog</em>")
                );
                assertThat(
                    searchResponse.getHits().getAt(4).getFields().get("_percolator_document_slot").getValues(),
                    equalTo(Arrays.asList(1, 3))
                );
                assertThat(
                    searchResponse.getHits().getAt(4).getHighlightFields().get("1_field1").fragments()[0].string(),
                    equalTo("<em>fox</em>")
                );
                assertThat(
                    searchResponse.getHits().getAt(4).getHighlightFields().get("3_field1").fragments()[0].string(),
                    equalTo("brown <em>fox</em>")
                );
            }
        );

        assertResponse(
            prepareSearch().setQuery(
                boolQuery().should(
                    new PercolateQueryBuilder(
                        "query",
                        Arrays.asList(
                            BytesReference.bytes(jsonBuilder().startObject().field("field1", "dog").endObject()),
                            BytesReference.bytes(jsonBuilder().startObject().field("field1", "fox").endObject())
                        ),
                        XContentType.JSON
                    ).setName("query1")
                )
                    .should(
                        new PercolateQueryBuilder(
                            "query",
                            Arrays.asList(
                                BytesReference.bytes(jsonBuilder().startObject().field("field1", "jumps").endObject()),
                                BytesReference.bytes(jsonBuilder().startObject().field("field1", "brown fox").endObject())
                            ),
                            XContentType.JSON
                        ).setName("query2")
                    )
            ).highlighter(new HighlightBuilder().field("field1")).addSort("id", SortOrder.ASC),
            searchResponse -> {
                logger.info("searchResponse={}", searchResponse);
                assertHitCount(searchResponse, 5);
                assertThat(
                    searchResponse.getHits().getAt(0).getFields().get("_percolator_document_slot_query1").getValues(),
                    equalTo(Collections.singletonList(1))
                );
                assertThat(
                    searchResponse.getHits().getAt(0).getFields().get("_percolator_document_slot_query2").getValues(),
                    equalTo(Collections.singletonList(1))
                );
                assertThat(
                    searchResponse.getHits().getAt(0).getHighlightFields().get("query1_1_field1").fragments()[0].string(),
                    equalTo("<em>fox</em>")
                );
                assertThat(
                    searchResponse.getHits().getAt(0).getHighlightFields().get("query2_1_field1").fragments()[0].string(),
                    equalTo("<em>brown</em> <em>fox</em>")
                );

                assertThat(
                    searchResponse.getHits().getAt(1).getFields().get("_percolator_document_slot_query1").getValues(),
                    equalTo(Collections.singletonList(0))
                );
                assertThat(
                    searchResponse.getHits().getAt(1).getHighlightFields().get("query1_0_field1").fragments()[0].string(),
                    equalTo("<em>dog</em>")
                );

                assertThat(
                    searchResponse.getHits().getAt(2).getFields().get("_percolator_document_slot_query2").getValues(),
                    equalTo(Collections.singletonList(0))
                );
                assertThat(
                    searchResponse.getHits().getAt(2).getHighlightFields().get("query2_0_field1").fragments()[0].string(),
                    equalTo("<em>jumps</em>")
                );

                assertThat(
                    searchResponse.getHits().getAt(3).getFields().get("_percolator_document_slot_query1").getValues(),
                    equalTo(Collections.singletonList(0))
                );
                assertThat(
                    searchResponse.getHits().getAt(3).getHighlightFields().get("query1_0_field1").fragments()[0].string(),
                    equalTo("<em>dog</em>")
                );

                assertThat(
                    searchResponse.getHits().getAt(4).getFields().get("_percolator_document_slot_query1").getValues(),
                    equalTo(Collections.singletonList(1))
                );
                assertThat(
                    searchResponse.getHits().getAt(4).getFields().get("_percolator_document_slot_query2").getValues(),
                    equalTo(Collections.singletonList(1))
                );
                assertThat(
                    searchResponse.getHits().getAt(4).getHighlightFields().get("query1_1_field1").fragments()[0].string(),
                    equalTo("<em>fox</em>")
                );
                assertThat(
                    searchResponse.getHits().getAt(4).getHighlightFields().get("query2_1_field1").fragments()[0].string(),
                    equalTo("brown <em>fox</em>")
                );
            }
        );
    }