我正在尝试使用 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_s
not category_t
。因此返回了零个结果。
更新 – #1
我也检查了搜索谓词和搜索模型。
[IndexField("category_t")] public virtual string Category { get; set; }
搜索模型正在引用。我在搜索模型制作中而不是中category_t
进行了更改。category_s
category_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 types
Sitecore 架构中类别字段的所有组合。您可以请求上述 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
。
希望这有帮助!!!如果您有任何疑问,请告诉我。
|
|