使用Lucene查询语法的Azure搜索返回错误结果

时间:2018-07-05 12:36:06

标签: azure-search

我正在使用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个文档。有什么特殊的查询时间戳的方法吗?

1 个答案:

答案 0 :(得分: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);