ElasticSearch在多个字段上完全匹配

问题描述

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

        {
            "_index": "sql","_type": "_doc","_id": "mpovsH","_score": 1.0,"_source": {
                "entityId": 1,"user": "userfirst","descr": "testfirst",}
        },{
            "_index": "sql","_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;

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

解决方法

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

索引映射:

{
  "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,"descr": "testfirst"
                  }
                }
              ]
,

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;

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...