Asp.net 使用API在整数字段上搜索Kentico智能搜索索引有困难

Asp.net 使用API在整数字段上搜索Kentico智能搜索索引有困难,asp.net,lucene,kentico,Asp.net,Lucene,Kentico,我有一个使用标准分析器的页面智能搜索索引。当我检查Luke中生成的索引时,我可以看到整数字段具有特定的格式。例如,全局管理员创建的所有页面都将documentcreatedbyuserid字段设置为1000000053 阅读本文时,我发现需要使用特定语法搜索类似的整数字段: +DocumentCreatedByUserID;(int)53;管理员 但是,当我将这个字符串作为searchQuery变量传递给下面的代码时,我没有得到任何结果 // Get search results

我有一个使用标准分析器的页面智能搜索索引。当我检查Luke中生成的索引时,我可以看到整数字段具有特定的格式。例如,全局管理员创建的所有页面都将
documentcreatedbyuserid
字段设置为
1000000053

阅读本文时,我发现需要使用特定语法搜索类似的整数字段:

+DocumentCreatedByUserID;(int)53;管理员

但是,当我将这个字符串作为
searchQuery
变量传递给下面的代码时,我没有得到任何结果

        // Get search results
        var parameters = new SearchParameters()
        {
            AttachmentOrderBy = "",
            AttachmentWhere = "",
            CheckPermissions = false,
            ClassNames = null,
            CombineWithDefaultCulture = false,
            CurrentCulture = this.Context.CultureCode,
            DefaultCulture = CultureHelper.GetDefaultCultureCode(this.Context.SiteName),
            DisplayResults = resultsPerPage,
            NumberOfProcessedResults = 100,
            Path = startPath,
            SearchFor = searchQuery,
            SearchInAttachments = false,
            SearchIndexes = index,
            SearchSort = sort,
            StartingPosition = (page - 1) * resultsPerPage,
            User = this.Context.User.UserInfo
        };

        ds = CMS.Search.SearchHelper.Search(parameters);
同样的代码也适用于文本字段搜索查询。谁能解释一下:

  • 有什么明显的我做错了吗
  • +DocumentCreatedByUserID最后一部分的目的是什么;(int)53;管理员
    查询。为什么我需要在这里传递文本值
  • 我实际上想要搜索的字段是一个名为newstypeid的自定义页面类型字段,我可以看到它在索引中以相同的方式存储其值(例如,值34存储为1000000034)

    在Luke中,如果我查询
    +newstypeid:1000000034
    ,我会得到结果。所以,也许一个更简单的解决方案是找到一种将整数转换成Lucene格式的方法?(即34至1000000034)

    使用解决方案更新

    感谢@richard-Šůstek为我指明了正确的方向。以下方法将以所需格式返回搜索子句:

        protected string GetIntegerIdClause(string field, int id)
        {
            var condition = string.Format("{0}:(int){1}", field, id).ToLower();
    
            return SearchSyntaxHelper.CombineSearchCondition(null, new SearchCondition(condition, SearchModeEnum.ExactPhrase, SearchOptionsEnum.NoneSearch));
        }
    

    您是否可以尝试使用类似的方法来转换
    searchQuery

    var condition = new SearchCondition(null, searchModeEnum, SearchOptionsEnum.FullSearch);
    
    searchQuery = SearchSyntaxHelper.CombineSearchCondition(searchText, condition);
    

    我注意到Kentico在将值从搜索文本框传递到SearchParameters时在内部调用此方法。但是我还没有机会测试这个。也许SearchSyntaxHelper中的其他方法也会有用。

    我认为您应该使用命名空间CMS.Search中的SearchValueConverter类。这个类有静态方法将特定的数据类型值(int、datetime等)转换为它的字符串表示形式,以便构建搜索词。

    非常感谢。你的建议帮助我找到了解决办法。请参阅对我的OP的编辑,以获取实现您建议的解决方案的代码:)太棒了,我很高兴它有帮助:)这是一个相当广泛的猜测,因为我目前无法测试它。非常有用。你说得很对,这是一个更优雅的解决方案。非常感谢。啊,很好的方法:)我有完全相同的问题,但你的解决方案对我不起作用。即使查询在Luke工具中工作,我仍然无法从API中获得任何int字段的搜索结果。