使用 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);
同样的代码适用于文本字段搜索查询。谁能解释一下:
- 有什么明显的错误吗?
+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 等)转换为搜索词构造的字符串表示形式的静态方法。
我有一个使用标准分析器的页面智能搜索索引。当我在 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 为我指明了正确的方向。以下方法将 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 等)转换为搜索词构造的字符串表示形式的静态方法。