|
@@ -19,6 +19,7 @@
|
|
|
package org.elasticsearch.search.query;
|
|
|
|
|
|
import com.carrotsearch.randomizedtesting.generators.RandomPicks;
|
|
|
+
|
|
|
import org.elasticsearch.action.admin.indices.create.CreateIndexRequestBuilder;
|
|
|
import org.elasticsearch.action.index.IndexRequestBuilder;
|
|
|
import org.elasticsearch.action.search.SearchResponse;
|
|
@@ -459,6 +460,23 @@ public class MultiMatchQueryIT extends ESIntegTestCase {
|
|
|
assertHitCount(searchResponse, 1l);
|
|
|
assertFirstHit(searchResponse, hasId("theone"));
|
|
|
|
|
|
+ searchResponse = client().prepareSearch("test")
|
|
|
+ .setQuery(randomizeType(multiMatchQuery("captain america 15", "full_name", "first_name", "last_name", "category", "skill", "int-field")
|
|
|
+ .type(MultiMatchQueryBuilder.Type.CROSS_FIELDS)
|
|
|
+ .analyzer("category")
|
|
|
+ .operator(Operator.AND))).get();
|
|
|
+ assertHitCount(searchResponse, 1l);
|
|
|
+ assertFirstHit(searchResponse, hasId("theone"));
|
|
|
+
|
|
|
+ searchResponse = client().prepareSearch("test")
|
|
|
+ .setQuery(randomizeType(multiMatchQuery("captain america 15", "skill", "full_name", "first_name", "last_name", "category", "int-field")
|
|
|
+ .type(MultiMatchQueryBuilder.Type.CROSS_FIELDS)
|
|
|
+ .analyzer("category")
|
|
|
+ .operator(Operator.AND))).get();
|
|
|
+ assertHitCount(searchResponse, 1l);
|
|
|
+ assertFirstHit(searchResponse, hasId("theone"));
|
|
|
+
|
|
|
+
|
|
|
searchResponse = client().prepareSearch("test")
|
|
|
.setQuery(randomizeType(multiMatchQuery("captain america 15", "first_name", "last_name", "skill")
|
|
|
.type(MultiMatchQueryBuilder.Type.CROSS_FIELDS)
|
|
@@ -471,6 +489,24 @@ public class MultiMatchQueryIT extends ESIntegTestCase {
|
|
|
.analyzer("category"))).get();
|
|
|
assertFirstHit(searchResponse, hasId("theone"));
|
|
|
|
|
|
+ searchResponse = client().prepareSearch("test")
|
|
|
+ .setQuery(randomizeType(multiMatchQuery("25 15", "first_name", "int-field", "skill")
|
|
|
+ .type(MultiMatchQueryBuilder.Type.CROSS_FIELDS)
|
|
|
+ .analyzer("category"))).get();
|
|
|
+ assertFirstHit(searchResponse, hasId("theone"));
|
|
|
+
|
|
|
+ searchResponse = client().prepareSearch("test")
|
|
|
+ .setQuery(randomizeType(multiMatchQuery("25 15", "int-field", "skill", "first_name")
|
|
|
+ .type(MultiMatchQueryBuilder.Type.CROSS_FIELDS)
|
|
|
+ .analyzer("category"))).get();
|
|
|
+ assertFirstHit(searchResponse, hasId("theone"));
|
|
|
+
|
|
|
+ searchResponse = client().prepareSearch("test")
|
|
|
+ .setQuery(randomizeType(multiMatchQuery("25 15", "int-field", "first_name", "skill")
|
|
|
+ .type(MultiMatchQueryBuilder.Type.CROSS_FIELDS)
|
|
|
+ .analyzer("category"))).get();
|
|
|
+ assertFirstHit(searchResponse, hasId("theone"));
|
|
|
+
|
|
|
searchResponse = client().prepareSearch("test")
|
|
|
.setQuery(randomizeType(multiMatchQuery("captain america marvel hero", "first_name", "last_name", "category")
|
|
|
.type(MultiMatchQueryBuilder.Type.CROSS_FIELDS)
|
|
@@ -529,6 +565,46 @@ public class MultiMatchQueryIT extends ESIntegTestCase {
|
|
|
assertFirstHit(searchResponse, hasId("ultimate2"));
|
|
|
assertSecondHit(searchResponse, hasId("ultimate1"));
|
|
|
assertThat(searchResponse.getHits().hits()[0].getScore(), greaterThan(searchResponse.getHits().hits()[1].getScore()));
|
|
|
+
|
|
|
+ // Test group based on numeric fields
|
|
|
+ searchResponse = client().prepareSearch("test")
|
|
|
+ .setQuery(randomizeType(multiMatchQuery("15", "skill")
|
|
|
+ .type(MultiMatchQueryBuilder.Type.CROSS_FIELDS))).get();
|
|
|
+ assertFirstHit(searchResponse, hasId("theone"));
|
|
|
+
|
|
|
+ searchResponse = client().prepareSearch("test")
|
|
|
+ .setQuery(randomizeType(multiMatchQuery("15", "skill", "first_name")
|
|
|
+ .type(MultiMatchQueryBuilder.Type.CROSS_FIELDS))).get();
|
|
|
+ assertFirstHit(searchResponse, hasId("theone"));
|
|
|
+
|
|
|
+ // Two numeric fields together caused trouble at one point!
|
|
|
+ searchResponse = client().prepareSearch("test")
|
|
|
+ .setQuery(randomizeType(multiMatchQuery("15", "int-field", "skill")
|
|
|
+ .type(MultiMatchQueryBuilder.Type.CROSS_FIELDS))).get();
|
|
|
+ assertFirstHit(searchResponse, hasId("theone"));
|
|
|
+
|
|
|
+ searchResponse = client().prepareSearch("test")
|
|
|
+ .setQuery(randomizeType(multiMatchQuery("15", "int-field", "first_name", "skill")
|
|
|
+ .type(MultiMatchQueryBuilder.Type.CROSS_FIELDS))).get();
|
|
|
+ assertFirstHit(searchResponse, hasId("theone"));
|
|
|
+
|
|
|
+ searchResponse = client().prepareSearch("test")
|
|
|
+ .setQuery(randomizeType(multiMatchQuery("alpha 15", "first_name", "skill")
|
|
|
+ .type(MultiMatchQueryBuilder.Type.CROSS_FIELDS)
|
|
|
+ .lenient(true))).get();
|
|
|
+ assertFirstHit(searchResponse, hasId("ultimate1"));
|
|
|
+ /*
|
|
|
+ * Doesn't find theone because "alpha 15" isn't a number and we don't
|
|
|
+ * break on spaces.
|
|
|
+ */
|
|
|
+ assertHitCount(searchResponse, 1);
|
|
|
+
|
|
|
+ // Lenient wasn't always properly lenient with two numeric fields
|
|
|
+ searchResponse = client().prepareSearch("test")
|
|
|
+ .setQuery(randomizeType(multiMatchQuery("alpha 15", "int-field", "first_name", "skill")
|
|
|
+ .type(MultiMatchQueryBuilder.Type.CROSS_FIELDS)
|
|
|
+ .lenient(true))).get();
|
|
|
+ assertFirstHit(searchResponse, hasId("ultimate1"));
|
|
|
}
|
|
|
|
|
|
private static final void assertEquivalent(String query, SearchResponse left, SearchResponse right) {
|