Search in sources :

Example 1 with Coordinate

use of com.xiaomi.linden.thrift.common.Coordinate in project linden by XiaoMi.

the class LindenDocParser method parse.

public static Document parse(LindenDocument lindenDoc, LindenConfig config) {
    if (!lindenDoc.isSetFields()) {
        return null;
    }
    Document doc = new Document();
    doc.add(new StringField(config.getSchema().getId(), lindenDoc.getId(), Field.Store.YES));
    for (LindenField field : lindenDoc.getFields()) {
        LindenFieldSchema schema = field.getSchema();
        Field.Store isStored = schema.isStored() ? Field.Store.YES : Field.Store.NO;
        String name = field.getSchema().getName();
        Object value;
        if (!schema.isIndexed() && schema.isStored()) {
            doc.add(new Field(name, field.getValue(), STORED_ONLY));
        }
        switch(schema.getType()) {
            case INTEGER:
                value = Integer.valueOf(field.getValue());
                if (schema.isIndexed()) {
                    doc.add(new IntField(name, (Integer) value, isStored));
                }
                if (schema.isDocValues()) {
                    long docValuesBits = ((Integer) value).longValue();
                    doc.add(new NumericDocValuesField(name, docValuesBits));
                }
                break;
            case LONG:
                value = Long.valueOf(field.getValue());
                if (schema.isIndexed()) {
                    doc.add(new LongField(name, (Long) value, isStored));
                }
                if (schema.isDocValues()) {
                    doc.add(new NumericDocValuesField(name, (long) value));
                }
                break;
            case DOUBLE:
                value = Double.valueOf(field.getValue());
                if (schema.isIndexed()) {
                    doc.add(new DoubleField(name, (Double) value, isStored));
                }
                if (schema.isDocValues()) {
                    long docValuesBits = Double.doubleToLongBits((Double) value);
                    doc.add(new NumericDocValuesField(name, docValuesBits));
                }
                break;
            case FLOAT:
                value = Float.valueOf(field.getValue());
                if (schema.isIndexed()) {
                    doc.add(new FloatField(name, (Float) value, isStored));
                }
                if (schema.isDocValues()) {
                    long docValuesBits = Float.floatToIntBits((Float) value);
                    doc.add(new NumericDocValuesField(name, docValuesBits));
                }
                break;
            case STRING:
                if (Strings.isNullOrEmpty(field.getValue())) {
                    break;
                }
                if (schema.isIndexed()) {
                    FieldType type = new FieldType();
                    type.setTokenized(schema.isTokenized());
                    type.setIndexed(schema.isIndexed());
                    type.setStored(schema.isStored());
                    type.setOmitNorms(schema.isOmitNorms());
                    if (schema.isSnippet()) {
                        type.setIndexOptions(FieldInfo.IndexOptions.DOCS_AND_FREQS_AND_POSITIONS_AND_OFFSETS);
                        // snippet will use the stored info.
                        type.setStored(true);
                    }
                    if (schema.isOmitFreqs()) {
                        type.setIndexOptions(FieldInfo.IndexOptions.DOCS_ONLY);
                    }
                    doc.add(new Field(name, field.getValue(), type));
                }
                if (schema.isDocValues()) {
                    BytesRef bytes = new BytesRef(field.getValue());
                    doc.add(new BinaryDocValuesField(name, bytes));
                }
                break;
            case FACET:
                String[] facetPath = field.getValue().split("/");
                doc.add(new FacetField(name, facetPath));
                if (schema.isIndexed()) {
                    doc.add(new StringField(name, field.getValue(), isStored));
                }
                if (schema.isDocValues()) {
                    doc.add(new BinaryDocValuesField(name, new BytesRef(field.getValue())));
                }
                break;
            default:
        }
    }
    if (lindenDoc.isSetCoordinate()) {
        Coordinate coord = lindenDoc.getCoordinate();
        Shape shape = SpatialContext.GEO.makePoint(coord.getLongitude(), coord.getLatitude());
        for (IndexableField field : config.getSpatialStrategy().createIndexableFields(shape)) {
            doc.add(field);
        }
    }
    return doc;
}
Also used : Shape(com.spatial4j.core.shape.Shape) FacetField(org.apache.lucene.facet.FacetField) IntField(org.apache.lucene.document.IntField) LindenDocument(com.xiaomi.linden.thrift.common.LindenDocument) Document(org.apache.lucene.document.Document) FloatField(org.apache.lucene.document.FloatField) LindenFieldSchema(com.xiaomi.linden.thrift.common.LindenFieldSchema) NumericDocValuesField(org.apache.lucene.document.NumericDocValuesField) FacetField(org.apache.lucene.facet.FacetField) LongField(org.apache.lucene.document.LongField) StringField(org.apache.lucene.document.StringField) IndexableField(org.apache.lucene.index.IndexableField) BinaryDocValuesField(org.apache.lucene.document.BinaryDocValuesField) DoubleField(org.apache.lucene.document.DoubleField) Field(org.apache.lucene.document.Field) LindenField(com.xiaomi.linden.thrift.common.LindenField) IntField(org.apache.lucene.document.IntField) FloatField(org.apache.lucene.document.FloatField) LongField(org.apache.lucene.document.LongField) NumericDocValuesField(org.apache.lucene.document.NumericDocValuesField) DoubleField(org.apache.lucene.document.DoubleField) BytesRef(org.apache.lucene.util.BytesRef) LindenField(com.xiaomi.linden.thrift.common.LindenField) BinaryDocValuesField(org.apache.lucene.document.BinaryDocValuesField) FieldType(org.apache.lucene.document.FieldType) IndexableField(org.apache.lucene.index.IndexableField) Coordinate(com.xiaomi.linden.thrift.common.Coordinate) StringField(org.apache.lucene.document.StringField)

Example 2 with Coordinate

use of com.xiaomi.linden.thrift.common.Coordinate in project linden by XiaoMi.

the class LindenDocumentBuilder method build.

public static LindenDocument build(LindenSchema schema, JSONObject json) throws IOException {
    LindenDocument document = new LindenDocument();
    if (json.containsKey(schema.getId())) {
        document.setId(json.getString(schema.getId()));
    } else {
        throw new IOException(json.toJSONString() + " does not has id [" + schema.getId() + "]");
    }
    for (LindenFieldSchema fieldSchema : schema.getFields()) {
        Object value = json.get(fieldSchema.getName());
        if (value == null) {
            continue;
        }
        if (fieldSchema.isMulti()) {
            if (!(value instanceof JSONArray)) {
                throw new IOException("Multi value field " + fieldSchema.getName() + " must be in JSONArray format");
            }
            for (Object element : (JSONArray) value) {
                LindenField field = new LindenField().setSchema(fieldSchema).setValue(element.toString());
                document.addToFields(field);
            }
            LindenFieldSchema multiValueFieldSchema = new LindenFieldSchema(fieldSchema.getName(), LindenType.STRING);
            // both multi and docValues are true is forbidden in user defined schema.
            // this can only happen in multi-value source field, which is used for source data and score model
            multiValueFieldSchema.setMulti(true).setDocValues(true);
            LindenField multiValueField = new LindenField().setSchema(multiValueFieldSchema).setValue(value.toString());
            document.addToFields(multiValueField);
        } else {
            LindenField field = new LindenField().setSchema(fieldSchema).setValue(value.toString());
            document.addToFields(field);
        }
    }
    JSONArray dynamicFields = json.getJSONArray(LindenSchemaConf.DYNAMICS);
    if (dynamicFields != null) {
        for (Object element : dynamicFields) {
            JSONObject jsonElement = (JSONObject) element;
            document.addToFields(buildDynamicField(jsonElement));
        }
    }
    if (json.containsKey(LindenSchemaConf.LATITUDE) && json.containsKey(LindenSchemaConf.LONGITUDE)) {
        document.setCoordinate(new Coordinate().setLongitude(json.getDouble(LindenSchemaConf.LONGITUDE)).setLatitude(json.getDouble(LindenSchemaConf.LATITUDE)));
    }
    return document;
}
Also used : LindenFieldSchema(com.xiaomi.linden.thrift.common.LindenFieldSchema) JSONObject(com.alibaba.fastjson.JSONObject) Coordinate(com.xiaomi.linden.thrift.common.Coordinate) JSONArray(com.alibaba.fastjson.JSONArray) LindenField(com.xiaomi.linden.thrift.common.LindenField) JSONObject(com.alibaba.fastjson.JSONObject) IOException(java.io.IOException) LindenDocument(com.xiaomi.linden.thrift.common.LindenDocument)

Aggregations

Coordinate (com.xiaomi.linden.thrift.common.Coordinate)2 LindenDocument (com.xiaomi.linden.thrift.common.LindenDocument)2 LindenField (com.xiaomi.linden.thrift.common.LindenField)2 LindenFieldSchema (com.xiaomi.linden.thrift.common.LindenFieldSchema)2 JSONArray (com.alibaba.fastjson.JSONArray)1 JSONObject (com.alibaba.fastjson.JSONObject)1 Shape (com.spatial4j.core.shape.Shape)1 IOException (java.io.IOException)1 BinaryDocValuesField (org.apache.lucene.document.BinaryDocValuesField)1 Document (org.apache.lucene.document.Document)1 DoubleField (org.apache.lucene.document.DoubleField)1 Field (org.apache.lucene.document.Field)1 FieldType (org.apache.lucene.document.FieldType)1 FloatField (org.apache.lucene.document.FloatField)1 IntField (org.apache.lucene.document.IntField)1 LongField (org.apache.lucene.document.LongField)1 NumericDocValuesField (org.apache.lucene.document.NumericDocValuesField)1 StringField (org.apache.lucene.document.StringField)1 FacetField (org.apache.lucene.facet.FacetField)1 IndexableField (org.apache.lucene.index.IndexableField)1