elasticsearch精确匹配

sigwle7e  于 2021-06-10  发布在  ElasticSearch
关注(0)|答案(2)|浏览(524)

我是elasticsearch的新手,我正在尝试在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;

但通过这个查询,我只得到用户字段的结果。我想搜索每个对象的所有字段。有什么建议吗?

gzszwxb4

gzszwxb41#

查询:

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;
jljoyd4f

jljoyd4f2#

添加索引数据、Map、搜索查询和搜索结果的工作示例
索引Map:

{
  "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"
                  }
                }
              ]

相关问题