Umbraco - 使用Examine搜索Umbraco.Tags

时间:2014-11-10 15:47:41

标签: umbraco lucene.net umbraco7 umbraco6 umbraco-blog

我有一个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数据类型,当然有一种方法可以搜索它。

2 个答案:

答案 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();

希望这有助于其他人。