【问题标题】:Phrase matching with Sitecore ContentSearch API与 Sitecore ContentSearch API 匹配的短语
【发布时间】:2016-06-14 18:53:04
【问题描述】:

我正在使用带有自定义 Lucene 索引和 Linq 的 Sitecore 7.2。我需要为完全匹配赋予额外的(最大)权重。

示例: 用户搜索“彩虹上的某处”

结果应包括包含“rainbow”一词的项目,但包含“somewhere over the rainbow”的确切和完整术语的项目应给予最大权重。它们将作为最佳结果显示给用户。即包含整个短语的项目应比包含“彩虹”一词的项目重 100 倍。

我可能需要通过将“短语匹配”与“通配符匹配”分开收集来处理 ContentSearch API 之外的排名逻辑,这很好。

这是我现有的代码,为简洁起见已截断。该代码有效,但不按照我的描述处理完全匹配的短语。

using (var context = ContentSearchManager.GetIndex("sitesearch-index").CreateSearchContext())
{
    var pred = PredicateBuilder.False<SearchResultItem>();
    pred = pred
        .Or(i => i.Name.Contains(term)).Boost(1)
        .Or(i => i["Field 1"].Contains(term)).Boost(3)
        .Or(i => i["Field 2"].Contains(term)).Boost(1);

    IQueryable<SearchResultItem> query = context.GetQueryable<SearchResultItem>().Where(pred);
    var hits = query.GetResults().Hits;
    ...
}

如何执行精确的词组匹配?是否可以使用 Sitecore.ContentSearch.Linq API?

【问题讨论】:

  • 尝试查看 PreparedQuery 而不是 PredicateBuilder 的使用情况。
  • 看起来 PreparedQuery 来自 Sitecore 6 中的 Sitecore.Search API,而不是 7 中的 ContentSearch API。我当前的自定义索引是在 节点下的独立配置文件中定义的。 SearchManager.GetIndex()(在 v6 中使用)不知道我的索引。看来我必须更改所有内容才能使用 v6 API。希望有替代方案。

标签: linq lucene sitecore


【解决方案1】:

回答我自己的问题。问题出在括号语法上。应该是

.Or(i => i.Name.Contains(term).Boost(1))

而不是

.Or(i => i.Name.Contains(term)).Boost(1)

没有观察到提升。

【讨论】:

    【解决方案2】:

    我认为如果您执行以下操作,它将解决此问题:

    • 在空格上分割您的搜索字符串
    • 为每个拆分创建一个具有相等提升值的谓词,
    • 使用完整的搜索字符串创建一个附加谓词,然后 具有更高的提升值
    • 将所有这些谓词组合到一个“OR”谓词中。

    我还建议您检查以下内容:

    Sitecore Solr Search Score Value

    http://sitecoreinfo.blogspot.com/2015/10/sitecore-solr-search-result-items.html

    【讨论】:

    • 这不能按预期工作。我使用完整的搜索字符串创建了一个附加谓词,并将 boost 值设置为 30(高 30 倍)。当我搜索“一套指导原则”这个短语时,得分最高的是包含“set”、“settings”甚至“Massachusetts”这个词的许多实例的项目。包含整个短语的项目排名较低。如上所示,我在谓词中使用 .Contains()。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-15
    • 2017-01-12
    相关资源
    最近更新 更多