elasticsearch,nest,C#,elasticsearch,Nest" /> elasticsearch,nest,C#,elasticsearch,Nest" />

C# ElasticSearch 5.x上下文提示器-单上下文多值

C# ElasticSearch 5.x上下文提示器-单上下文多值,c#,elasticsearch,nest,C#,elasticsearch,Nest,我正在尝试使用具有多个值的完成上下文。 上下文只接受一个值 string contextValue = "10"; List<string> listOfContextValues = new List<string> {"10", "20","30"}; var a = Client.Search<Post>(s => s .Suggest(su => su .Completion("cat

我正在尝试使用具有多个值的完成上下文。 上下文只接受一个值

string contextValue = "10";
List<string> listOfContextValues = new List<string> {"10", "20","30"};
var a = Client.Search<Post>(s => s
            .Suggest(su => su
                .Completion("categories", cs => cs
                    .Field(f => f.CSuggest)
                    .Prefix(query)
                    .Contexts(co => co
                        .Context("sourceid",
                            cd => cd.Context(contextValue)
                    )
                )
            )
        ));
string contextValue=“10”;
List listOfContextValues=新列表{“10”、“20”、“30”};
var a=Client.Search(s=>s
.建议(su=>su
.完成(“类别”,cs=>cs
.Field(f=>f.CSuggest)
.前缀(查询)
.context(co=>co
.Context(“sourceid”,
cd=>cd.Context(contextValue)
)
)
)
));
我不知道如何用listOfContextValues过滤我的建议字段

更新

当我使用for循环并将单个上下文作为过滤器传递并将结果存储在列表中时

还可以使用Russ建议的代码并将结果存储在列表中。 但第二个列表中缺少一些结果

如下图所示:

var socialNetworks = srvUser.GetUserSocialNetworks(userId);

List<string> tags = new List<string>();
foreach (var socialNetwork in socialNetworks)
{
    var result = Client.Search<Post>(s => s
        .Suggest(su => su
            .Completion("categories", cs => cs
                .Field(f => f.CSuggest)
                .Prefix(query)
                .Contexts(co => co
                    .Context("sourceid",
                        cd => cd.Context(socialNetwork)
                    )
                )
            )
        ));
    List<string> br = result.Suggest["categories"].SelectMany(x => x.Options)
        .Select(y => y.Text).Distinct().ToList();
    tags.AddRange(br);
}

var searchResponse = Client.Search<Post>(s => s
    .Suggest(su => su
        .Completion("categories", cs => cs
            .Field(f => f.CSuggest)
            .Prefix(query)
            .Contexts(co => co
                .Context("sourceid", socialNetworks
                    .Select<string, Func<SuggestContextQueryDescriptor<Post>, ISuggestContextQuery>>(v => cd => cd.Context(v))
                    .ToArray()

                )
            )
        )
    )
);
List<string> sa = searchResponse.Suggest["categories"].SelectMany(x => x.Options).Select(y => y.Text).Distinct().ToList();
if (sa.Count != tags.Count)
{
    // >>>>> counts are not the same
}
var socialNetworks=srvUser.GetUserSocialNetworks(userId);
列表标签=新列表();
foreach(社交网络中的var社交网络)
{
var result=Client.Search(s=>s
.建议(su=>su
.完成(“类别”,cs=>cs
.Field(f=>f.CSuggest)
.前缀(查询)
.context(co=>co
.Context(“sourceid”,
cd=>cd.Context(社交网络)
)
)
)
));
列出br=result。建议[“类别”]。选择多个(x=>x.Options)
.Select(y=>y.Text).Distinct().ToList();
tags.AddRange(br);
}
var searchResponse=Client.Search(s=>s
.建议(su=>su
.完成(“类别”,cs=>cs
.Field(f=>f.CSuggest)
.前缀(查询)
.context(co=>co
.Context(“sourceid”),socialNetworks
.Select(v=>cd=>cd.Context(v))
.ToArray()
)
)
)
)
);
List sa=searchResponse.Suggest[“categories”]。SelectMany(x=>x.Options)。Select(y=>y.Text)。Distinct().ToList();
if(sa.Count!=tags.Count)
{
//>>>>>>>计数不相同
}

您在找尺码吗

  ...s =>
         s.Completion("categories",
            cs=> cs.
               Field(p => p.Suggestion)
                    .Contexts(
                        ctx =>
                            ctx.Context("sid", d => d.Context(value))
                    .Prefix(searchText)
                    .Size(10);
,因此对于上下文值的集合,可以执行以下操作

void Main()
{
    var client = new ElasticClient();
    var listOfContextValues = new List<string> { "10", "20", "30" }; 
    var query = "query";

    var searchResponse = client.Search<Post>(s => s
                .Suggest(su => su
                    .Completion("categories", cs => cs
                        .Field(f => f.CSuggest)
                        .Prefix(query)
                        .Contexts(co => co
                            .Context("sourceid",
                                listOfContextValues
                                    .Select<string, Func<SuggestContextQueryDescriptor<Post>, ISuggestContextQuery>>(v => cd => cd.Context(v))
                                    .ToArray()
                            )
                        )
                    )
                )
            );
}

public class Post
{
    public CompletionField CSuggest { get; set; }
}
void Main()
{
var client=新的ElasticClient();
var listOfContextValues=新列表{“10”、“20”、“30”};
var query=“query”;
var searchResponse=client.Search(s=>s
.建议(su=>su
.完成(“类别”,cs=>cs
.Field(f=>f.CSuggest)
.前缀(查询)
.context(co=>co
.Context(“sourceid”,
ContextValues列表
.Select(v=>cd=>cd.Context(v))
.ToArray()
)
)
)
)
);
}
公营职位
{
public CompletionField CSuggest{get;set;}
}

否。我正在寻找一种方法来过滤具有多个值的建议字段(如列表)。然后我的anwser不是正确的。你应该检查一下@russcam的回答谢谢,它很有效。但当将搜索放入for循环,并将单个上下文值传递给上下文并合并响应时,它返回的结果比您的代码要多。我不明白您的意思。也许你可以编辑你的问题来提供更多的细节?