每个内容都有一些描述
字段,它们是:
对于 content1
:
敏捷的棕色狐狸跳过懒惰的狗。而且懒狗还不错。
对于 content2
:
懒雾很疯狂。
现在,当我使用关键字 = 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
结果?
最佳答案
默认情况下 examine 将此查询编译为:
+(+description:lazy dog)
并基于它返回包含以下两个词的结果: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 );
它应该只返回正确 = 匹配的结果。就我个人而言,我也使用了一些特定单词的提升来将一些结果指向得分列表中更高的结果,但如果您只想拥有匹配的项目,请尝试上述解决方案,如果它对您有帮助,请告诉我。
如果您想处理多个属性,您可以使用一些流畅的 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 .
关于lucene - 使用 Umbraco Examine 按短语中的确切单词搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39641983/