使用“检查管理器”搜索内容
本文关键字:搜索 检查管理器 检查 管理器 使用 | 更新日期: 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等。
其次,如果您想在所有字段中搜索,则需要创建一个字段,该字段包含正在索引的页面中的所有文本内容。您需要:
- 创建一个实现
IApplicationEventHandler
的Umbraco事件 -
添加用于收集节点数据的处理程序:
void OnApplicationStarted(UmbracoApplicationBase app, ApplicationContext ctx) { ExamineManager.Instance .IndexProviderCollection["ExternalIndexer"] .GatheringNodeData += OnGatheringNodeData; }
-
创建组合字段:
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()); }
- 将您的搜索更改为
.Or().Field("combinedText", searchTerm)
- 将您的搜索更改为
现在,每次发布页面时,它都会将所有字段合并为一个字段,以便以您希望的方式进行搜索。
然而,就我个人而言,我建议您选择特定的字段进行组合,因为很少需要组合所有字段。这通常表明您的文档类型几乎没有一致性。出于这样的原因,我总是在所有文档类型中使用常见的别名,例如bodyText、introText、summaryText等。这样,如果需要,我可以过滤掉以"Text"结尾的字段,或者将别名作为静态字符串。