如何从弹性嵌套中排除某些值

时间:2018-05-28 20:27:43

标签: elasticsearch nest

我使用NEST查询来过滤弹性记录。

以下查询将根据sourceIds的短语和列表过滤记录。但是如果他们的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));

1 个答案:

答案 0 :(得分:0)

我使用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;
        }