0

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

4

2 回答 2

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);
    }
}

然后,当您创建搜索查询时,您在 topicTagsIndexed 字段中搜索

SearchCriteria.Field("pagetitle", searchTerm).Or().Field("topicTagsIndexed", searchTerm).Compile();

希望这对其他人有帮助。

于 2014-11-11T09:52:03.987 回答
2

全部与标记值中的逗号有关。Lucene 中的标准分析器(检查)会将其视为一个值。

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

于 2014-11-10T23:58:05.050 回答