|
@@ -34,6 +34,7 @@ import org.elasticsearch.common.io.stream.StreamInput;
|
|
|
import org.elasticsearch.common.io.stream.StreamOutput;
|
|
import org.elasticsearch.common.io.stream.StreamOutput;
|
|
|
import org.elasticsearch.common.xcontent.XContentBuilder;
|
|
import org.elasticsearch.common.xcontent.XContentBuilder;
|
|
|
import org.elasticsearch.common.xcontent.XContentParser;
|
|
import org.elasticsearch.common.xcontent.XContentParser;
|
|
|
|
|
+import org.elasticsearch.script.FilterScript;
|
|
|
import org.elasticsearch.script.Script;
|
|
import org.elasticsearch.script.Script;
|
|
|
import org.elasticsearch.script.SearchScript;
|
|
import org.elasticsearch.script.SearchScript;
|
|
|
|
|
|
|
@@ -126,25 +127,25 @@ public class ScriptQueryBuilder extends AbstractQueryBuilder<ScriptQueryBuilder>
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
|
protected Query doToQuery(QueryShardContext context) throws IOException {
|
|
protected Query doToQuery(QueryShardContext context) throws IOException {
|
|
|
- SearchScript.Factory factory = context.getScriptService().compile(script, SearchScript.CONTEXT);
|
|
|
|
|
- SearchScript.LeafFactory searchScript = factory.newFactory(script.getParams(), context.lookup());
|
|
|
|
|
- return new ScriptQuery(script, searchScript);
|
|
|
|
|
|
|
+ FilterScript.Factory factory = context.getScriptService().compile(script, FilterScript.CONTEXT);
|
|
|
|
|
+ FilterScript.LeafFactory filterScript = factory.newFactory(script.getParams(), context.lookup());
|
|
|
|
|
+ return new ScriptQuery(script, filterScript);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
static class ScriptQuery extends Query {
|
|
static class ScriptQuery extends Query {
|
|
|
|
|
|
|
|
final Script script;
|
|
final Script script;
|
|
|
- final SearchScript.LeafFactory searchScript;
|
|
|
|
|
|
|
+ final FilterScript.LeafFactory filterScript;
|
|
|
|
|
|
|
|
- ScriptQuery(Script script, SearchScript.LeafFactory searchScript) {
|
|
|
|
|
|
|
+ ScriptQuery(Script script, FilterScript.LeafFactory filterScript) {
|
|
|
this.script = script;
|
|
this.script = script;
|
|
|
- this.searchScript = searchScript;
|
|
|
|
|
|
|
+ this.filterScript = filterScript;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
|
public String toString(String field) {
|
|
public String toString(String field) {
|
|
|
StringBuilder buffer = new StringBuilder();
|
|
StringBuilder buffer = new StringBuilder();
|
|
|
- buffer.append("ScriptFilter(");
|
|
|
|
|
|
|
+ buffer.append("ScriptQuery(");
|
|
|
buffer.append(script);
|
|
buffer.append(script);
|
|
|
buffer.append(")");
|
|
buffer.append(")");
|
|
|
return buffer.toString();
|
|
return buffer.toString();
|
|
@@ -178,23 +179,13 @@ public class ScriptQueryBuilder extends AbstractQueryBuilder<ScriptQueryBuilder>
|
|
|
@Override
|
|
@Override
|
|
|
public Scorer scorer(LeafReaderContext context) throws IOException {
|
|
public Scorer scorer(LeafReaderContext context) throws IOException {
|
|
|
DocIdSetIterator approximation = DocIdSetIterator.all(context.reader().maxDoc());
|
|
DocIdSetIterator approximation = DocIdSetIterator.all(context.reader().maxDoc());
|
|
|
- final SearchScript leafScript = searchScript.newInstance(context);
|
|
|
|
|
|
|
+ final FilterScript leafScript = filterScript.newInstance(context);
|
|
|
TwoPhaseIterator twoPhase = new TwoPhaseIterator(approximation) {
|
|
TwoPhaseIterator twoPhase = new TwoPhaseIterator(approximation) {
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
|
public boolean matches() throws IOException {
|
|
public boolean matches() throws IOException {
|
|
|
leafScript.setDocument(approximation.docID());
|
|
leafScript.setDocument(approximation.docID());
|
|
|
- Object val = leafScript.run();
|
|
|
|
|
- if (val == null) {
|
|
|
|
|
- return false;
|
|
|
|
|
- }
|
|
|
|
|
- if (val instanceof Boolean) {
|
|
|
|
|
- return (Boolean) val;
|
|
|
|
|
- }
|
|
|
|
|
- if (val instanceof Number) {
|
|
|
|
|
- return ((Number) val).longValue() != 0;
|
|
|
|
|
- }
|
|
|
|
|
- throw new IllegalArgumentException("Can't handle type [" + val + "] in script filter");
|
|
|
|
|
|
|
+ return leafScript.execute();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|