【问题标题】:Azure Search using Lucene Query Syntax Returns Incorrect Results使用 Lucene 查询语法的 Azure 搜索返回不正确的结果
【发布时间】:2018-07-06 01:59:06
【问题描述】:

我正在使用 Microsoft.Azure.Search .NET SDK v5.0.1。我正在尝试对我的 Azure 搜索索引执行如下搜索:Documents.SearchAsync("fieldname:val* AND timeStamp:2018-05-03T13\:23\:59Z")。结果不正确。我的索引中恰好有 2 个带有该时间戳的文档。我的索引中有 121 个文档,其中字段名以 val 开头。当我使用 SDK 运行上述查询时,它总是返回 121 个文档。有什么特殊方法可以查询我遗漏的时间戳吗?

【问题讨论】:

    标签: azure-cognitive-search


    【解决方案1】:

    这里有几点要说明:

    1. 在您的索引定义中,我相信您已将 timeStamp 设置为字符串。否则,您将无法进行搜索查询,因为 DateTime 字段不可搜索。首先,我建议不要将timeStamp 视为字符串。这是因为可搜索字段经过了一系列分析(标记化就是其中之一)Reference on query parsing。在您的情况下,timestamp 查询(例如2018-05-03)将被标记为更小的成分(2018、05、03),并且将返回包含任何这些术语的文档。这就是为什么你观察你所看到的。

    2. 您的场景似乎是基于条件“过滤”结果的经典案例,然后对过滤后的文档进行“搜索”。为此,您需要执行以下操作:

      • 对时间戳使用过滤器,使其不经过分析
      • 在过滤后的结果中,应用您的搜索查询。
      • Reference
    3. 但我强烈建议,如果可能,您应该将 timeStamp 列设置为日期时间,以获得更合理的语义。

    例如,以下是实现过滤器 + 搜索组合的方法:

    parameters = new SearchParameters() 
    {
       Filter = "timeStamp eq '2018-05-03'"
    };
    Documents.SearchAsync("fieldname:val*", parameters);
    

    【讨论】:

    • 谢谢。你的回答是我害怕的。由于内部原因,我们很难将 Filter 和 searchText 结合起来。不过,我明白你在说什么。我会将其标记为答案,因为它是。我会修改时间戳类型(你是对的;它是一个字符串)。
    • 我很好奇为什么你很难将 searchText 和过滤器结合起来。是因为您有时需要将这些条件组合在一起而不是 AND 吗?
    猜你喜欢
    • 2019-05-12
    • 1970-01-01
    • 1970-01-01
    • 2018-08-03
    • 1970-01-01
    • 1970-01-01
    • 2014-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多