如何从弹性嵌套中排除某些值
How to exclude certain values from elastic nest
我正在使用 NEST 查询从 elastic 中过滤记录。
以下查询将根据短语和 sourceId 列表过滤记录。但是如果 URL 包含 ideaArticles 列表,我想从结果中排除一些文档。
var result = ElasticSearchClientConnection.Client.Search<T>(s => s
.Query(q => q.Match(p => p.Field(f => f.Body).Query(phrase))
&& q.Terms(p => p.Field(f => f.SourceId).Terms(sourceIds))
&& !q.Terms(p => p.Field(f => f.URL).Terms(ideaArticles))
).Take(take));
我用 MatchPhrase 解决了这个问题。但是因为我有一个短语列表,所以我不得不即时创建一个查询。
var result =
ElasticSearchClientConnection.Client.Search<T>(s =>
s.Query(q => q.Match(p => p.Field(f => f.Body).Query(phrase))
&& q.Terms(p => p.Field(f => f.SourceId).Terms(sourceIds))
&& BuildMatchPhraseQueryContainer(q, ideaArticles)).Take(take));
这是动态创建查询的方法
private QueryContainer BuildMatchPhraseQueryContainer(QueryContainerDescriptor<T> qd, List<string> phrases)
{
QueryContainer queryContainer = new QueryContainer();
foreach (var phrase in phrases)
{
queryContainer &= !qd.MatchPhrase(m => m.Field(f => f.URL).Query(phrase));
}
return queryContainer;
}
我正在使用 NEST 查询从 elastic 中过滤记录。
以下查询将根据短语和 sourceId 列表过滤记录。但是如果 URL 包含 ideaArticles 列表,我想从结果中排除一些文档。
var result = ElasticSearchClientConnection.Client.Search<T>(s => s
.Query(q => q.Match(p => p.Field(f => f.Body).Query(phrase))
&& q.Terms(p => p.Field(f => f.SourceId).Terms(sourceIds))
&& !q.Terms(p => p.Field(f => f.URL).Terms(ideaArticles))
).Take(take));
我用 MatchPhrase 解决了这个问题。但是因为我有一个短语列表,所以我不得不即时创建一个查询。
var result =
ElasticSearchClientConnection.Client.Search<T>(s =>
s.Query(q => q.Match(p => p.Field(f => f.Body).Query(phrase))
&& q.Terms(p => p.Field(f => f.SourceId).Terms(sourceIds))
&& BuildMatchPhraseQueryContainer(q, ideaArticles)).Take(take));
这是动态创建查询的方法
private QueryContainer BuildMatchPhraseQueryContainer(QueryContainerDescriptor<T> qd, List<string> phrases)
{
QueryContainer queryContainer = new QueryContainer();
foreach (var phrase in phrases)
{
queryContainer &= !qd.MatchPhrase(m => m.Field(f => f.URL).Query(phrase));
}
return queryContainer;
}