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>")
);
}
);
}