Umbraco - 检查不在自定义IndexSet中搜索IndexUserFields

时间:2016-04-06 15:01:08

标签: c# search umbraco lucene.net examine

如果我错过了一些显而易见的事情,请提前道歉,因为这是我第一次使用Examine,但我目前正在尝试将jQuery自动完成调用连接到检查搜索一把umbraco。我需要检查在属性字段(" nodeName")和用户字段(" itemNumber")中搜索搜索词(通过jquery.autocomplete提供)。搜索使用我在ExamineIndex.config文件中创建的自定义IndexSet,并设置如下:

<IndexSet SetName="ProductQuickSearchIndexSet" IndexPath="~/App_Data/TEMP/ExamineIndexes/{machinename}/ProductQuickSearchIndex/">
  <IndexAttributeFields>
    <add Name="id" />
    <add Name="nodeName"/>
    <add Name="nodeTypeAlias" />
  </IndexAttributeFields>
  <IndexUserFields>
    <add Name="itemNumber"/>
  </IndexUserFields>
  <IncludeNodeTypes>
    <add Name="Product" />
    <add Name="Item" />
  </IncludeNodeTypes>
</IndexSet>

我还在ExamineSettings.config文件中设置了一个IndexProvider和一个SearchProvider,它们都绑定到这个IndexSet。

<!-- IndexProvider -->
<add name="ProductQuickSearchIndexer" type="UmbracoExamine.UmbracoContentIndexer, UmbracoExamine"
      supportUnpublished="false"
      supportProtected="true"
      analyzer="Lucene.Net.Analysis.Standard.StandardAnalyzer, Lucene.Net"
      indexSet="ProductQuickSearchIndexSet"/>

<!-- Search Provider -->
<add name="ProductQuickSearcher" type="UmbracoExamine.UmbracoExamineSearcher, UmbracoExamine"
 analyzer="Lucene.Net.Analysis.Standard.StandardAnalyzer, Lucene.Net" indexSet="ProductQuickSearchIndexSet"/>

jQuery自动完成调用被路由到处理请求的控制器,并使用搜索存储库实际执行检查搜索:

public JsonResult ProductQuickSearch(string term)
    {
        var searchResults = searchRepository.ProductQuickSearch(term);
        // Process results, send back through JSON
    }

以下是我遇到问题的搜索存储库方法。在查询中,我的目标是在&#34; nodeName&#34;中检查搜索词。字段和&#34; itemNumber&#34;我在IndexSet中指定的节点的字段。但是,目前,只搜索&#34; nodeName&#34;字段和&#34; itemNumber&#34;字段几乎被忽略

public List<SearchResult> ProductQuickSearch(string searchTerm)
    {
        var Searcher = ExamineManager.Instance.SearchProviderCollection["ProductQuickSearcher"];
        var searchCriteria = Searcher.CreateSearchCriteria(Examine.SearchCriteria.BooleanOperation.Or);
        var query = searchCriteria.Field("nodeName", searchTerm).Or().Field("itemNumber", searchTerm).Compile();
        return Searcher.Search(query).OrderByDescending(x => x.Score).ToList();
    }

感谢任何和所有帮助。提前谢谢!

修改

看起来,由于某种原因,itemNumber字段正在触发匹配,但仅在查询完全匹配时。例如,如果项目编号的示例是M100.50-000-AE,我可以显示正确的项目,但仅当我的搜索查询是&#34; M100.50-000-AE&#34;而不是那个,甚至不是&#34; M100.50-000-A&#34;。因此,通过查询我的方式,使用&#34; contains&#34;来搜索 nodeName 。方法,但 itemNumber 仅按完全匹配进行搜索。

1 个答案:

答案 0 :(得分:0)

首先,检查您的自定义索引以确定该字段在那里。要执行此操作,请转到开发人员部分,然后单击&#34;检查管理&#34;标签。从索引器列表中选择索引,选择&#34; user fields&#34;然后检查您的自定义字段是否已列出。

接下来,点击搜索器,尝试搜索应该设置该字段的页面,您应该能够看到搜索结果中的字段。

如果它没有显示,那么索引本身就会出现问题,否则,它可能是您代码中的内容,尽管您的代码看起来还不错。搜索词是否应该在itemNumber字段中匹配?