Elasticsearch(二)【Elasticsearch.Net基本使用】

低级客户端ElasticLowLevelClient是一个低级的,无依赖的客户端,对如何构建和表示您的请求和响应没有意见。

它可以从Visual Studio中的包管理器控制台安装使用

Install-Package Elasticsearch.Net

连接

要连接到本地运行在http://localhost:9200上的Elasticsearch就像实例化客户端的一个新实例一样简单

var lowlevelClient = new ElasticLowLevelClient();

通常,您可能需要将其他配置选项传递给客户端,例如Elasticsearch的地址,如果它在远程计算机上运行。 这是ConnectionConfiguration来的地方 可以实例化一个实例来为客户端提供不同的配置值。

var settings = new ConnectionConfiguration(new Uri("http://example.com:9200")).RequestTimeout(TimeSpan.FromMinutes(2));

var lowlevelClient = new ElasticLowLevelClient(settings);

在此示例中,还指定了将应用于所有请求的默认请求超时,以确定客户端应取消请求多长时间。 ConnectionConfiguration上还有许多其他配置选项来控制诸如

  • 所有请求发送的基本身份验证头
  • 客户端是否应通过代理连接
  • 是否应该在客户端上启用HTTP压缩支持

连接池

ConnectionConfiguration不限于传递Elasticsearch的单个地址。 有几种不同类型的连接池可用,每种具有不同的特性,可用于配置客户端。 以下示例使用与群集中的三个Elasticsearch节点的地址对接的SniffingConnectionPool,并且客户端将使用此类型的池来维护可以以循环方式发送请求的群集中的可用节点列表。

var uris = new[]
{
    new Uri("http://localhost:9200"),
    new Uri("http://localhost:9201"),
    new Uri("http://localhost:9202"),
};

var connectionPool = new SniffingConnectionPool(uris);
var settings = new ConnectionConfiguration(connectionPool);

var lowlevelClient = new ElasticLowLevelClient(settings);

索引

一旦客户端被配置为连接到Elasticsearch,我们需要获得一些数据到集群中来处理。 想象一下,我们有以下普通CLR对象(POCO)

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

同步或异步地索引该POCO的单个实例是简单的

var person = new Person
{
    FirstName = "Martijn",
    LastName = "Laarman"
};

var indexResponse = lowlevelClient.Index<byte[]>("people", "person", "1", person); 
byte[] responseBytes = indexResponse.Body;

var asyncIndexResponse = await lowlevelClient.IndexAsync<string>("people", "person", "1", person); 
string responseString = asyncIndexResponse.Body;

Elasticsearch.Net中的所有可用方法都显示为同步和异步版本,后者使用方法名称的惯用* Async后缀。

两个索引请求将索引文档到端点/people/person/1

匿名类型也可以用于表示要索引的文档

var person = new
{
    FirstName = "Martijn",
    LastName = "Laarman"
};

var indexResponse = await lowlevelClient.IndexAsync<Stream>("people", "person", "1", person);
Stream responseStream = indexResponse.Body;

如果返回一个Stream,一定要正确处理它,当你完成它。

无论您使用类的实例,匿名类型,字符串等,都将隐式转换为该方法接受的PostData<T>实例。 查看有关Post Data的文档,以查看其他支持的类型。

该方法上的泛型类型参数指定响应体的类型。 在最后一个例子中,我们返回来自Elasticsearch的响应流,进行任何反序列化。


批量索引

如果您需要索引许多文档,Elasticsearch有一个Bulk API,可用于在一个请求中执行许多操作

var people = new object[]
            {
                new { index = new { _index = "people", _type = "person", _id = "1"  }},
                new { FirstName = "Martijn", LastName = "Laarman" },
                new { index = new { _index = "people", _type = "person", _id = "2"  }},
                new { FirstName = "Greg", LastName = "Marzouka" },
                new { index = new { _index = "people", _type = "person", _id = "3"  }},
                new { FirstName = "Russ", LastName = "Cam" },
            };

var indexResponse = lowlevelClient.Bulk<Stream>(people);
Stream responseStream = indexResponse.Body;

客户端将单独序列化每个项目,并使用批量API所需的\n字符连接项目。 有关更多详细信息和支持的操作,请参阅Elasticsearch Bulk API文档。

搜索

现在我们索引了一些文件,我们可以开始搜索它们。

弹性搜索查询DSL可以使用请求内的匿名类型表示

var searchResponse = lowlevelClient.Search<string>("people", "person", new
{
    from = 0,
    size = 10,
    query = new
    {
        match = new
        {
            field = "firstName",
            query = "Martijn"
        }
    }
});

var successful = searchResponse.Success;
var responseJson = searchResponse.Body;

responseJson现在拥有一个用于响应的JSON字符串。 此查询的搜索端点为/people/person/_search,可以通过更改indextype请求中提供的参数来搜索多个索引和类型。

字符串也可以用来表达请求

var searchResponse = lowlevelClient.Search<byte[]>("people", "person", @"
{
    ""from"": 0,
    ""size"": 10,
    ""query"": {
        ""match"": {
            ""field"": ""firstName"",
            ""query"": ""Martijn""
        }
    }
}");

var responseBytes = searchResponse.Body;

正如你所看到的,使用字符串比使用匿名类型要麻烦一些,因为需要避免双引号,但是它有时也是有用的。 responseBytes将包含来自Elasticsearch的响应的字节。

Elasticsearch.Net不提供类型的对象来表示响应; 如果你需要这个,你应该考虑使用NEST,它会将所有的请求和响应映射到类型。 您可以使用Elasticsearch.Net使用强大的类型,但由开发人员配置Elasticsearch.Net可以让您了解如何反序列化您的类型,最有可能通过向ConnectionConfiguration提供自己的IElasticsearchSerializer实现。


处理错误

默认情况下,Elasticsearch.Net被配置为不返回不在200-300范围内的HTTP响应状态代码,也不允许给定请求允许的预期响应状态代码。 检查索引是否存在可以返回404。

来自低级客户端调用的响应提供了许多属性,可用于确定呼叫是否成功

var searchResponse = lowlevelClient.Search<byte[]>("people", "person", new { match_all = new {} });

var success = searchResponse.Success; 
var successOrKnownError = searchResponse.SuccessOrKnownError; 
var serverError = searchResponse.ServerError; 
var exception = searchResponse.OriginalException;

使用这些细节,可以围绕你的应用程序做什么来做出决定。

可以通过在ConnectionConfiguration上设置.ThrowExceptions()来更改不抛出异常的默认行为

var settings = new ConnectionConfiguration(new Uri("http://example.com:9200"))
    .ThrowExceptions();

var lowlevelClient = new ElasticLowLevelClient(settings);

如果需要更细粒度的控制,则可以使用ConnectionConfiguration上的.OnRequestCompleted()抛出自定义异常。

var settings = new ConnectionConfiguration(new Uri("http://example.com:9200"))
    .OnRequestCompleted(apiCallDetails =>
    {
        if (apiCallDetails.HttpStatusCode == 418)
        {
            throw new TimeForACoffeeException();
        }
    });

var lowlevelClient = new ElasticLowLevelClient(settings);
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值