使用“检查管理器”搜索内容

本文关键字:搜索 检查管理器 检查 管理器 使用 | 更新日期: 2023-09-27 18:25:23

这是我第一次使用Examine-到目前为止,这是有效的,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());

使用“检查管理器”搜索内容

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

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

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

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

  1. 创建一个实现IApplicationEventHandler的Umbraco事件
  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"结尾的字段,或者将别名作为静态字符串。