Azure cognitive search 使用Lucene查询语法的Azure搜索返回不正确的结果

Azure cognitive search 使用Lucene查询语法的Azure搜索返回不正确的结果,azure-cognitive-search,Azure Cognitive Search,我正在使用Microsoft.Azure.Search.NET SDK v5.0.1。我正试图对我的Azure搜索索引执行如下搜索:Documents.SearchAsync(“字段名:val*和时间戳:2018-05-03T13 \:23 \:59Z”)。结果是不正确的。我的索引中正好有两个文档带有该时间戳。我的索引中有121个文档,其中字段名以val开头。当我使用SDK运行上述查询时,它总是返回121个文档。有什么特殊的方法可以查询我丢失的时间戳吗?这里有几点需要说明: 在索引定义中,我相信

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

这里有几点需要说明:

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

  • 您的场景似乎是一个基于条件的“筛选”结果的典型案例,然后是对筛选文档的“搜索”。要完成此操作,您需要执行以下操作:

    • 在时间戳上使用过滤器,这样它就不会经过分析
    • 在筛选结果上,应用搜索查询
  • 但是,我强烈建议,如果可能,您应该将
    timeStamp
    列设置为datetime,以获得更合理的语义

  • 例如,下面是如何实现过滤器+搜索组合:

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

    非常感谢。你的回答正是我所害怕的。由于内部原因,我们很难将过滤和搜索文本结合起来。不过,我明白你的意思。我将把这个标记为答案,因为它是。我将尝试修改时间戳类型(您是正确的,它是一个字符串)。我很好奇为什么您很难将searchText和筛选器结合起来。是不是因为你有时需要把这些条件或条件放在一起,而不是和它们在一起?