使用Examine Manager搜索内容

时间:2014-10-01 13:49:29

标签: c# lucene umbraco examine

这是我第一次使用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());

1 个答案:

答案 0 :(得分:3)

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

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

这假设您的网页具有bodyText属性。您可以在此附加其他字段以搜索其他属性,例如name,introText等。

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

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

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

    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);
  5. 现在,每次发布一个页面时,它都会将所有字段合并为一个字段,以便可以按照您希望的方式进行搜索。

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