使用 API 难以在整数字段上搜索 Kentico 智能搜索索引

Difficulty searching Kentico smart search index on integer field using API

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

阅读 documentation 我发现需要使用特定语法搜索像这样的整数字段:

+DocumentCreatedByUserID;(int)53;Administrator

但是,当我将此字符串作为 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);

同样的代码适用于文本字段搜索查询。谁能解释一下:

  1. 有什么明显的错误吗?
  2. +DocumentCreatedByUserID;(int)53;Administrator 查询最后一部分的目的是什么。为什么我需要在这里传递文本值?

我实际要搜索的字段是一个名为 newstypeid 的自定义页面类型字段,我可以看到它以相同的方式将其值存储在索引中(例如,值 34 存储为 10000000034)。

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

更新解决方案

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

    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 class。此 class 具有将特定数据类型值(int、datetime 等)转换为搜索词构造的字符串表示形式的静态方法。