难以使用API​​

时间:2016-05-18 13:05:01

标签: asp.net lucene kentico

我有一个使用标准分析器的Pages智能搜索索引。当我在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查询的最后部分的目的是什么?我为什么需要在这里传递文本值?
  3. 我实际想要搜索的字段是一个名为newstypeid的自定义页面类型字段,我可以看到它在索引中以相同的方式存储其值(例如,值34存储为10000000034)。

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

    更新解决方案

    感谢@ 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));
        }
    

2 个答案:

答案 0 :(得分:2)

我认为您应该使用命名空间 CMS.Search 中的 SearchValueConverter 类。此类具有静态方法,用于将特定数据类型值(int,datetime等)转换为搜索术语构造的字符串表示形式。

答案 1 :(得分:1)

你可以尝试使用这样的东西来转换searchQuery?:

var condition = new SearchCondition(null, searchModeEnum, SearchOptionsEnum.FullSearch);

searchQuery = SearchSyntaxHelper.CombineSearchCondition(searchText, condition);

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