我正在尝试在Umbraco 7(7.3.6)中构建一些自定义搜索逻辑,它将搜索用户提供的多个术语,其中这些术语可能包含用引号括起来的短语。
我有以下代码,它使用提供的术语,使用正则表达式来拆分单个术语(同时保留括号中的引号),然后使用一系列GroupedOr
调用来搜索多个字段
var searcher = Examine.ExamineManager.Instance.SearchProviderCollection[this.searchConfig.SiteSearchProviderName];
var searchCriteria = searcher.CreateSearchCriteria(Examine.SearchCriteria.BooleanOperation.Or);
var splitTerms = Regex.Matches(term, @"[\""].+?[\""]|[^ ]+")
.Cast<Match>()
.Select(m => m.Value)
.ToArray();
var query = searchCriteria.GroupedOr(
new[] { BaseContent.FIELD_NodeName },
this.GetValues(splitTerms, 3, 0.8F))
.Or()
.GroupedOr(
new[] { this.searchConfig.ContentFieldName },
this.GetValues(splitTerms, 1, 0.8F));
这是GetValues方法:
private IExamineValue[] GetValues(string[] terms, float boost, float fuzziness)
{
return terms
.Select(t => t.Boost(boost).Value.Fuzzy(fuzziness))
.ToArray();
}
我的索引中有一个文件,其中包含术语&#34;快速的棕色狐狸跳过懒狗&#34;。如果我通过上面的逻辑传递字符串"\"brown fox\""
然后检查我的查询我可以看到我的query
对象包含以下Lucene查询:
(nodeName:"brown fox"~0.8) (_content:"brown fox"~0.8)
但是,当我使用它来构建搜索查询时,我得到没有结果。
var searchQuery = searcher
.Search(query.Compile(), 100)
.OrderByDescending(x => x.Score)
.TakeWhile(x => x.Score > 0.05f);
但是如果我使用Luke运行完全相同的Lucene查询,我会得到我期望的结果。
有人能帮我理解吗?额外的标记,如果你能解释为什么我的提升值没有被添加到Lucene查询!!