跟我说这个......
如果我有一部电影的数据库,并且我想搜索多个字段并将结果返回到一个字段,我将如何实现这一目标?
让我举个例子......
我的文档有标题和artists.name(数组)。我希望用户能够同时搜索标题和艺术家,以便结果在同一个字段中。这将在'自动完成'中实施。搜索场景,您可以在键入时获得结果。
因此,如果用户输入“麦克风格”我希望能够搜索名为mike的演员(artists.name)和名为mike的标题。在这种情况下,你可能会回归魔法迈克'和迈克迈耶'在相同的自动完成结果集中。 (imdb.com有此实现)
我知道如何搜索这两个字段,但我如何将它们归为一个?我相信我必须对我的打击位置有所了解。来自 - title或artists.name。所以也许这是一个更大的问题 - 如何判断命中来自哪个领域?
答案 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索引文档时创建的预先计算的建议,这将增加您的索引时间和索引大小,但结果将提供极快的建议。