【问题标题】:Sitecore Solr Search Exact Match IssueSitecore Solr 搜索完全匹配问题
【发布时间】:2019-09-05 01:42:26
【问题描述】:

索引包含字段:

  • 文学学士
  • 文学士(荣誉)

当搜索“文学学士”时,文学学士(荣誉)在搜索结果中显示为第一条记录。我希望将“文学士”显示为第一个记录,因为它与文学士(荣誉)完全匹配

这是我的 solr 查询:

((_latestversion:(True) 
AND includeinsearchresults_t:(true)) 
AND ((name_t:("Bachelor Of arts"))^5 
OR pagetitle_t:("Bachelor Of arts") 
OR description_t:("Bachelor Of arts") 
OR pagecontent_t:("Bachelor Of arts") 
OR ((name_t:(*bachelor*))^2.5 
OR (name_t:(*arts*))^2.5 OR ((pagetitle_t:(*bachelor*))^2 
OR (pagetitle_t:(*arts*))^2) OR ((description_t:(*bachelor*))^1.5 OR (description_t:(*arts*))^1.5) 
OR (pagecontent_t:(*bachelor*) OR pagecontent_t:(*arts*)))))




        var pageTitlePredicatePhrase = PredicateBuilder.True<ContentPageSearchModel>();
        var DescriptionPredicatePhrase = PredicateBuilder.True<ContentPageSearchModel>();
        var pageContentPredicatePhrase = PredicateBuilder.True<ContentPageSearchModel>();
        var NamePredicatePhrase = PredicateBuilder.True<ContentPageSearchModel>();

        var pageTitle1Predicate = PredicateBuilder.True<ContentPageSearchModel>();
        var Description1Predicate = PredicateBuilder.True<ContentPageSearchModel>();
        var pageContent1Predicate = PredicateBuilder.True<ContentPageSearchModel>();
        var NamePredicate1 = PredicateBuilder.True<ContentPageSearchModel>();

        var predicate = PredicateBuilder.True<ContentPageSearchModel>();

        //To check for the entire search phrase

        NamePredicatePhrase = NamePredicatePhrase.Or(item => item.CourseName.Equals(searchPhrase).Boost(5.0f));
        pageTitlePredicatePhrase = pageTitlePredicatePhrase.Or(item => item.PageTitle.Equals(searchPhrase));
        DescriptionPredicatePhrase = DescriptionPredicatePhrase.Or(item => item.CourseDescription.Equals(searchPhrase));
        pageContentPredicatePhrase = pageContentPredicatePhrase.Or(item => item.PageContent.Equals(searchPhrase));


        //For individual value search

        foreach (var word in terms)
        {
            Name1Predicate = Name1Predicate.Or(item => item.CourseName.Contains(word).Boost(2.5f));
            pageTitle1Predicate = pageTitle1Predicate.Or(item => item.PageTitle.Contains(word).Boost(2f));
            Description1Predicate = Description1Predicate.Or(item => item.CourseDescription.Contains(word).Boost(1.5f));
            pageContent1Predicate = pageContent1Predicate.Or(item => item.PageContent.Contains(word).Boost(1f));
        }
        Name1Predicate = Name1Predicate.Or(pageTitle1Predicate).Or(Description1Predicate).Or(pag1Content1Predicate);


        //Final Predicate

        FinalPredicatePhrase = NamePredicatePhrase.Or(pageTitlePredicatePhrase).Or(DescriptionPredicatePhrase).Or(pageContentPredicatePhrase)
                                    .Or(Name1Predicate);

【问题讨论】:

  • 要回答这个问题,我们需要检查结果中出现的第一个和第二个文档的分数。在第一个文档中,可能出现更多的“文学学士”短语或词 Bachelor / Arts。或第 1 个文档的长度小于第 2 个。分数取决于所有此类文档特征。
  • 感谢 Shubhangi 的回复。但是我们在哪里添加分数?是在构建查询时吗?我的字段类型是 ComputedIndexFields
  • Savitha,您可以尝试使用“debug=true”参数从 Solr 管理 UI 或 REST API 运行查询。例如。 localhost:8983/solr/films/select/…*&debug=true

标签: search solr sitecore


【解决方案1】:

以下对我有用:

1.新建一个字符串类型的计算域并重建索引。
2.提升新增领域

现在查询如下所示:

((_latestversion:(True) AND includeinsearchresults_t:(true)) AND ((searchname_s:(“护理学士”))^20 OR pagetitle_t:(“护理学士”) OR description_t:("护理学士") OR pagecontent_t:("护理学士")))

谢谢, 萨维塔

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    • 2019-02-01
    • 2019-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多