9 changed files with 216 additions and 1 deletions
@ -0,0 +1,3 @@
|
||||
<Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd"> |
||||
<ConfigureAwait ContinueOnCapturedContext="false" /> |
||||
</Weavers> |
@ -0,0 +1,37 @@
|
||||
# Sanhe.Abp.Elasticsearch |
||||
|
||||
Abp Elasticsearch集成,提供全局唯一IElasticClient访问接口 |
||||
|
||||
## 模块引用 |
||||
|
||||
|
||||
```csharp |
||||
[DependsOn(typeof(AbpElasticsearchModule))] |
||||
public class YouProjectModule : AbpModule |
||||
{ |
||||
// other |
||||
} |
||||
``` |
||||
|
||||
## 配置项 |
||||
|
||||
* AbpElasticsearchOptions.FieldCamelCase 字段是否采用 camelCase 格式, 默认false |
||||
* AbpElasticsearchOptions.NodeUris ES端点,多个端点以,或;分隔 |
||||
* AbpElasticsearchOptions.TypeName 文档名称,默认_doc |
||||
* AbpElasticsearchOptions.ConnectionLimit 最大连接数,详情见 NEST 文档 |
||||
* AbpElasticsearchOptions.UserName 连接用户,详情见 NEST 文档 |
||||
* AbpElasticsearchOptions.Password 用户密码,详情见 NEST 文档 |
||||
* AbpElasticsearchOptions.ConnectionTimeout 连接超时时间,详情见 NEST 文档 |
||||
|
||||
## appsettings.json |
||||
|
||||
```json |
||||
{ |
||||
"Elasticsearch": { |
||||
"NodeUris": "http://localhost:9200" |
||||
} |
||||
} |
||||
|
||||
``` |
||||
|
||||
[作者colinin,Github](https://github.com/colinin/abp-next-admin) |
@ -0,0 +1,15 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk"> |
||||
|
||||
<Import Project="..\..\..\configureawait.props" /> |
||||
<Import Project="..\..\..\common.props" /> |
||||
|
||||
<PropertyGroup> |
||||
<TargetFramework>netstandard2.0</TargetFramework> |
||||
<RootNamespace /> |
||||
</PropertyGroup> |
||||
|
||||
<ItemGroup> |
||||
<PackageReference Include="NEST" Version="$(NESTPackageVersion)" /> |
||||
<PackageReference Include="Volo.Abp.Core" Version="$(VoloAbpVersion)" /> |
||||
</ItemGroup> |
||||
</Project> |
@ -0,0 +1,14 @@
|
||||
using Microsoft.Extensions.DependencyInjection; |
||||
using Volo.Abp.Modularity; |
||||
|
||||
namespace Sanhe.Abp.Elasticsearch |
||||
{ |
||||
public class AbpElasticsearchModule : AbpModule |
||||
{ |
||||
public override void ConfigureServices(ServiceConfigurationContext context) |
||||
{ |
||||
var configuration = context.Services.GetConfiguration(); |
||||
Configure<AbpElasticsearchOptions>(configuration.GetSection("Elasticsearch")); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,94 @@
|
||||
using Elasticsearch.Net; |
||||
using Nest; |
||||
using System; |
||||
using System.Linq; |
||||
|
||||
namespace Sanhe.Abp.Elasticsearch |
||||
{ |
||||
public class AbpElasticsearchOptions |
||||
{ |
||||
/// <summary> |
||||
/// 字段名称 是否为 camelCase 格式。 |
||||
/// 如果为true, 在ES中为 camelCase。 |
||||
/// 如果为false,在ES中为 CamelCase。 |
||||
/// 默认:false。 |
||||
/// </summary> |
||||
public bool FieldCamelCase { get; set; } |
||||
/// <summary> |
||||
/// Ensures the response bytes are always available on the <see cref="ElasticsearchResponse{T}" /> |
||||
/// </summary> |
||||
public bool DisableDirectStreaming { get; set; } |
||||
/// <summary> |
||||
/// ES端点,多个端点以,或;分隔 |
||||
/// </summary> |
||||
public string NodeUris { get; set; } |
||||
/// <summary> |
||||
/// 最大连接数 |
||||
/// </summary> |
||||
public int ConnectionLimit { get; set; } |
||||
/// <summary> |
||||
/// 连接用户名 |
||||
/// </summary> |
||||
public string UserName { get; set; } |
||||
/// <summary> |
||||
/// 用户密码 |
||||
/// </summary> |
||||
public string Password { get; set; } |
||||
/// <summary> |
||||
/// 连接超时时间 |
||||
/// </summary> |
||||
public TimeSpan ConnectionTimeout { get; set; } |
||||
/// <summary> |
||||
/// |
||||
/// </summary> |
||||
public IConnection Connection { get; set; } |
||||
/// <summary> |
||||
/// |
||||
/// </summary> |
||||
public ConnectionSettings.SourceSerializerFactory SerializerFactory { get; set; } |
||||
|
||||
public AbpElasticsearchOptions() |
||||
{ |
||||
ConnectionLimit = ConnectionConfiguration.DefaultConnectionLimit; |
||||
ConnectionTimeout = ConnectionConfiguration.DefaultTimeout; |
||||
} |
||||
|
||||
internal IConnectionSettingsValues CreateConfiguration() |
||||
{ |
||||
IConnectionPool connectionPool; |
||||
var nodes = NodeUris |
||||
.Split(new[] { ',', ';' }, StringSplitOptions.RemoveEmptyEntries) |
||||
.Select(uriString => new Uri(uriString)); |
||||
|
||||
if (nodes.Count() == 1) |
||||
{ |
||||
connectionPool = new SingleNodeConnectionPool(nodes.First()); |
||||
} |
||||
else |
||||
{ |
||||
connectionPool = new StaticConnectionPool(nodes); |
||||
} |
||||
|
||||
var configuration = new ConnectionSettings( |
||||
connectionPool, |
||||
Connection, |
||||
SerializerFactory) |
||||
.ConnectionLimit(ConnectionLimit) |
||||
.RequestTimeout(ConnectionTimeout); |
||||
|
||||
if (!FieldCamelCase) |
||||
{ |
||||
configuration.DefaultFieldNameInferrer((name) => name); |
||||
} |
||||
|
||||
if (UserName.IsNullOrWhiteSpace()) |
||||
{ |
||||
configuration.BasicAuthentication(UserName, Password); |
||||
} |
||||
|
||||
configuration.DisableDirectStreaming(DisableDirectStreaming); |
||||
|
||||
return configuration; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,32 @@
|
||||
using Microsoft.Extensions.Options; |
||||
using Nest; |
||||
using System; |
||||
using Volo.Abp.DependencyInjection; |
||||
|
||||
namespace Sanhe.Abp.Elasticsearch |
||||
{ |
||||
public class ElasticsearchClientFactory : IElasticsearchClientFactory, ISingletonDependency |
||||
{ |
||||
private readonly AbpElasticsearchOptions _options; |
||||
private readonly Lazy<IElasticClient> _lazyClient; |
||||
|
||||
public ElasticsearchClientFactory( |
||||
IOptions<AbpElasticsearchOptions> options) |
||||
{ |
||||
_options = options.Value; |
||||
|
||||
_lazyClient = new Lazy<IElasticClient>(CreateClient); |
||||
} |
||||
|
||||
public IElasticClient Create() => _lazyClient.Value; |
||||
|
||||
protected virtual IElasticClient CreateClient() |
||||
{ |
||||
var configuration = _options.CreateConfiguration(); |
||||
|
||||
var client = new ElasticClient(configuration); |
||||
|
||||
return client; |
||||
} |
||||
} |
||||
} |
Loading…
Reference in new issue