匹配源 ElasticSearch Nest 中的每个字段

Match for every field in source ElasticSearch Nest

我需要在源的每个字段中搜索一个字符串值。因此,如果我的字符串“queryValue”是“test”并且我的索引中有如下内容:

"hits": [
  {
    "_index": "sql-data",
    "_type": "_doc",
    "_id": "jTI5kHMBal-9d-PPo5Kr",
    "_score": 1.0,
    "_source": {
      "Id": 57,
      "object1": [
        {
          "description": "test",
        }
      ],
      "object2": [
        {
          "description": "nomore",
        }
      ],
   }
 ]

我想从我的查询中得到这个命中,因为 object1 的描述是测试。 那是我的代码,实际上 returns 我索引中的每个匹配项,而不仅仅是匹配的:

var searchResponse = client.SearchAsync<Document>(s => s
    .Source(sf => sf
    .IncludeAll())
    .Query(p => p
    .Match(s => s
    .Query(queryValue)
    )))
    .Result;

有多种方法可以做到这一点。但其中每一项的可行性取决于您实际实现映射的方式。

使用 _all 字段

_all字段下的数据只做索引不存储。因此,您只能搜索数据但无法检索。使用 _all 有其自身的局限性,因为数据首先连接成一个字符串,然后进行分析和索引。因此,诸如部分匹配或任何特定分析器行为之类的事情可能是不可能的。为此,您可能需要指定一个自定义分析器来覆盖此行为。这实际上可能 膨胀 您的索引。最重要的是,您应该在编制索引时启用 _all 字段。除非有非常严格的要求并且使用旧版本的 ES,否则最好不要走这条路。 这在 6.0 版中已弃用并在 7.0 版中删除

使用multi_match

elasticsearch 的

Multi-match 允许我们构建匹配多个字段的匹配查询。您可以在查询 DSL 中指定要搜索的所有字段。您可以创建一个如下所示的方法来执行多重匹配用法。

private static QueryContainer BuildMultiMatchQuery(string queryValue)
{
    return new QueryContainerDescriptor<Document>()
        .MultiMatch(c => c
            .Fields(f => f
                .Field(doc => doc.Field1)
                .Field(doc => doc.Field2)
                // other fields)
            .Query(queryValue)
            // Add other properties and configuration like analyzers you need, in this block    
        );
}

这可以按如下所示的方式添加到您的 searchAsync 调用链中

var searchResponse = client.SearchAsync<Document>(s => s
    // ...other code
    .Query(BuildMultiMatchQuery(queryValue))
    // ...other code
).Result;

了解来自 here and about _all from here

multi-match 查询

您可能还想看看 copy_to