1

嗨,我在Umbraco 7上进行了搜索,它工作正常,但我必须在索引中添加很多搜索字段,这不切实际。如何搜索所有字段?

@{ string searchQuery = Request["query"]; if (String.IsNullOrWhiteSpace(searchQuery)) { searchQuery = ""; }

var searcher = ExamineManager.Instance;
var searchCriteria = searcher.CreateSearchCriteria();

var query = searchCriteria.GroupedOr(new[] { 
"nodeName", 
//"packSizes",
"name", 
"title", 
"bodyText", 
"body",
"field1",
"field2",
"field3",
"field4",
"field5",
"field6" 
 }, searchQuery).Compile();
var SearchResults = searcher.Search(query).Where(x => x["__IndexType"] == "content").ToList(); } @if (SearchResults.Any()) {
<ul class="search-results-box">
    @foreach (var result in SearchResults)
    {
        var node = Umbraco.TypedContent(result.Id);
        var pathIds = result["__Path"].Split(',');
        var path = Umbraco.TypedContent(pathIds).Where(p => p != null).Select(p => new { p.Name }).ToList();

        if (node != null)
        {
            <li><a href="@node.Url">@node.Name</a></li>
        }
    }
</ul> }
4

1 回答 1

1

您可以在索引命令中添加一个事件,以便在索引时将所有字段连接到一个大字段中,然后只搜索那个字段。

要挂钩事件,请在 OnApplicationStarting 事件处理程序中执行以下操作:

ExamineManager.Instance.IndexProviderCollection["YOUR INDER NAME HERE"].GatheringNodeData += SetSiteSearchFields;

然后对于函数,您可以执行以下操作,将所有字段组合成一个字段:

void SetSiteSearchFields(object sender, IndexingNodeDataEventArgs e)
    {
        //grab some fields
        var combined = e.Fields["field1"] + " " + e.Fields["field2"];

        //add as new field
        e.Fields.Add("searchField", combined);
    }

然后,这将为您提供一个名为“searchField”的字段,您可以搜索该字段,从而使您的搜索更加简单。

于 2015-10-27T16:14:55.303 回答