首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ElasticSearch 5.x上下文建议器-单个上下文多值

ElasticSearch 5.x上下文建议器-单个上下文多值
EN

Stack Overflow用户
提问于 2017-06-07 10:09:07
回答 2查看 515关注 0票数 1

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

代码语言:javascript
运行
复制
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)
                    )
                )
            )
        ));

我不知道如何用listOfContextValues过滤我的建议字段。

更新

当我使用for循环并将单个上下文作为筛选器并将其存储到列表中时。

同时使用Russ建议的代码并将结果存储在列表中。但在第二份名单中缺少了一些结果。

如你在下面所看到的:

代码语言:javascript
运行
复制
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
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-06-07 21:37:24

as the second argument,因此对于上下文值的集合,您可以这样做。

代码语言:javascript
运行
复制
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; }
}
票数 3
EN

Stack Overflow用户

发布于 2017-06-07 19:47:17

你在找尺码吗?

代码语言:javascript
运行
复制
  ...s =>
         s.Completion("categories",
            cs=> cs.
               Field(p => p.Suggestion)
                    .Contexts(
                        ctx =>
                            ctx.Context("sid", d => d.Context(value))
                    .Prefix(searchText)
                    .Size(10);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44409660

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档