|
36 | 36 | import org.elasticsearch.index.query.functionscore.ScoreFunctionBuilders;
|
37 | 37 | import org.elasticsearch.search.SearchHit;
|
38 | 38 | import org.elasticsearch.search.SearchHits;
|
| 39 | +import org.elasticsearch.search.collapse.CollapseBuilder; |
39 | 40 | import org.elasticsearch.search.rescore.QueryRescoreMode;
|
40 | 41 | import org.elasticsearch.search.rescore.QueryRescorerBuilder;
|
41 | 42 | import org.elasticsearch.search.sort.SortBuilders;
|
42 | 43 | import org.elasticsearch.test.ESIntegTestCase;
|
43 | 44 |
|
| 45 | +import java.io.IOException; |
44 | 46 | import java.util.Arrays;
|
45 | 47 | import java.util.Comparator;
|
| 48 | +import java.util.Map; |
| 49 | +import java.util.stream.Collectors; |
46 | 50 |
|
47 | 51 | import static org.elasticsearch.cluster.metadata.IndexMetaData.SETTING_NUMBER_OF_REPLICAS;
|
48 | 52 | import static org.elasticsearch.cluster.metadata.IndexMetaData.SETTING_NUMBER_OF_SHARDS;
|
|
67 | 71 | import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertThirdHit;
|
68 | 72 | import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.hasId;
|
69 | 73 | import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.hasScore;
|
| 74 | +import static org.hamcrest.Matchers.containsInAnyOrder; |
70 | 75 | import static org.hamcrest.Matchers.containsString;
|
71 | 76 | import static org.hamcrest.Matchers.equalTo;
|
72 | 77 | import static org.hamcrest.Matchers.greaterThan;
|
@@ -748,4 +753,64 @@ public void testRescorePhaseWithInvalidSort() throws Exception {
|
748 | 753 | assertThat(hit.getScore(), equalTo(101f));
|
749 | 754 | }
|
750 | 755 | }
|
| 756 | + |
| 757 | + public void testRescoreAfterCollapse() throws Exception { |
| 758 | + assertAcked(prepareCreate("test") |
| 759 | + .addMapping( |
| 760 | + "type1", |
| 761 | + jsonBuilder() |
| 762 | + .startObject() |
| 763 | + .startObject("properties") |
| 764 | + .startObject("group") |
| 765 | + .field("type", "keyword") |
| 766 | + .endObject() |
| 767 | + .endObject() |
| 768 | + .endObject()) |
| 769 | + ); |
| 770 | + |
| 771 | + ensureGreen("test"); |
| 772 | + |
| 773 | + indexDocument(1, "miss", "a", 1, 10); |
| 774 | + indexDocument(2, "name", "a", 2, 20); |
| 775 | + indexDocument(3, "name", "b", 2, 30); |
| 776 | + // should be highest on rescore, but filtered out during collapse |
| 777 | + indexDocument(4, "name", "b", 1, 40); |
| 778 | + |
| 779 | + refresh("test"); |
| 780 | + |
| 781 | + SearchResponse searchResponse = client().prepareSearch("test") |
| 782 | + .setTypes("type1") |
| 783 | + .setQuery(staticScoreQuery("static_score")) |
| 784 | + .addRescorer(new QueryRescorerBuilder(staticScoreQuery("static_rescore"))) |
| 785 | + .setCollapse(new CollapseBuilder("group")) |
| 786 | + .get(); |
| 787 | + |
| 788 | + assertThat(searchResponse.getHits().totalHits, equalTo(3L)); |
| 789 | + assertThat(searchResponse.getHits().getHits().length, equalTo(2)); |
| 790 | + |
| 791 | + Map<String, Float> collapsedHits = Arrays |
| 792 | + .stream(searchResponse.getHits().getHits()) |
| 793 | + .collect(Collectors.toMap(SearchHit::getId, SearchHit::getScore)); |
| 794 | + |
| 795 | + assertThat(collapsedHits.keySet(), containsInAnyOrder("2", "3")); |
| 796 | + assertThat(collapsedHits.get("2"), equalTo(22F)); |
| 797 | + assertThat(collapsedHits.get("3"), equalTo(32F)); |
| 798 | + } |
| 799 | + |
| 800 | + private QueryBuilder staticScoreQuery(String scoreField) { |
| 801 | + return functionScoreQuery(termQuery("name", "name"), ScoreFunctionBuilders.fieldValueFactorFunction(scoreField)) |
| 802 | + .boostMode(CombineFunction.REPLACE); |
| 803 | + } |
| 804 | + |
| 805 | + private void indexDocument(int id, String name, String group, int score, int rescore) throws IOException { |
| 806 | + XContentBuilder docBuilder =jsonBuilder() |
| 807 | + .startObject() |
| 808 | + .field("name", name) |
| 809 | + .field("group", group) |
| 810 | + .field("static_score", score) |
| 811 | + .field("static_rescore", rescore) |
| 812 | + .endObject(); |
| 813 | + |
| 814 | + client().prepareIndex("test", "type1", Integer.toString(id)).setSource(docBuilder).get(); |
| 815 | + } |
751 | 816 | }
|
0 commit comments