【问题标题】:Linq is not working with sitecore solrLinq 不使用 sitecore solr
【发布时间】:2016-06-14 11:12:11
【问题描述】:

我正在使用 sitecore 和 solr 显示搜索结果。场景是如果用户搜索某些东西,搜索代码首先会检查该关键字是否在站点核心项目的“关键字”字段中,如果找到它将显示结果,如果没有找到,它将检查标题中的该关键字和描述字段。

现在的问题是 -
尽管关键字字段中有值,但以下条件始终为假并且永远不会给出结果。

var Query = searchContext.GetQueryable<SearchResultItem>()
                .Where(i => (i["keywords"].Contains(SearchQuery)));

标题和描述的相同查询工作正常

var Query2 = searchContext.GetQueryable<SearchResultItem>()
                 .Where(i => (i["title"].Contains(SearchQuery) 
                          || i["description"].Contains(SearchQuery)));

对于每个站点核心项目,我都有标题、描述和关键字字段。

下面是详细代码sn-p。

public class SearchModel
{
    public string SearchQuery { get; set; }

    List<WebSiteSearchResult> lst = new List<WebSiteSearchResult>();

    public IEnumerable<WebSiteSearchResult> SiteSearchResult()
    {
        var searchContext = ContentSearchManager.GetIndex("sitecore_web_index").CreateSearchContext();
        var Query = searchContext.GetQueryable<SearchResultItem>().Where(i => (i["keywords"].Contains(SearchQuery)));
        var result = Query.GetResults();
        if (result.TotalSearchResults != 0)
        {
            //some operations
        }

        else
        {
            var Query2 = searchContext.GetQueryable<SearchResultItem>().Where(i => (i["title"].Contains(SearchQuery) || i["description"].Contains(SearchQuery)));
            var result2 = Query2.GetResults();
            if (result2.TotalSearchResults != 0)
            {
                //some operations
            }
        }

        lst = lst.OrderBy(i => i.itemBoostingRatio).ToList();

        return lst;
    }
}

public class WebSiteSearchResult
{
    public string itemKeywords { get; set; }
    public int itemBoostingRatio { get; set; }
    public string itemTitle { get; set; }
    public string itemDescription { get; set; }
}

还有,这是我的站点核心项目:http://i.stack.imgur.com/liw59.png

【问题讨论】:

  • 您的索引文件是否包含关键字?
  • 您可以直接在索引上检查您的查询吗?您可以在搜索日志中找到查询。还要检查关键字字段是否在索引中-也许还要检查描述字段,因为您的第二个查询可能仅对标题起作用..
  • 试试这个: var Query = searchContext.GetQueryable() .Where(i => (i["keywords"].ToString().Contains(SearchQuery.ToString()))) ;因为可能存在类型不匹配的问题
  • 正如 Ben 在下面描述的那样,您应该以强类型的方式使用您的 WebsiteSearchResult 类的字段。并且还要检查 Solr 中的实际字段名称是否正确 - 例如标题实际上可能是 Solr 中的 title_t。这里有一个基本指南。 bekagool.com/news-and-insights/…

标签: linq solr sitecore


【解决方案1】:

鉴于您的 Sitecore 项目关键字位于 SLT 字段(“贷款、汽车贷款、自行车贷款”)中,请记住,该字段是一个标记化索引。这意味着在存储处理过程中,查询被拆分为使用空格和标点符号作为分隔符的标记,如下所示:


现在,如果我们使用EqualsContains 进行搜索,搜索日志将为我们提供适当的序列化查询以在 solr 中进行测试:

等于?q=keywordstest_t:("bike loan")

  • 这告诉我们在列表中找到与给定值匹配的任何术语。如果我们的任期是"scooter loan",我们将不会得到任何结果。

包含?q=keywordstest_t:(*bike loan*)

  • 这告诉我们返回列表中任何术语包含任何单词/子单词的任何结果项。这不是搜索性能。如果我们的术语是 "scooter L",我们会因为 L 而得到结果。


需要检查的几件事

Sitecore.ContentSearch.Solr.DefaultIndexConfiguration.config 中的此值是否设置为 true?

&lt;indexAllFields&gt;true&lt;/indexAllFields&gt;

为了获得最佳实践,请创建一个继承自 Sitecore 的基础 SearchResultItem 的新搜索结果项类,以便您可以在此实例中使用它直接调用字段属性“关键字”:

public class BasePageSearchResultItem : SearchResultItem
{
    [IndexField("keywords")]
    public string Keywords { get; set; }
}


Equals 查询应该用于在索引字段中查找其中一个

var Query = searchContext.GetQueryable<SearchResultItem>()
            .Where(i => i.Keywords.Equals(SearchQuery));

结果集将取决于要求,由搜索查询 "scooter loan" 指定,并给定示例项目的关键字字段值 "Loans, Car Loan, Bike Loan"

  1. 分别在 scooterloan 上搜索,其中每个搜索查询词都是完全匹配的或包含在索引词中
  2. 整体搜索摩托车贷款

【讨论】:

  • 嗨,本..非常感谢您的帮助。当我用“keywords_t”替换字段“keywords”时,我得到了解决方案。但是,请您解释一下为什么我必须在任何字段中添加“_t”?
  • 我相信这是因为您没有将“关键字”添加为索引字段。此属性确保属性通过 SolrFieldMap。在此“单行文本”站点核心字段的情况下,返回类型设置为“文本”。 Solr 然后知道使用 {0}_t 的 fieldNameFormat 存储此字段。这也会影响查询数据的方式。因此,为什么查询会自动附加上述格式。
  • 非常感谢本。你是一个很大的帮助..得到了所有的答案。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-16
  • 2016-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多