每个内容我有一些description
字段,其中包括:
content1
:
The quick brown fox jumps over the lazy dog. And the lazy dog is good.
content2
:
The lazy fog is crazy.
现在,当我使用keyword = 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
结果?
答案 0 :(得分:2)
默认情况下,check会将此查询编译为:
+(+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(取决于所需的搜索行为)或构建更高级的原始查询。
首先选择分组操作文档: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。