我正在尝试使用 Solr 搜索上下文获取文章列表。这是尝试获取结果的代码块。

var searchIndex = ContentSearchManager.GetIndex(indexName); // Get the search index
var searchPredicate = GetSearchPredicate(false, speciality, category, 
filterModel.Specific_Speciality, true); // Build the search predicate
using (var searchContext = searchIndex.CreateSearchContext()) // Get a context of the 
search index
{
    var searchResults = (IQueryable<SearchModel>)null;
{

    searchResults = searchContext.GetQueryable<SearchModel>().Where(searchPredicate).OrderByDescending(i => i.CreatedOn);//.Where(searchPredicate)
    searchResults = searchResults.Where(i => i.Category.Equals(category) && i.Category != "Cardio news").Take(count);
}
var fullResults = searchResults.GetResults();

fullResults执行后包含零个结果。

我检查了Search.Config以获取 Solr 查询。

?q=((category_t:("News") AND _templatename:("News Article")) AND _latestversion:("True")) AND _val_:__boost&start=4&rows=4&fl=*,score&fq=_indexname:(sitecore_master_index)&wt=xml&sort=createddate_tdt desc

我在 Solr 中执行了此查询,结果返回了零个结果。当我在 Solr 索引中搜索时category_t,我注意到 category 字段被索引为category_snot category_t。因此返回了零个结果。

更新 – #1

我也检查了搜索谓词和搜索模型。

[IndexField("category_t")] public virtual string Category { get; set; }

搜索模型正在引用。我在搜索模型制作中而不是中category_t进行了更改category_scategory_t

另外,我的谓词代码指的是category_s字段。

更新模型后,我确实重新启动了 IIS 并重建了索引。

我仍然在Search.Config文件中看到相同的查询。


最佳答案
3

搜索不起作用,因为类别字段设置为字符串而不是文本。这就是您没有得到任何结果的原因。

要解决此问题,请修改查询以使用正确的字段名称。

1. 更新 Solr 查询:将搜索谓词更改为使用category_s而不是category_t

2. 调整代码:修改构建搜索谓词的代码块,以确保它引用 category_s。例如,如果您有如下内容:

searchPredicate = searchPredicate.AndAlso(i => i.Category.Equals(category));

确保Category引用正确的字段类型(字符串)。

3. 检查架构配置:如果您可以控制 Solr 架构,则可能需要验证是否category_t应该对数据进行索引,并可能重新索引数据。但如果category_s是搜索操作的预期字段,请坚持使用它。

4. 重新索引:如果对架构进行了更改,请确保重新索引数据,以便反映最新的配置。

完成这些更改后,请尝试再次搜索。如果文件在那里,您现在应该能够找到它们。

希望这有帮助!

根据您提供的信息,结果为零的主要原因是 Solr 中预期的字段类型category_t与实际索引的字段类型不一致category_s。这种不匹配导致搜索查询无法正确匹配所需的文档。

确保在 Solr 架构中使用正确的类型定义了类别字段category_t。这将允许在类别字段上进行正确的基于文本的搜索和过滤。

仔细检查您的 Solr 配置,确保类别字段已正确索引。如有必要,请重新索引您的数据以反映更新后的字段类型。

更新后,尝试使用仅针对此类类别字段的简单搜索查询。

searchResults = searchContext.GetQueryable<SearchModel>().Where(i => i.Category == category).Take(count);

如果此查询返回结果,则确认问题在于附加的过滤或排序条件。

希望这有帮助。

Sitecore 在对 Solr 进行搜索之前内部使用以下内容Solr Query来确定field type

/select?q=_name:(category)&fq=_templatename:("Template+field")

这将返回field typesSitecore 架构中类别字段的所有组合。您可以请求上述 URL 来获取 CMS 上创建的所有类别字段组合。

为了解决这个问题,您可以添加以下配置以确保在 Solr 中存储类别字段时使用文本类型进行解析。

<configuration>
    <sitecore>
         <contentSearch>
           <indexConfigurations>
                <defaultSolrIndexConfiguration>
                     <fieldMap type="Sitecore.ContentSearch.SolrProvider.SolrFieldMap, Sitecore.ContentSearch.SolrProvider">
                        <fieldNames hint="raw:AddFieldByFieldName">
                         <field fieldName="category" returnType="text" />
                        </fieldNames>
                     </fieldMap>
                </defaultSolrIndexConfiguration>
            </indexConfigurations>
        </contentSearch>
    </sitecore>
</configuration>

一旦添加了这些更改,您就可以重新索引这些项目,并且它们将以名称存储category_t在索引中。

注意:模型上不需要添加后缀_t。它将由自动解析Content Search API

希望这有帮助!!!如果您有任何疑问,请告诉我。