Hi all,

We're trying to figure out how to access fields from within a native 
AbstractSearchScript when it's called from a percolate request that 
contains the document to percolate.
We tried to use source mechanism and stored fields to no avail (no errors, 
but no matches). 
The same scripts are working fine for classic searches.

This was tried with Elasticsearch release 1.1.1 and a snapshot of 2.0.0.

We're running out of ideas, any help would be really appreciated
Thanks!


curl -XPOST http://localhost:9200/index1
curl -XPOST http://localhost:9200/index1/mytype/_mapping -d '{
  "properties": {
    "source_field": { "type": "string" },
    "stored_field": { "type": "string", "stored": true }
  }
}'

curl -XPUT "http://localhost:9200/index1/.percolator/1"; -d '{
  "query": {
    "filtered": {
      "query" : { "match_all" : {}},
      "filter": {
    "script": {
      "script": "cooccurenceScript",
      "params": {
        "map": { "list" : [ "a" ] }
      },
      "lang": "native"
    }
      }
    }
  }
}'

curl -XPUT "http://localhost:9200/index1/.percolator/2"; -d '{
  "query": {
    "filtered": {
      "query" : { "match_all" : {}},
      "filter": {
    "script": {
      "script": "cooccurenceStoredScript",
      "params": {
        "map": { "list" : [ "a" ] }
      },
      "lang": "native"
    }
      }
    }
  }
}'

Native scripts:
package test;

import java.util.Map;
import org.elasticsearch.common.Nullable;
import org.elasticsearch.common.component.AbstractComponent;
import org.elasticsearch.common.inject.Inject;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.node.Node;
import org.elasticsearch.script.ExecutableScript;
import org.elasticsearch.script.NativeScriptFactory;


public class CooccurenceScriptFactory extends AbstractComponent implements 
NativeScriptFactory{

    private final Node node;

    @SuppressWarnings("unchecked")
    @Inject
    public CooccurenceScriptFactory(Node node, Settings settings) {
        super(settings);
        this.node = node;
    }

    @Override public ExecutableScript newScript (@Nullable 
Map<String,Object> params){
        return new CooccurenceScript(node.client(), logger, params);
      }
}

package test;

import org.elasticsearch.ElasticsearchIllegalArgumentException;
import org.elasticsearch.client.Client;
import org.elasticsearch.common.Nullable;
import org.elasticsearch.common.logging.ESLogger;
import org.elasticsearch.common.xcontent.support.XContentMapValues;
import org.elasticsearch.script.AbstractSearchScript;
import org.elasticsearch.search.lookup.SourceLookup;

import java.util.List;
import java.util.Map;


public class CooccurenceScript extends AbstractSearchScript {

    private List<String> list = null;

    @SuppressWarnings("unchecked")
    public CooccurenceScript(Client client, ESLogger logger, @Nullable 
Map<String,Object> params) {
        Map<String, Object> map = params == null ? null : 
XContentMapValues.nodeMapValue(params.get("map"), null);
        if (map == null) {
            throw new ElasticsearchIllegalArgumentException("Missing the 
map parameter");
        }
        list = (List<String>) map.get("list");
        if (list == null || list.isEmpty()) {
            throw new ElasticsearchIllegalArgumentException("Missing the 
list parameter or list is empty");
        }
    }

    @Override
    public java.lang.Object run() {
        SourceLookup source = source();
        @SuppressWarnings("unchecked")
        List<Object> values = (List<Object>) source.get("source_field");
        if (values == null || values.isEmpty()) {
            return false;
        }
        for (Object localValue : values) {
            boolean result = true;
            for (String s : list) {
                result &= ((String) localValue).contains(s);
            }
            if (result) {
                return true;
            }
        }
        return false;
    }

}

package test;

import org.elasticsearch.common.Nullable;
import org.elasticsearch.common.component.AbstractComponent;
import org.elasticsearch.common.inject.Inject;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.node.Node;
import org.elasticsearch.script.ExecutableScript;
import org.elasticsearch.script.NativeScriptFactory;

import java.util.Map;


public class CooccurenceStoredScriptFactory extends AbstractComponent 
implements NativeScriptFactory{

    private final Node node;

    @SuppressWarnings("unchecked")
    @Inject
    public CooccurenceStoredScriptFactory(Node node, Settings settings) {
        super(settings);
        this.node = node;
    }

    @Override public ExecutableScript newScript (@Nullable 
Map<String,Object> params){
        return new CooccurenceStoredScript(node.client(), logger, params);
      }
}

package test;

import org.elasticsearch.ElasticsearchIllegalArgumentException;
import org.elasticsearch.client.Client;
import org.elasticsearch.common.Nullable;
import org.elasticsearch.common.logging.ESLogger;
import org.elasticsearch.common.xcontent.support.XContentMapValues;
import org.elasticsearch.script.AbstractSearchScript;
import org.elasticsearch.search.lookup.FieldLookup;
import org.elasticsearch.search.lookup.FieldsLookup;

import java.util.List;
import java.util.Map;


public class CooccurenceStoredScript extends AbstractSearchScript {

    private List<String> list = null;

    @SuppressWarnings("unchecked")
    public CooccurenceStoredScript(Client client, ESLogger logger, 
@Nullable Map<String,Object> params){
        Map<String, Object> map = params == null ? null : 
XContentMapValues.nodeMapValue(params.get("map"), null);
        if (map == null) {
            throw new ElasticsearchIllegalArgumentException("Missing the 
map parameter");
        }
        list = (List<String>) map.get("list");
        if (list == null || list.isEmpty()) {
            throw new ElasticsearchIllegalArgumentException("Missing the 
list parameter or list is empty");
        }
    }

    @Override
    public java.lang.Object run() {
        FieldsLookup fields = fields();

        if (fields == null || !fields.containsKey("stored_field")) {
            return false;
        }
        FieldLookup field = ((FieldLookup) fields.get("stored_field"));
        if (field == null) {
            return false;
        }
        List<Object> values = field.getValues();
        if (values == null) {
            return false;
        }
        for (Object localValue : values) {
            boolean result = true;
            for (String s : list) {
                result &= ((String) localValue).contains(s);
            }
            if (result) {
                return true;
            }
        }
        return false;
    }
}

-- 
You received this message because you are subscribed to the Google Groups 
"elasticsearch" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to elasticsearch+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/elasticsearch/74601541-b3af-4a07-a4f8-d70a370aadab%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to