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

时间:2016-09-22 14:33:43

标签: lucene umbraco lucene.net

每个内容我有一些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 );

但它没有给我预期的结果,它给了我结果:content1content2

我应该怎样做才能获得content1结果?

1 个答案:

答案 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