Exemplo n.º 1
0
        private async Task <string> InitProcessor(string indexName)
        {
            indexName = "gdst_" + indexName.ToLower();

            _documentCount = (await _solrOperation.QueryAsync(SolrQuery.All, new QueryOptions()
            {
                StartOrCursor = new StartOrCursor.Start(0),
                Rows = 1
            })).NumFound;

            _logger.LogInformation($"{indexName} NumFound :{_documentCount}");

            var response = await _elasticClient.Indices.ExistsAsync(index : indexName.ToLower());

            var solrSchema = await _solrOperation.GetSchemaAsync("schema.xml");

            var filedTypes = solrSchema.SolrFields.Select(f => f.Type.Name).Distinct();

            _logger.LogInformation($"total fields: {solrSchema.SolrFields.Count} Types: {string.Join(",", filedTypes)}");

            if (!response.Exists)
            {
                var indexSettings = new IndexSettings()
                {
                    NumberOfReplicas = 0
                };
                var properties = new Properties();

                solrSchema.SolrFields.ForEach(sf =>
                {
                    switch (sf.Type.Name)
                    {
                    case "int":
                        properties.Add(sf.Name, new NumberProperty(NumberType.Integer));
                        break;

                    case "double":
                        properties.Add(sf.Name, new NumberProperty(NumberType.Double));
                        break;

                    case "float":
                        properties.Add(sf.Name, new NumberProperty(NumberType.Float));
                        break;

                    case "string":
                        properties.Add(sf.Name, new KeywordProperty());
                        break;

                    case "date":
                        properties.Add(sf.Name, new DateProperty());
                        break;

                    case "location_rpt":
                        if (sf.Name == "GEO")
                        {
                            properties.Add(sf.Name, new GeoShapeProperty());
                        }
                        else
                        {
                            properties.Add(sf.Name, new GeoPointProperty());
                        }

                        break;

                    default:
                        properties.Add(sf.Name, new TextProperty());
                        break;
                    }
                });

                var typeMappings = new TypeMapping()
                {
                    Properties = properties
                };

                _elasticClient.Indices.Create(indexName, p =>
                                              p.InitializeUsing(new IndexState()
                {
                    Settings = indexSettings,
                    Mappings = typeMappings
                }));
            }

            return(indexName);
        }