public void testPercolatorQueryWithHighlighting()

in modules/percolator/src/internalClusterTest/java/org/opensearch/percolator/PercolatorQuerySearchIT.java [533:777]


    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(
            client().admin()
                .indices()
                .prepareCreate("test")
                .addMapping("type", "id", "type=keyword", "field1", fieldMapping, "query", "type=percolator")
        );
        client().prepareIndex("test", "type", "1")
            .setSource(jsonBuilder().startObject().field("id", "1").field("query", matchQuery("field1", "brown fox")).endObject())
            .execute()
            .actionGet();
        client().prepareIndex("test", "type", "2")
            .setSource(jsonBuilder().startObject().field("id", "2").field("query", matchQuery("field1", "lazy dog")).endObject())
            .execute()
            .actionGet();
        client().prepareIndex("test", "type", "3")
            .setSource(jsonBuilder().startObject().field("id", "3").field("query", termQuery("field1", "jumps")).endObject())
            .execute()
            .actionGet();
        client().prepareIndex("test", "type", "4")
            .setSource(jsonBuilder().startObject().field("id", "4").field("query", termQuery("field1", "dog")).endObject())
            .execute()
            .actionGet();
        client().prepareIndex("test", "type", "5")
            .setSource(jsonBuilder().startObject().field("id", "5").field("query", termQuery("field1", "fox")).endObject())
            .execute()
            .actionGet();
        client().admin().indices().prepareRefresh().get();

        BytesReference document = BytesReference.bytes(
            jsonBuilder().startObject().field("field1", "The quick brown fox jumps over the lazy dog").endObject()
        );
        SearchResponse searchResponse = client().prepareSearch()
            .setQuery(new PercolateQueryBuilder("query", document, XContentType.JSON))
            .highlighter(new HighlightBuilder().field("field1"))
            .addSort("id", SortOrder.ASC)
            .get();
        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());
        searchResponse = client().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)
            .get();
        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")
        );

        searchResponse = client().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)
            .get();
        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>")
        );

        searchResponse = client().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)
            .get();
        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>")
        );
    }