【问题标题】:Difficulty searching Kentico smart search index on integer field using API使用 API 在整数字段上搜索 Kentico 智能搜索索引的困难
【发布时间】: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);

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

  1. 有什么明显的我做错了吗?
  2. +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 工具中有效。

标签: asp.net lucene kentico


【解决方案1】:

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

【讨论】:

  • 真的很有帮助。你说得对,这是一个更优雅的解决方案。非常感谢。
  • 啊,不错的方法:)
【解决方案2】:

你可以尝试使用类似的东西来转换searchQuery吗?:

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

searchQuery = SearchSyntaxHelper.CombineSearchCondition(searchText, condition);

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

【讨论】:

  • 非常感谢。您的建议帮助我找到了解决方案。有关实现您建议的解决方案的代码,请参阅我的 OP 的编辑:)
  • 太棒了,我很高兴它有帮助:) 这是一个相当广泛的猜测,因为我目前无法测试它。
猜你喜欢
  • 1970-01-01
  • 2023-03-25
  • 2020-08-23
  • 1970-01-01
  • 1970-01-01
  • 2012-08-07
  • 1970-01-01
  • 2015-02-11
  • 2010-12-25
相关资源
最近更新 更多