过滤 Elasticsearch 结果 - Nest

Filtering Elasticsearch Results - Nest

我目前想编写一个匹配 'name' 的查询,来自 class 调用的实体,然后过滤出与 guid 字段(在 ES 中存储为字符串)进行比较的结果字符串 guid 列表。如果存储在 Elasticsearch 记录中的 guid 与 guid 列表中的任何匹配,则 return 这些结果。

我为此编写的代码是:

        ISearchResponse<Entity> oResponse = null;

        oResponse = _client.Search<Entity>(s => s
       .Size(oReq.returnValue)
       .Query(qr => qr
            .Bool(b => b
                 .Filter(flt => flt.Terms(tms => tms.Field(fd => fd.extentUid).Terms<string>(oReq.extentUids.ToList())))
                 .Should(sh => sh
                      .Match(mt => mt.Field(fl => fl.name.ToLower()).Query(oReq.name.ToLower())))))
            .Sort(srt => srt.Descending(SortSpecialField.Score)));

当我确定很多 Elasticsearch 记录的 guid 与列表中的一个匹配时,以下代码 returns 0 结果。有人可以帮忙吗?

注意:在代码中,我首先过滤记录,但我尝试将其放在 .Should() 之后,并且我尝试使用 .PostFilter()。

提前致谢,

加里

我会检查您的映射并确保您的 guid 字段未被分析。如弹性搜索中所示 Finding Exact Values, if the field is analyzed, each group separated by a - will be considered a different token. A terms query 表示它

Filters documents that have fields that match any of the provided terms (not analyzed).

这意味着它不会分析您提供给它的字符串,并在指定字段上查询那些未分析的字符串。如果您的字段被分析,您将不会得到任何匹配项。

附带说明一下,除非在您的映射中指定,否则您的 name 字段 可能会被默认分析 。您不必在匹配查询中使用 .ToLower(),因为 match queries 将对您查询的字符串使用默认搜索分析器。

我发现当从 elasticsearch 中检索 extentUid 字段时,它会将字符串显示为大写。即使使用代码 - tms.Field(fd => fd.extentUid.ToLower()) 字符串仍然保持大写。

解决方案 = 如果不分析 elasticsearch 字符串,请确保要与 Elasticsearch 字符串字段进行比较的字符串是大写的。