使用 Lucene 查询语法的 Azure 搜索 Returns 不正确的结果

Azure Search using Lucene Query Syntax Returns Incorrect Results

我正在使用 Microsoft.Azure.Search .NET SDK v5.0.1。我正在尝试对我的 Azure 搜索索引执行如下搜索:Documents.SearchAsync("fieldname:val* AND timeStamp:2018-05-03T13\:23\:59Z")。结果不正确。我的索引中正好有 2 个文档具有该时间戳。我的索引中有 121 个文档,其中字段名以 val 开头。当我运行使用SDK进行上述查询时,总是returns121个文件。是否有一些特殊的方法来查询我缺少的时间戳?

这里有几点需要说明:

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

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

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

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

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