ElasticSearch在多个字段上完全匹配

时间:2020-09-25 09:35:30

标签: c# linq elasticsearch nest

我是Elastic Search的新手,我试图在Elasticsearch索引中的对象的每个字段上获得完全匹配。例如,我有两个对象:

        {
            "_index": "sql",
            "_type": "_doc",
            "_id": "mpovsH",
            "_score": 1.0,
            "_source": {
                "entityId": 1,
                "user": "userfirst",
                "descr": "testfirst",
            }
        },
        {
            "_index": "sql",
            "_type": "_doc",
            "_id": "mpovsH",
            "_score": 1.0,
            "_source": {
                "entityId": 2,
                "user": "usersecond",
                "descr": "testsecond",
            }
        }

我希望在对象的所有字段上搜索字符串“ userfirst”,并仅获得第一个作为响应。我尝试过:

                var searchResponse = client.SearchAsync<MyObject>(s => s
                .Source(sf => sf)
                .Query(q => q
                     .MultiMatch(a => a
                            .Query(queryValue)))).Result;

其中queryValue是“ userfirst”,但是我在结果中都得到了两个对象。我该如何更改?另外,如果可能的话,我不会写每个字段,因为我的对象更大了。

编辑:通过此查询,我仅获得一个结果:

                var searchResponse = client.SearchAsync<TendersElasticSearch>(s => s
                .Source(sf => sf)
                .Query(qn => qn
                .MatchPhrasePrefix(ma => ma
                .Field(x => x.User)
                .Query(queryValue)))).Result;

但是通过此查询,我只能在现场用户上获得结果。我想搜索每个对象的所有字段。有提示吗?

2 个答案:

答案 0 :(得分:1)

添加包含索引数据,映射,搜索查询和搜索结果的工作示例

索引映射:

{
  "mappings": {
    "properties": {
      "users": {
        "type": "nested" 
      }
    }
  }
}

索引数据:

{
    "users": [
        {
            "entityId": 1,
            "user": "userfirst",
            "descr": "testfirst"
        },
        {
            "entityId": 2,
            "user": "usersecond",
            "descr": "testsecond"
        }
    ]
}

搜索查询:

{
  "query": {
    "nested": {
      "path": "users",
      "query": {
        "bool": {
          "must": [
            { "match": { "users.user": "userfirst" }}
          ]
        }
      },
      "inner_hits":{}
    }
  }
}

使用多重匹配的搜索查询:

{
    "query": {
        "nested": {
            "path": "users",
            "query": {
                "bool": {
                    "must": [
                        {
                            "multi_match": {
                                "query": "userfirst",
                                "fields": [
                                    "users.user"
                                ]
                            }
                        }
                    ]
                }
            },
            "inner_hits": {}
        }
    }
}

搜索结果:

hits": [
                {
                  "_index": "stof_64061575",
                  "_type": "_doc",
                  "_id": "1",
                  "_nested": {
                    "field": "users",
                    "offset": 0
                  },
                  "_score": 0.6931471,
                  "_source": {
                    "entityId": 1,
                    "user": "userfirst",
                    "descr": "testfirst"
                  }
                }
              ]

答案 1 :(得分:1)

C#查询:

 var searchResponse = client.SearchAsync<MyObject>(s => s
            .Source(sf => sf
            .Nested(n=>n.Path("users").
             Query(qn=>qn.bool(
             b=> b.Must(
                m => m. .Query(q => q
                                 .MultiMatch(a => a
                                     .Query(queryValue))))))
             )
           ).Result;
相关问题