使用 Umbraco Examine 按短语中的确切单词搜索

Search by exact words in a phrase using Umbraco Examine

每个内容都有一些 description 字段,它们是:

对于content1

The quick brown fox jumps over the lazy dog. And the lazy dog is good.

对于content2

The lazy fog is crazy.

现在,当我使用关键字 = lazy dog 时,我想将结果作为 content1 而不是 content2

我试过:

BaseSearchProvider searcher = ExamineManager.Instance.SearchProviderCollection["MySearch"];
ISearchCriteria criteria =
            searcher.CreateSearchCriteria()
               .GroupedAnd( new List<string> { "description" }, "lazy dog") )
               .Compile();

ISearchResults result = searcher.Search( criteria );

但它没有给我想要的结果,它给了我结果:content1content2

我应该怎么做才能得到 content1 结果?

默认情况下检查将此查询编译为:

+(+description:lazy dog)

并基于它 return 使用以下两个词计算结果:lazydog 词。

你想要达到的是:

+(+description:"lazy dog")

您首先需要尝试的是转义该短语。在你的情况下它将是:

BaseSearchProvider searcher = ExamineManager.Instance.SearchProviderCollection["MySearch"];
ISearchCriteria criteria =
            searcher.CreateSearchCriteria()
               .GroupedAnd( new List<string> { "description" }, "lazy dog".Escape()) )
               .Compile();

ISearchResults result = searcher.Search( criteria );

现在无法测试,但据我所知,过去曾出现过一些问题。第二种选择和救命稻草可能是手动构建搜索查询并使用原始查询。

BaseSearchProvider searcher = ExamineManager.Instance.SearchProviderCollection["MySearch"];
ISearchCriteria criteria = searcher.CreateSearchCriteria();

var query = criteria.RawQuery("+description:\"lazy dog\"");

ISearchResults result = searcher.Search( query );

它应该 return 你只纠正 = 匹配的结果。就个人而言,我也使用了一些特定单词的提升来在分数列表中指出一些结果,但如果你只想拥有匹配的项目,请尝试上面的解决方案,让我知道它是否对你有帮助。

如果您想处理多个 属性,您可以使用一些流畅的 API 方法,例如 GroupedAnd 或 GroupedOr(取决于所需的搜索行为)或构建更高级的原始方法询问。

对于第一个选项,请查看 Grouped Operations 文档:https://github.com/Shazwazza/Examine/wiki/Grouped-Operations

对于第二种情况,最好分析一下它是如何完成的,例如在 ezSearch 包中(顺便说一句,太棒了!):https://github.com/umco/umbraco-ezsearch/blob/master/Src/Our.Umbraco.ezSearch/Web/UI/Views/MacroPartials/ezSearch.cshtml.