如何将弹性搜索结果合并到一个字段或如何解释找到哪个字段结果

时间:2014-06-07 18:31:46

标签: elasticsearch nest

跟我说这个......

如果我有一部电影的数据库,并且我想搜索多个字段并将结果返回到一个字段,我将如何实现这一目标?

让我举个例子......

我的文档有标题和artists.name(数组)。我希望用户能够同时搜索标题和艺术家,以便结果在同一个字段中。这将在'自动完成'中实施。搜索场景,您可以在键入时获得结果。

因此,如果用户输入“麦克风格”我希望能够搜索名为mike的演员(artists.name)和名为mike的标题。在这种情况下,你可能会回归魔法迈克'和迈克迈耶'在相同的自动完成结果集中。 (imdb.com有此实现)

我知道如何搜索这两个字段,但我如何将它们归为一个?我相信我必须对我的打击位置有所了解。来自 - title或artists.name。所以也许这是一个更大的问题 - 如何判断命中来自哪个领域?

1 个答案:

答案 0 :(得分:1)

我认为没有任何直接方法可以确定查询匹配的字段。我可以想到一些"解决方法"可以为您做的方法 - 一种方法是使用multisearch api,并对每个字段执行单独的查询。另一个是使用highlighting,它将返回找到匹配项的字段。

使用多重搜索的示例:

var response = client.MultiSearch(ms => ms
    .Search<Artist>("name", s => s.Query(q => q.Match(m => m.OnField(a => a.Name).Query("mike"))))
    .Search<Artist>("titles", s => s.Query(q => q.Match(m => m.OnField(a => a.Titles).Query("mike")))));

response.GetResponse<Artist>("name"); // <-- Contains search results from matching on Name
response.GetResponse<Artist>("titles"); // <-- Contains search results from matching on Titles

使用突出显示的示例:

var response = client.Search<Artist>(s => s
    .Query(q => q
        .MultiMatch(m => m
            .OnFields(a => a.Name, a => a.Titles)
            .Query("mike")))
    .Highlight(h => h
        .OnFields(fs => fs.OnField(a => a.Name),
                  fs => fs.OnField(a => a.Titles))));

然后,您可以检查每个匹配的Highlights对象或响应的Highlights对象,以确定匹配来自哪个字段。

还有explain api,您可以在查询中添加explain,但这会返回很多不相关的评分信息,您必须解析这些信息。可能对你的需求来说太麻烦了。

作为旁注 - 对于自动完成功能,如果可能,我会尝试利用completion suggester而不是上述解决方案。这些是在您通过构建FSTs索引文档时创建的预先计算的建议,这将增加您的索引时间和索引大小,但结果将提供极快的建议。