ElasticSearch NEST操作(2)
阿新 • • 發佈:2021-07-18
基礎知識
ElasticSeach 訪問封裝的服務類
IElasticSearch類的程式碼如下:
public interface IESSever { /// <summary> /// Linq查詢的官方Client /// </summary> IElasticClient ElasticLinqClient { get; set; } /// <summary> /// Js查詢的官方Client /// </summary> IElasticLowLevelClient ElasticJsonClient { get; set; } Task<Nest.CreateResponse> CreateAsync(Tmx2ESModel model); }
ElasticSearch的方法實現
/// <summary> /// 訪問ElasticSearch服務類 /// </summary> public class ESSever : IESSever { /// <summary> /// Linq查詢的官方Client /// </summary> public IElasticClient ElasticLinqClient { get; set; } /// <summary> /// Js查詢的官方Client /// </summary> public IElasticLowLevelClient ElasticJsonClient { get; set; } public ESSever(IConfiguration configuration) { var uris = configuration["ElasticSearchContext:ESUri"].Split(",").ToList().ConvertAll(x => new Uri(x)); var connectionPool = new StaticConnectionPool(uris);//配置請求池 var settings = new ConnectionSettings(connectionPool).RequestTimeout(TimeSpan.FromSeconds(30));//請求配置引數 settings.DisableDirectStreaming().DefaultIndex(configuration["ElasticSearchContext:ESIndexName"]); this.ElasticJsonClient = new ElasticLowLevelClient(settings);//json請求客戶端初始化 this.ElasticLinqClient = new ElasticClient(settings);//linq請求客戶端初始化 } /// <summary> /// Creates the Tmx2ESModel asynchronous. /// </summary> /// <param name="model">The model.</param> /// <returns></returns> public Task<Nest.CreateResponse> CreateAsync(Tmx2ESModel model) { return ElasticLinqClient.CreateDocumentAsync(model); } /// <summary> /// Creates the Tmx2ESModel asynchronous. /// </summary> /// <param name="model">The model.</param> /// <returns></returns> public Task<ISearchResponse<TDocument>> SearchAsync<TDocument>(Func<SearchDescriptor<TDocument>, ISearchRequest> selector = null, CancellationToken ct = default(CancellationToken)) where TDocument : class { return ElasticLinqClient.SearchAsync(selector); } }
註冊服務
在startup裡面在ConfigureServices下面新增如下程式碼即可
services.AddSingleton<IESSever, ESSever>();
賬號密碼
注:請求配置時,如果ElasticSearch需要賬號密碼時需要把settings修改為如下
var settings = new ConnectionSettings(connectionPool) .BasicAuthentication("user", "password") .RequestTimeout(TimeSpan.FromSeconds(30));
ElasticSearch 查詢
private Task<Nest.ISearchResponse<Tmx2ESModel>> SearchAsyncStep(Tmx2ESModelInDto inModel, int page, int size)
{
var searchRequest = new SearchRequest<Tmx2ESModel>();
searchRequest.From = page;
searchRequest.Size = size;
var list = new List<QueryContainer>();
//.Suffix("keyword") 精準查詢
if (!string.IsNullOrWhiteSpace(inModel.Condition.ClientGuid))
{
var clientGuid = new MatchQuery() { Field = Infer.Field<Tmx2ESModel>(f => f.ClientGuid.Suffix("keyword")), Query = inModel.Condition.ClientGuid };
list.Add(clientGuid);
}
//模糊查詢
if (!string.IsNullOrWhiteSpace(inModel.Condition.SourceType))
{
var sourceType = new MatchQuery() { Field = Infer.Field<Tmx2ESModel>(f => f.SourceType), Query = inModel.Condition.SourceType };
list.Add(sourceType);
}
...
searchRequest.Query = new BoolQuery() { Must = list };
var searchResponse = _eSSever.ElasticLinqClient.SearchAsync<Tmx2ESModel>(searchRequest);
return searchResponse;
}
寫入
public Task<Nest.CreateResponse> CreateAsync(Tmx2ESModel model)
{
return ElasticLinqClient.CreateDocumentAsync(model);
}
修改
var searchResponse = _eSSever.ElasticLinqClient.Search<Tmx2ESModel>(s => s
.Query(q => q
.Match(t => t
.Field(f => f.XliffSegmentGuid.Suffix("keyword")).Query(json.XliffSegmentGuid)
) && q
.Match(t => t
.Field(f => f.ServiceType.Suffix("keyword")).Query(json.ServiceType)
)
)
);
var resultData = searchResponse.Documents.ToList();
if (resultData.Count > 0)
{
//Update
foreach (var data in resultData)
{
log.Write(logKye, $"【Update】Query data, can be modified, XliffSegmentGuid:{data.XliffSegmentGuid}");
data.UpdateAt = json.UpdateAt;
data.UpdatedBy = json.UpdatedBy;
var resultUpdate = await _eSSever.ElasticLinqClient.UpdateAsync(DocumentPath<Tmx2ESModel>.Id(data.Id), selector => selector.Doc(data));
log.Write(logKye, $"【Update success】");
}
}