使用 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 );
但它没有给我想要的结果,它给了我结果:content1
和 content2
。
我应该怎么做才能得到 content1
结果?
默认情况下检查将此查询编译为:
+(+description:lazy dog)
并基于它 return 使用以下两个词计算结果:lazy 和 dog 词。
你想要达到的是:
+(+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.
每个内容都有一些 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 );
但它没有给我想要的结果,它给了我结果:content1
和 content2
。
我应该怎么做才能得到 content1
结果?
默认情况下检查将此查询编译为:
+(+description:lazy dog)
并基于它 return 使用以下两个词计算结果:lazy 和 dog 词。
你想要达到的是:
+(+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.