Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Umbraco-检查未在自定义索引集中搜索IndexUserFields_C#_Search_Umbraco_Lucene.net_Examine - Fatal编程技术网

C# Umbraco-检查未在自定义索引集中搜索IndexUserFields

C# Umbraco-检查未在自定义索引集中搜索IndexUserFields,c#,search,umbraco,lucene.net,examine,C#,Search,Umbraco,Lucene.net,Examine,如果我在这里遗漏了一些明显的东西,请提前道歉,因为这是我第一次使用Examine,但我目前正在尝试将jQuery自动完成调用连接到Umbraco中的Examine搜索。我需要在属性字段(“nodeName”)和用户字段(“itemNumber”)中搜索搜索词(通过jquery.autocomplete提供)。搜索使用我在ExamineIndex.config文件中创建的自定义索引集,设置如下: <IndexSet SetName="ProductQuickSearchIndexSet" I

如果我在这里遗漏了一些明显的东西,请提前道歉,因为这是我第一次使用Examine,但我目前正在尝试将jQuery自动完成调用连接到Umbraco中的Examine搜索。我需要在属性字段(“nodeName”)和用户字段(“itemNumber”)中搜索搜索词(通过jquery.autocomplete提供)。搜索使用我在ExamineIndex.config文件中创建的自定义索引集,设置如下:

<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>
这是我遇到麻烦的搜索存储库方法。在查询中,我的目标是在索引集中指定的节点的“nodeName”字段和“itemNumber”字段中检查搜索项。但是,目前,它只搜索“节点名”字段,“项目号”字段几乎被忽略

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();
    }
公共列表ProductQuickSearch(字符串搜索术语)
{
var Searcher=ExamineManager.Instance.SearchProviderCollection[“ProductQuickSearcher”];
var searchCriteria=Searcher.CreateSearchCriteria(检查.searchCriteria.BooleanOperation.Or);
var query=searchCriteria.Field(“nodeName”,searchTerm.)或();
返回Searcher.Search(query).OrderByDescending(x=>x.Score).ToList();
}
非常感谢您的帮助。提前谢谢


编辑
出于某种原因,itemNumber字段似乎正在触发匹配,但仅当查询是精确匹配时。例如,如果项目编号的示例为M100.50-000-AE,我可以获得要显示的正确项目,但前提是我的搜索查询为“M100.50-000-AE”,并且没有任何小于该值的内容,甚至没有“M100.50-000-A”。因此,在查询“我是如何拥有它的”时,使用“包含”方法搜索nodeName,但itemNumber只按精确匹配进行搜索。

首先,检查自定义索引以确定字段是否在其中。要执行此操作,请转到开发人员部分并单击“检查管理”选项卡。从索引器列表中选择索引,选择“用户字段”,然后检查是否列出了自定义字段

接下来,点击搜索器,并尝试搜索一个应该设置该字段的页面,您应该能够看到搜索结果中的字段是否正确


如果它没有出现,这是索引本身的问题,否则,它可能是代码中的某些内容,尽管代码看起来还可以。搜索词是否应该与itemNumber字段匹配?

我进入“检查管理”选项卡,用户字段显示在那里。我一直试图显示的示例项目编号是“MSA2.7S-000-DM”。使用搜索程序和我自己的代码,我发现,出于某种原因,itemNumber用户字段仅在存在精确匹配时才起作用。例如,如果我搜索“MSA2.7S-000-DM”,它会工作,但不会搜索“MSA2.7S-000”。这让我相信查询本身有问题?如果您想要部分匹配,您需要告诉查询使用通配符。有一种扩展方法可应用于searchTerm变量,称为MultipleCharacterWildcard()。因此,要获得部分匹配,请将代码中的searchTerm替换为searchTerm.MultipleCharacterWildcard();您可能需要为umbracoInspect.SearchCriteria.LuceneSearchExtensions添加using语句。
searchTerm.MultipleCharactersWaldCard()
在只有一个字段处于活动状态时为我提供了所需的行为,但在我使用.Or()方法链接字段时无效;甚至当我在每个searchTerm参数上调用.multipleCharactersWaldcard时。看起来只需将搜索词传递给重载的搜索方法,就可以获得所需的行为,尽管我不确定这与构建查询之间的功能区别是什么:
Searcher.search(searchTerm,true)
。顺便谢谢你的帮助。我没有足够的代表投票。我相信searcher方法将搜索索引中的所有可用字段。:)
public JsonResult ProductQuickSearch(string term)
    {
        var searchResults = searchRepository.ProductQuickSearch(term);
        // Process results, send back through JSON
    }
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();
    }