私はアーキテクチャを変更するためにいくつかのテストを行っています。私たちはMongoDBを落とし、代わりにElasticSearchを使用したいと考えています。しかし、私は本当にこの技術を知っていません。ドライバとしてNESTを使用していて、mongoで使用していたクエリを翻訳できません。C#NEST Elastic Search Query複数の条件
public async Task<IEnumerable<Keyword>> GetKeywordsAsync(string prefix, int startIndex, int totalItems, int minimumTotalSearch, CancellationToken cancellationToken)
{
return await _mongoReader.GetEntitiesAsync<KeywordEntity, Keyword>(CollectionName,
queryable =>
queryable.Where(entity => entity.KeywordName.StartsWith(prefix) && entity.TotalSearch >= minimumTotalSearch)
.OrderBy(entity => entity.KeywordName)
.Select(_keywordConverter.GetConverter())
.Skip(startIndex)
.Take(totalItems),
cancellationToken).ConfigureAwait(false);
}
public async Task<IEnumerable<TModel>> GetEntitiesAsync<TDocument, TModel>(string collectionName,
Func<IMongoQueryable<TDocument>, IMongoQueryable<TModel>> getQueryable,
CancellationToken cancellationToken)
{
var documents = GetDocuments<TDocument>(collectionName);
var query = getQueryable(documents.AsQueryable());
return await query.ToListAsync(cancellationToken).ConfigureAwait(false);
}
そして、ここで私がElasticSearchのために作られたシンプルな検索です:
public async Task<IEnumerable<TModel>> FindAsync<TModel, TValue>(string index,
Expression<Func<TModel, TValue>> findExpression, TValue value, int limit,
CancellationToken cancellationToken) where TModel : class
{
var searchRequest = new SearchRequest<TModel>(index)
{
Query =
Query<TModel>.Match(
a => a.Field(findExpression).Query(string.Format(CultureInfo.InvariantCulture, "{0}", value))),
Size = limit
};
var resGet = await _elasticClientFactory.Create().SearchAsync<TModel>(searchRequest, cancellationToken).ConfigureAwait(false);
return resGet?.Documents;
}
問題は、私は弾性の私のクエリモンゴを翻訳することはできませんが...
それはpainfullだったが、ここでは、弾性クエリです
{
"query": {
"bool": {
"must": [
{"range" : { "totalSearch" : { "gte" : minimumTotalSearch }}},
{"prefix": { "keywordName": prefix}}
]
}
},
"from": startIndex,
"size": totalItems
}
- >解決策:
var result =
ecf.Create()
.Search<KeywordEntity>(
a => a.Query(
z =>
z.Bool(
e =>
e.Must(r => r.Range(t => t.Field(y => y.TotalSearch).GreaterThanOrEquals(minimumTotalSearch)),
t => t.Prefix(y => y.KeywordName, prefix)))).Index("keywords"));
をしかし、これは(/スキップすることなく、非常に簡単である取る)このクエリを行うための最善の方法であれば、今私は自分自身を求めている:私はC#でクエリを実行する方法を発見苦労コーディング。私が新しくなったので、おそらくもっと最適化されたクエリがあります...
クエリが何をしようとしているのかを説明することができれば、素晴らしいことになります。これは、ESクエリを定式化する際に役立ちます。 mongoDbに精通していない – pratikvasa