Rob None
Rob None

Reputation: 581

ElasticSearch Exact match on multiple fields

I'm newbie of Elastic Search, I'm trying to get an exact match on every field of an object in elasticsearch index. For example I have two object:

        {
            "_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",
            }
        }

I want the search the string "userfirst" on all fields of the object, and get only the first one as response. I tried:

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

Where queryValue is "userfirst" but I get both object in results. How can I change it? Also, I would not write every single field if possible to search, because my object is way more bigger.

EDIT: I managed to get only one results with this query:

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

But with this query, I get results only on field user. I would like to search on all fields of every object. Any tips?

Upvotes: 0

Views: 1702

Answers (2)

Murtaza Zaveri
Murtaza Zaveri

Reputation: 49

C# Query :

 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;

Upvotes: 1

Bhavya
Bhavya

Reputation: 16192

Adding a working example with index data, mapping, search query, and search result

Index Mapping:

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

Index Data:

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

Search Query:

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

Search Query using Multi match:

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

Search Result:

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

Upvotes: 1

Related Questions