我有一个 umbraco 文档类型,其字段类型为 Umbraco.Tags。
使用检查来搜索字段,如下所示:
var searchEngine = ExamineManager.Instance.SearchProviderCollection["ExternalSearcher"];
var searchCriteria = searchEngine.CreateSearchCriteria(BooleanOperation.Or);
var query = searchCriteria.Field("title", searchTerm)
.Or().Field("topicTags", searchTerm).Compile();
var results = searchEngine.Search(query);
我知道该值在 topicTags 内,但结果是 0...
有什么想法吗?
更新:事实证明找不到结果的原因是因为 Umbraco.Tags 数据类型存储这样的数据:tag1,tag2,tag3 没有空格,所以 tag1 不在索引中,我必须搜索“tag1” ,tag2,tag3”来获得点击。
看起来我可能必须劫持检查索引事件并更改数据索引的方式。
这些是内置的 umbraco 数据类型,肯定有办法搜索它。
是的,你说得对,我得到 0 的原因是标签是这样存储的:
tag1,tag2,tag3.
没有空格。
因此 tag1、tag2、tag3 会导致命中,但 tag1 不会。
解决方案是挂钩 umbraco 发布事件并更改该字段的索引方式。解决方案:
public class ExamineEvents : ApplicationStartupHandler
{
public ExamineEvents()
{
ExamineManager.Instance.IndexProviderCollection["ExternalIndexer"].GatheringNodeData +=
ExamineEvents_GatheringNodeData;
}
private void ExamineEvents_GatheringNodeData(object sender, IndexingNodeDataEventArgs e)
{
if (e.IndexType != IndexTypes.Content) return;
// Node picker values are stored as csv which will not be indexed properly
// We need to write the values back into the index without commas so they are indexed correctly
var fields = e.Fields;
var searchableFields = new Dictionary<string, string>();
foreach (var field in fields)
{
switch (field.Key)
{
case "topicTags":
var searchableFieldKey = "topicTagsIndexed";
var searchableFieldValue = field.Value.Replace(',', ' ');
if (!string.IsNullOrEmpty(searchableFieldValue))
{
searchableFields.Add(searchableFieldKey, searchableFieldValue);
}
break;
}
}
foreach (var fld in searchableFields)
{
e.Fields.Add(fld.Key, fld.Value);
}
}
然后,当您创建搜索查询时,您将在 topicTagsIndexed 字段中进行搜索
SearchCriteria.Field("pagetitle", searchTerm).Or().Field("topicTagsIndexed", searchTerm).Compile();
希望这对其他人有帮助。
所有这些都与标签值中的逗号有关。 Lucene 中的标准分析器(检查)会将其视为一个值。
听起来您知道该怎么做 - 您将需要使用检查索引器的 GatheringNodeData 事件,以便在索引中创建一个字段,其中逗号替换为空格 - 然后 Lucene 将正确索引该属性。 每当发布内容但在将内容插入索引之前,都会发生 GatheringNodeData 事件