Example usage for org.apache.lucene.analysis.payloads PayloadEncoder encode

List of usage examples for org.apache.lucene.analysis.payloads PayloadEncoder encode

Introduction

In this page you can find the example usage for org.apache.lucene.analysis.payloads PayloadEncoder encode.

Prototype

BytesRef encode(char[] buffer);

Source Link

Usage

From source file:org.apache.solr.search.PayloadCheckQParserPlugin.java

License:Apache License

@Override
public QParser createParser(String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req) {

    return new QParser(qstr, localParams, params, req) {
        @Override/*from   w  w w .  j a  v  a 2 s.c  o  m*/
        public Query parse() throws SyntaxError {
            String field = localParams.get(QueryParsing.F);
            String value = localParams.get(QueryParsing.V);
            String p = localParams.get("payloads");

            if (field == null) {
                throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "'f' not specified");
            }

            if (value == null) {
                throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "query string missing");
            }

            if (p == null) {
                throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "'payloads' not specified");
            }

            FieldType ft = req.getCore().getLatestSchema().getFieldType(field);
            Analyzer analyzer = ft.getQueryAnalyzer();
            SpanQuery query = null;
            try {
                query = PayloadUtils.createSpanQuery(field, value, analyzer);
            } catch (IOException e) {
                throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, e);
            }

            if (query == null) {
                throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "SpanQuery is null");
            }

            PayloadEncoder encoder = null;
            String e = PayloadUtils.getPayloadEncoder(ft);
            if ("float".equals(e)) { // TODO: centralize this string->PayloadEncoder logic (see DelimitedPayloadTokenFilterFactory)
                encoder = new FloatEncoder();
            } else if ("integer".equals(e)) {
                encoder = new IntegerEncoder();
            } else if ("identity".equals(e)) {
                encoder = new IdentityEncoder();
            }

            if (encoder == null) {
                throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,
                        "invalid encoder: " + e + " for field: " + field);
            }

            List<BytesRef> payloads = new ArrayList<>();
            String[] rawPayloads = p.split(" "); // since payloads (most likely) came in whitespace delimited, just split
            for (String rawPayload : rawPayloads) {
                if (rawPayload.length() > 0)
                    payloads.add(encoder.encode(rawPayload.toCharArray()));
            }

            return new SpanPayloadCheckQuery(query, payloads);
        }
    };

}