IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> C#使用Elasticsearch(NEST) -> 正文阅读

[大数据]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的数据了

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-04-01 00:08:39  更:2022-04-01 00:08:44 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 5:23:53-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码