如何在ElasticSearch中仅选择子对象的匹配字段?

d娱乐

我在用Elasticsearch搜索时遇到问题。我正在使用ES 7.3进行实施。

下面是我的课程结构:

    [ElasticsearchType]
    public class InquiryInformation
    {
        [Text(Name = "inquiryNumber")]
        public string InquiryNumber { get; set; }

        [Text(Name = "inquiryStatus")]
        public string InquiryStatus { get; set; }

        [Text(Name = "submitedBy")]
        public string SubmittedBy { get; set; }

        [Nested]
        [PropertyName("files")]
        public List<FileInformation> Files { get; set; }

    }

    [ElasticsearchType]
    public class FileInformation
    {
        [Text(Name = "fileName")]
        public string FileName { get; set; }

        [Text(Name = "fileContent")]
        public string FileContent { get; set; }
    }

并使用此代码创建映射:

elasticClient.Map<InquiryInformation>(m => m.AutoMap());

这已经创建了下面的ES索引映射:

{
  "city" : {
    "mappings" : {
      "properties" : {
        "files" : {
          "type" : "nested",
          "properties" : {
            "fileContent" : {
              "type" : "text"
            },
            "fileName" : {
              "type" : "text"
            }
          }
        },
        "inquiryNumber" : {
          "type" : "text"
        },
        "inquiryStatus" : {
          "type" : "text"
        },
        "submitedBy" : {
          "type" : "text"
        }
      }
    }
  }
}

现在,我必须编写一个查询,该查询将搜索用户以及用户的文件。

可以说,如果我用查询号XYZ1212搜索用户,那么它将返回我所有匹配的记录。现在的问题是-我只需要返回匹配的文件。就像如果FileContent的FileName包含匹配的记录信息一样,则仅匹配的文件应与文档一起返回。

我用NEST尝试了很多方法。但是无法获取唯一匹配的文件。它总是向我返回特定用户的所有文件。

为了满足我的需要有运气吗?

UPDATE 1添加C#的示例查询(NEST)

var searchResult = elasticClient.Search<InquiryInformation>(s => s
                    .Query(q => q
                        .MultiMatch(m => m
                            .Fields(f => f
                                .Field("files.fileContent")
                                .Field("files.fileName")
                            )
                            .Query("Hello Stackoverflow")
                        )
                    )
                );

更新2:添加另一个查询:

POST city/_search
{
  "_source": {
    "includes": [ "*" ],
    "excludes": [ "files" ]
  },
  "query": {
    "nested": {
      "path": "files",
      "inner_hits": {
        "_source": [
          "inquiryNumber", "submitedBy"
        ]
      },
      "query": {
        "bool": {
          "must": [
            {
              "term": {
                "files.fileContent": "Samsung"
              }
            }
          ]
        }
      }
    }
  }
}

由于该files字段是一个nested字段,因此您还需要利用nested查询。像这样:

 var searchResult = elasticClient.Search<InquiryInformation>(s => s
                .Source(false)
                .Query(q => q
                   .Nested(c => c
                      .InnerHits()
                      .Path(p => p.Files)
                      .Query(nq => nq
                        .MultiMatch(m => m
                          .Fields(f => f
                            .Field("files.fileContent")
                            .Field("files.fileName")
                          )
                          .Query("Hello Stackoverflow")
                        )
                      )
                   )
                )
            );

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Elasticsearch:如何在嵌套字段中获得完全匹配

如何在猫鼬中仅列出匹配的子文档

从Elasticsearch中的数组中选择匹配的对象

如何在ElasticSearch中寻址,删除或访问子对象?

如何在MongoDb中查找与数组中的字段和子文档字段匹配的文档

如何在elasticsearch中同时在嵌套字段中搜索单个对象的两个字段

ElasticSearch-在搜索响应中仅获取具有所有顶级字段的匹配嵌套对象

如何使用python选择仅匹配的mongodb子文档

在ElasticSearch中聚合仅匹配的嵌套对象值

如何在mongo shell查询中仅投影嵌套数组的匹配字段

如何在Elasticsearch中的分析字段上执行完全匹配查询?

如何在Elasticsearch中对相同字段进行精确值匹配查询?

如何在Elasticsearch中按具有完全匹配项的字段搜索查询

如何在所有匹配元素中仅选择两个元素?

Mongodb:如何选择仅包含特定字段的对象?

Rails:仅显示表单选择字段中的特定对象

如何在Elasticsearch中按子聚合结果过滤匹配

如何在Elasticsearch中按文档数组中的多个对象字段进行查询?

如何在elasticsearch中拖放CSV文件时选择文档的_id字段作为CSV列?

如何在Elasticsearch中近似匹配?

如何在materialUI选择下拉列表中从父对象渲染子对象

如何在Elasticsearch的子聚合中访问date_histogram键字段?

如何匹配 Elasticsearch 中对象数组中的所有对象?

如何在CSS选择器中仅排除特定节点的递归子级?

如何在expss表中仅显示选择的子组+整个数据框的结果?

如何在useEffect挂钩中仅监视对象中的单个字段?

如何在nodejs猫鼬中仅更新一个对象字段

Elasticsearch:仅匹配无日期字段

如何在Elasticsearch中存储嵌套字段