Umbraco - 使用Examine 搜索Umbraco.Tags

问题描述 投票:0回答:2

我有一个 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 数据类型,肯定有办法搜索它。

umbraco lucene.net umbraco7 umbraco6 umbraco-blog
2个回答
4
投票

是的,你说得对,我得到 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();

希望这对其他人有帮助。


2
投票

所有这些都与标签值中的逗号有关。 Lucene 中的标准分析器(检查)会将其视为一个值。

听起来您知道该怎么做 - 您将需要使用检查索引器的 GatheringNodeData 事件,以便在索引中创建一个字段,其中逗号替换为空格 - 然后 Lucene 将正确索引该属性。 每当发布内容但在将内容插入索引之前,都会发生 GatheringNodeData 事件

© www.soinside.com 2019 - 2024. All rights reserved.