我有一个umbraco doctype,字段类型为Umbraco.Tags。
使用check来搜索这样的字段:
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 :(得分:2)
所有与标记值中的逗号有关。 Lucene中的标准分析仪(检查)会将其视为一个值。
听起来你知道该怎么做 - 你需要使用Examine索引器的GatheringNodeData事件,以便在索引中创建一个用空格替换逗号的字段 - 然后Lucene将正确地索引该属性。 每当发布内容时,就在内容插入索引
之前,就会发生GatheringNodeData事件答案 1 :(得分:2)
是的你的权利,我得到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);
}
}
然后,当您创建搜索查询时,请在主题标签索引
中搜索SearchCriteria.Field("pagetitle", searchTerm).Or().Field("topicTagsIndexed", searchTerm).Compile();
希望这有助于其他人。