• C#使用Elasticsearch(NEST)


    本文介绍C#使用Elasticsearch的基本方法,并提供一个demo
    以下说明中包含的http调用,为ElasticsearchTestController中编写的测试方法

    初始化

    引用NEST
    创建ElasticClient对象

    ElasticClient elasticClient = new ElasticClient(new ConnectionSettings(new Uri(address));
    

    新增索引

    关键代码

    CreateIndexResponse createIndexResponse = await elasticClient.Indices.CreateAsync(indexName, createIndexDescriptor =>
    {
        return createIndexDescriptor.
            Map(typeMappingDescriptor =>
            {
                return typeMappingDescriptor.Properties(propertiesSelector =>
                {
                    foreach (PropertyInfo propertyInfo in typeof(StudentForElasticsearch).GetProperties())
                    {
                        if (!propertyInfo.CanWrite)
                            continue;
    
                        switch (propertyInfo.PropertyType.Name)
                        {
                            case nameof(Int16):
                            case nameof(Int32):
                            case nameof(Int64):
                            case nameof(UInt16):
                            case nameof(UInt32):
                            case nameof(UInt64):
                            case nameof(Decimal):
                            case nameof(Single):
                            case nameof(Double):
                            case nameof(Byte):
                                propertiesSelector = propertiesSelector.Number(propertyDescriptor => propertyDescriptor.Name(ToJavaScriptPropertyName(propertyInfo.Name)));
                                break;
    
                            case nameof(Boolean):
                                propertiesSelector = propertiesSelector.Boolean(propertyDescriptor => propertyDescriptor.Name(ToJavaScriptPropertyName(propertyInfo.Name)));
                                break;
    
                            case nameof(DateTime):
                                propertiesSelector = propertiesSelector.Date(propertyDescriptor => propertyDescriptor.Name(ToJavaScriptPropertyName(propertyInfo.Name)));
                                break;
    
                            case nameof(String):
                                propertiesSelector = propertiesSelector.Keyword(propertyDescriptor => propertyDescriptor.Name(ToJavaScriptPropertyName(propertyInfo.Name)));
                                break;
    
                            default:
                                break;
                        }
                    }
    
                    return propertiesSelector;
                });
            });
    });
    

    为索引添加别名

    PutAliasResponse putAliasResponse = await elasticClient.Indices.PutAliasAsync(indexName, indexAliasName);
    

    调用http://localhost:5000/api/ElasticsearchTest/CreateIndex?indexName=stu&indexAliasName=stuAliasName创建索引

    查询索引结构

    GET
    http://xxxxxxx:9200/stu/_mapping 
    返回结果   
    {
        "stu": {
            "mappings": {
                "properties": {
                    "email": {
                        "type": "keyword"
                    },
                    "id": {
                        "type": "float"
                    },
                    "name": {
                        "type": "keyword"
                    }
                }
            }
        }
    }
    

    新增数据

    关键代码

    BulkResponse bulkResponse = await elasticClient.BulkAsync(bulkDescriptor =>
    {
        foreach (StudentForElasticsearch document in datas)
        {
            bulkDescriptor = bulkDescriptor.Index<StudentForElasticsearch>(bulkIndexDescriptor =>
            {
                return bulkIndexDescriptor.Index(indexAliasName).Id(document.Id).Document(document);
            });
        }
    
        return bulkDescriptor;
    });
    

    调用http://localhost:5000/api/ElasticsearchTest/AddOrUpdateData?indexAliasName=stuAliasName新增数据

    此时查询数据

    GET
    http://xxxxxxx:9200/stu/_search
    {
        "from": 0,
        "size": 1000
    }
    返回结果
    {
        "took": 33,
        "timed_out": false,
        "_shards": {
            "total": 1,
            "successful": 1,
            "skipped": 0,
            "failed": 0
        },
        "hits": {
            "total": {
                "value": 2,
                "relation": "eq"
            },
            "max_score": 1.0,
            "hits": [
                {
                    "_index": "stu",
                    "_type": "_doc",
                    "_id": "1",
                    "_score": 1.0,
                    "_source": {
                        "id": 1,
                        "name": "Student1",
                        "email": "11111@qq.com"
                    }
                },
                {
                    "_index": "stu",
                    "_type": "_doc",
                    "_id": "2",
                    "_score": 1.0,
                    "_source": {
                        "id": 2,
                        "name": "Student2",
                        "email": "2222@qq.com"
                    }
                }
            ]
        }
    }
    

    查询

    关键代码

    ISearchResponse<StudentForElasticsearch> searchResponse = await elasticClient.SearchAsync<StudentForElasticsearch>(searchDescriptor =>
    {
        return searchDescriptor.Index(indexAliasName).Query(queryContainerDescriptor =>
        {
            return queryContainerDescriptor.Bool(boolQueryDescriptor =>
            {
                if (!string.IsNullOrEmpty(name))
                {
                    IList<Func<QueryContainerDescriptor<StudentForElasticsearch>, QueryContainer>> queryContainers = new List<Func<QueryContainerDescriptor<StudentForElasticsearch>, QueryContainer>>();
    
                    queryContainers.Add(queryContainerDescriptor =>
                    {
                        return queryContainerDescriptor.Wildcard(c => c
                                .Field(ToJavaScriptPropertyName(nameof(StudentForElasticsearch.Name))).Value($"{name}*"));
                    });
                    boolQueryDescriptor.Must(x => x.Bool(b => b.Should(queryContainers)));
                }
                
                return boolQueryDescriptor;
            });
        })
        .From(0).Size(10);
    });
    

    这里采用Wildcard查询,并且只查询前10个匹配数据
    调用http://localhost:5000/api/ElasticsearchTest/Get?indexAliasName=stuAliasName&name=Student2
    返回结果

    [{"id":2,"name":"Student2","email":"2222@qq.com"}]
    

    删除数据

    关键代码

    BulkResponse bulkResponse = await elasticClient.BulkAsync(bulkDescriptor =>
    {
        foreach (int id in deleteIds)
        {
            bulkDescriptor = bulkDescriptor.Delete<StudentForElasticsearch>(bulkIndexDescriptor =>
            {
                return bulkIndexDescriptor.Index(indexAliasName).Id(id);
            });
        }
    
        return bulkDescriptor;
    });
    

    调用http://localhost:5000/api/ElasticsearchTest/DeleteData?indexAliasName=stuAliasName
    此时再查询数据,只剩下id为2的数据了

  • 相关阅读:
    可编辑多行列表框
    NullableComboBox
    灵活的组合框和编辑控件
    EmrColorComboBox
    Java 中基本类型和字符串之间的转换
    Java 中基本类型和字符串之间的转换
    数据结构实验之排序七:选课名单
    数据结构实验之排序七:选课名单
    数据结构实验之排序四:寻找大富翁
    数据结构实验之排序四:寻找大富翁
  • 原文地址:https://www.cnblogs.com/Lulus/p/16077521.html
Copyright © 2020-2023  润新知