test: Added extra tests for percolating with nested documents.
This commit is contained in:
parent
7379b17e61
commit
5e3f2ce7aa
|
@ -447,7 +447,7 @@ public class PercolateQueryBuilder extends AbstractQueryBuilder<PercolateQueryBu
|
||||||
return document;
|
return document;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static IndexSearcher createMultiDocumentSearcher(Analyzer analyzer, ParsedDocument doc) {
|
static IndexSearcher createMultiDocumentSearcher(Analyzer analyzer, ParsedDocument doc) {
|
||||||
IndexReader[] memoryIndices = new IndexReader[doc.docs().size()];
|
IndexReader[] memoryIndices = new IndexReader[doc.docs().size()];
|
||||||
List<ParseContext.Document> docs = doc.docs();
|
List<ParseContext.Document> docs = doc.docs();
|
||||||
int rootDocIndex = docs.size() - 1;
|
int rootDocIndex = docs.size() - 1;
|
||||||
|
|
|
@ -20,7 +20,15 @@
|
||||||
package org.elasticsearch.percolator;
|
package org.elasticsearch.percolator;
|
||||||
|
|
||||||
import com.fasterxml.jackson.core.JsonParseException;
|
import com.fasterxml.jackson.core.JsonParseException;
|
||||||
|
import org.apache.lucene.analysis.Analyzer;
|
||||||
|
import org.apache.lucene.analysis.core.WhitespaceAnalyzer;
|
||||||
|
import org.apache.lucene.document.Document;
|
||||||
|
import org.apache.lucene.search.BooleanClause;
|
||||||
|
import org.apache.lucene.search.BooleanQuery;
|
||||||
|
import org.apache.lucene.search.IndexSearcher;
|
||||||
|
import org.apache.lucene.search.MatchAllDocsQuery;
|
||||||
import org.apache.lucene.search.Query;
|
import org.apache.lucene.search.Query;
|
||||||
|
import org.apache.lucene.search.TermQuery;
|
||||||
import org.elasticsearch.ElasticsearchParseException;
|
import org.elasticsearch.ElasticsearchParseException;
|
||||||
import org.elasticsearch.ResourceNotFoundException;
|
import org.elasticsearch.ResourceNotFoundException;
|
||||||
import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest;
|
import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest;
|
||||||
|
@ -30,10 +38,14 @@ import org.elasticsearch.common.ParsingException;
|
||||||
import org.elasticsearch.common.bytes.BytesArray;
|
import org.elasticsearch.common.bytes.BytesArray;
|
||||||
import org.elasticsearch.common.bytes.BytesReference;
|
import org.elasticsearch.common.bytes.BytesReference;
|
||||||
import org.elasticsearch.common.compress.CompressedXContent;
|
import org.elasticsearch.common.compress.CompressedXContent;
|
||||||
|
import org.elasticsearch.common.lucene.search.Queries;
|
||||||
import org.elasticsearch.common.xcontent.XContentBuilder;
|
import org.elasticsearch.common.xcontent.XContentBuilder;
|
||||||
import org.elasticsearch.common.xcontent.XContentFactory;
|
import org.elasticsearch.common.xcontent.XContentFactory;
|
||||||
import org.elasticsearch.index.get.GetResult;
|
import org.elasticsearch.index.get.GetResult;
|
||||||
import org.elasticsearch.index.mapper.MapperService;
|
import org.elasticsearch.index.mapper.MapperService;
|
||||||
|
import org.elasticsearch.index.mapper.ParseContext;
|
||||||
|
import org.elasticsearch.index.mapper.ParsedDocument;
|
||||||
|
import org.elasticsearch.index.query.BoolQueryBuilder;
|
||||||
import org.elasticsearch.plugins.Plugin;
|
import org.elasticsearch.plugins.Plugin;
|
||||||
import org.elasticsearch.test.AbstractQueryTestCase;
|
import org.elasticsearch.test.AbstractQueryTestCase;
|
||||||
import org.elasticsearch.index.query.QueryBuilder;
|
import org.elasticsearch.index.query.QueryBuilder;
|
||||||
|
@ -44,11 +56,14 @@ import org.hamcrest.Matchers;
|
||||||
import org.junit.BeforeClass;
|
import org.junit.BeforeClass;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import static org.hamcrest.Matchers.containsString;
|
import static org.hamcrest.Matchers.containsString;
|
||||||
import static org.hamcrest.Matchers.equalTo;
|
import static org.hamcrest.Matchers.equalTo;
|
||||||
|
import static org.hamcrest.Matchers.sameInstance;
|
||||||
|
|
||||||
public class PercolateQueryBuilderTests extends AbstractQueryTestCase<PercolateQueryBuilder> {
|
public class PercolateQueryBuilderTests extends AbstractQueryTestCase<PercolateQueryBuilder> {
|
||||||
|
|
||||||
|
@ -233,6 +248,27 @@ public class PercolateQueryBuilderTests extends AbstractQueryTestCase<PercolateQ
|
||||||
assertThat(e.getMessage(), equalTo("[percolate] query is missing required [document_type] parameter"));
|
assertThat(e.getMessage(), equalTo("[percolate] query is missing required [document_type] parameter"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testCreateMultiDocumentSearcher() throws Exception {
|
||||||
|
int numDocs = randomIntBetween(1, 8);
|
||||||
|
List<ParseContext.Document> docs = new ArrayList<>(numDocs);
|
||||||
|
for (int i = 0; i < numDocs; i++) {
|
||||||
|
docs.add(new ParseContext.Document());
|
||||||
|
}
|
||||||
|
|
||||||
|
Analyzer analyzer = new WhitespaceAnalyzer();
|
||||||
|
ParsedDocument parsedDocument = new ParsedDocument(null, "_id", "_type", null, -1L, -1L, docs, null, null);
|
||||||
|
IndexSearcher indexSearcher = PercolateQueryBuilder.createMultiDocumentSearcher(analyzer, parsedDocument);
|
||||||
|
assertThat(indexSearcher.getIndexReader().numDocs(), equalTo(numDocs));
|
||||||
|
|
||||||
|
// ensure that any query get modified so that the nested docs are never included as hits:
|
||||||
|
Query query = new MatchAllDocsQuery();
|
||||||
|
BooleanQuery result = (BooleanQuery) indexSearcher.createNormalizedWeight(query, true).getQuery();
|
||||||
|
assertThat(result.clauses().size(), equalTo(2));
|
||||||
|
assertThat(result.clauses().get(0).getQuery(), sameInstance(query));
|
||||||
|
assertThat(result.clauses().get(0).getOccur(), equalTo(BooleanClause.Occur.MUST));
|
||||||
|
assertThat(result.clauses().get(1).getOccur(), equalTo(BooleanClause.Occur.MUST_NOT));
|
||||||
|
}
|
||||||
|
|
||||||
private static BytesReference randomSource() {
|
private static BytesReference randomSource() {
|
||||||
try {
|
try {
|
||||||
XContentBuilder xContent = XContentFactory.jsonBuilder();
|
XContentBuilder xContent = XContentFactory.jsonBuilder();
|
||||||
|
|
|
@ -18,12 +18,18 @@
|
||||||
*/
|
*/
|
||||||
package org.elasticsearch.percolator;
|
package org.elasticsearch.percolator;
|
||||||
|
|
||||||
|
import org.apache.lucene.search.join.ScoreMode;
|
||||||
import org.elasticsearch.action.search.SearchResponse;
|
import org.elasticsearch.action.search.SearchResponse;
|
||||||
|
import org.elasticsearch.action.support.WriteRequest;
|
||||||
import org.elasticsearch.common.bytes.BytesArray;
|
import org.elasticsearch.common.bytes.BytesArray;
|
||||||
import org.elasticsearch.common.bytes.BytesReference;
|
import org.elasticsearch.common.bytes.BytesReference;
|
||||||
|
import org.elasticsearch.common.xcontent.XContentBuilder;
|
||||||
|
import org.elasticsearch.common.xcontent.XContentFactory;
|
||||||
import org.elasticsearch.index.query.MatchPhraseQueryBuilder;
|
import org.elasticsearch.index.query.MatchPhraseQueryBuilder;
|
||||||
import org.elasticsearch.index.mapper.MapperParsingException;
|
import org.elasticsearch.index.mapper.MapperParsingException;
|
||||||
import org.elasticsearch.index.query.MultiMatchQueryBuilder;
|
import org.elasticsearch.index.query.MultiMatchQueryBuilder;
|
||||||
|
import org.elasticsearch.index.query.Operator;
|
||||||
|
import org.elasticsearch.index.query.QueryBuilders;
|
||||||
import org.elasticsearch.plugins.Plugin;
|
import org.elasticsearch.plugins.Plugin;
|
||||||
import org.elasticsearch.search.highlight.HighlightBuilder;
|
import org.elasticsearch.search.highlight.HighlightBuilder;
|
||||||
import org.elasticsearch.search.sort.SortOrder;
|
import org.elasticsearch.search.sort.SortOrder;
|
||||||
|
@ -32,6 +38,7 @@ import org.elasticsearch.test.ESSingleNodeTestCase;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
|
||||||
|
import static org.elasticsearch.action.support.WriteRequest.RefreshPolicy.IMMEDIATE;
|
||||||
import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;
|
import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;
|
||||||
import static org.elasticsearch.index.query.QueryBuilders.boolQuery;
|
import static org.elasticsearch.index.query.QueryBuilders.boolQuery;
|
||||||
import static org.elasticsearch.index.query.QueryBuilders.commonTermsQuery;
|
import static org.elasticsearch.index.query.QueryBuilders.commonTermsQuery;
|
||||||
|
@ -42,6 +49,7 @@ import static org.elasticsearch.index.query.QueryBuilders.spanNearQuery;
|
||||||
import static org.elasticsearch.index.query.QueryBuilders.spanNotQuery;
|
import static org.elasticsearch.index.query.QueryBuilders.spanNotQuery;
|
||||||
import static org.elasticsearch.index.query.QueryBuilders.spanTermQuery;
|
import static org.elasticsearch.index.query.QueryBuilders.spanTermQuery;
|
||||||
import static org.elasticsearch.index.query.QueryBuilders.termQuery;
|
import static org.elasticsearch.index.query.QueryBuilders.termQuery;
|
||||||
|
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertAcked;
|
||||||
import static org.hamcrest.Matchers.equalTo;
|
import static org.hamcrest.Matchers.equalTo;
|
||||||
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertHitCount;
|
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertHitCount;
|
||||||
import static org.hamcrest.Matchers.instanceOf;
|
import static org.hamcrest.Matchers.instanceOf;
|
||||||
|
@ -382,4 +390,53 @@ public class PercolatorQuerySearchIT extends ESSingleNodeTestCase {
|
||||||
assertThat(e.getCause().getMessage(), equalTo("a document can only contain one percolator query"));
|
assertThat(e.getCause().getMessage(), equalTo("a document can only contain one percolator query"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testPercolateQueryWithNestedDocuments() throws Exception {
|
||||||
|
XContentBuilder mapping = XContentFactory.jsonBuilder();
|
||||||
|
mapping.startObject().startObject("properties").startObject("companyname").field("type", "text").endObject()
|
||||||
|
.startObject("employee").field("type", "nested").startObject("properties")
|
||||||
|
.startObject("name").field("type", "text").endObject().endObject().endObject().endObject()
|
||||||
|
.endObject();
|
||||||
|
createIndex("test", client().admin().indices().prepareCreate("test")
|
||||||
|
.addMapping("employee", mapping)
|
||||||
|
.addMapping("queries", "query", "type=percolator")
|
||||||
|
);
|
||||||
|
client().prepareIndex("test", "queries", "q").setSource(jsonBuilder().startObject()
|
||||||
|
.field("query", QueryBuilders.nestedQuery("employee",
|
||||||
|
QueryBuilders.matchQuery("employee.name", "virginia potts").operator(Operator.AND), ScoreMode.Avg)
|
||||||
|
).endObject())
|
||||||
|
.setRefreshPolicy(IMMEDIATE)
|
||||||
|
.get();
|
||||||
|
|
||||||
|
SearchResponse response = client().prepareSearch()
|
||||||
|
.setQuery(new PercolateQueryBuilder("query", "employee",
|
||||||
|
XContentFactory.jsonBuilder()
|
||||||
|
.startObject().field("companyname", "stark")
|
||||||
|
.startArray("employee")
|
||||||
|
.startObject().field("name", "virginia potts").endObject()
|
||||||
|
.startObject().field("name", "tony stark").endObject()
|
||||||
|
.endArray()
|
||||||
|
.endObject().bytes()))
|
||||||
|
.get();
|
||||||
|
assertHitCount(response, 1);
|
||||||
|
assertThat(response.getHits().getAt(0).getId(), equalTo("q"));
|
||||||
|
|
||||||
|
response = client().prepareSearch()
|
||||||
|
.setQuery(new PercolateQueryBuilder("query", "employee",
|
||||||
|
XContentFactory.jsonBuilder()
|
||||||
|
.startObject().field("companyname", "notstark")
|
||||||
|
.startArray("employee")
|
||||||
|
.startObject().field("name", "virginia stark").endObject()
|
||||||
|
.startObject().field("name", "tony stark").endObject()
|
||||||
|
.endArray()
|
||||||
|
.endObject().bytes()))
|
||||||
|
.get();
|
||||||
|
assertHitCount(response, 0);
|
||||||
|
|
||||||
|
response = client().prepareSearch()
|
||||||
|
.setQuery(new PercolateQueryBuilder("query", "employee",
|
||||||
|
XContentFactory.jsonBuilder().startObject().field("companyname", "notstark").endObject().bytes()))
|
||||||
|
.get();
|
||||||
|
assertHitCount(response, 0);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue