1

这是我第一次使用检查 - 到目前为止这是有效的,results变量具有正确的数据,但是我想要做的是添加searchTerm我想要搜索当前返回的所有节点的所有字段的变量results

有任何想法吗?- 提前致谢。

var searchEngine = ExamineManager.Instance.SearchProviderCollection["ExternalSearcher"];
var criteria = searchEngine.CreateSearchCriteria(BooleanOperation.Or);

IBooleanOperation query = criteria.NodeTypeAlias("level1")
.Or().NodeTypeAlias("level2")
.Or().NodeTypeAlias("simpleTextPage")
.Or().NodeTypeAlias("contactPage")
.Or().NodeTypeAlias("Locationfinder");

string searchTerm = "Term to Search for here";

var results = searchEngine.Search(query.Compile());
4

1 回答 1

3

这个答案有两个部分。首先,您需要指定要搜索的字段:

.Or().Field("bodyText", searchTerm)

这假设您的页面具有bodyText属性。您可以在其上附加其他字段以搜索其他属性,例如名称、introText 等。

其次,如果要搜索所有字段,则需要创建一个字段,其中包含被索引页面中的所有文本内容。你需要:

  1. 创建一个实现的 Umbraco 事件IApplicationEventHandler
  2. 添加用于收集节点数据的处理程序:

    void OnApplicationStarted(UmbracoApplicationBase app, ApplicationContext ctx)
    {
        ExamineManager.Instance
                      .IndexProviderCollection["ExternalIndexer"]
                      .GatheringNodeData += OnGatheringNodeData;
    }
    
  3. 创建您的组合字段:

    protected void OnGatheringNodeData(object sender, IndexingNodeDataEventArgs e)
    {
        var builder = new StringBuilder();
        foreach (var entry in e.Fields)
        {
            builder.AppendFormat("{0}, ", entry.Value);
        }
    
        e.Fields.Add("combinedText", builder.ToString());
    }
    
    1. 将您的搜索更改为.Or().Field("combinedText", searchTerm);

现在每次发布页面时,它将所有字段合并为一个,以便可以按照您希望的方式搜索它们。

但是,就个人而言,我建议您选择要组合的特定字段,因为很少需要组合所有字段。这通常表明您的文档类型几乎没有一致性。出于这样的原因,我总是在所有文档类型中使用通用别名,例如 bodyText、introText、summaryText 等。这样,如果需要,我可以过滤掉以“Text”结尾的字段或将别名作为静态字符串。

于 2014-10-02T11:12:01.493 回答