我有一个使用标准分析器的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);
此相同的代码适用于文本字段搜索查询。任何人都可以解释:
+DocumentCreatedByUserID;(int)53;Administrator
查询的最后部分的目的是什么?我为什么需要在这里传递文本值?我实际想要搜索的字段是一个名为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));
}
答案 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中的其他一些方法也很有用。