1

我正在尝试在 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();
}

我的索引中有一个文档,其中包含“The quick brown fox jumps over the lazy dog”一词。"\"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 查询中,请加分!!

4

0 回答 0