【发布时间】:2016-05-18 13:05:01
【问题描述】:
我有一个使用标准分析器的 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));
}
【问题讨论】:
-
我遇到了完全相同的问题,但您的解决方案对我不起作用。在我的任何 int 字段上进行任何搜索时,我仍然没有从 API 获得任何结果,即使查询在 Luke 工具中有效。