Home > front end >  Elastic Search : Search keyword results of a specific category
Elastic Search : Search keyword results of a specific category

Time:12-28

I'm trying to build a query where I'm trying to search for names of people of a specific country. If I provide input as John and USA, I should only find results of people by the name John (by the property : name) from USA (by the property : country) and results from other countries shouldn't appear in the results.

What I have tried :

 "query": {
        "bool": {
            "should": [
                {
                    "multi_match": {
                        "query": "John",
                        "fields": ["username", "first_name", "last_name"],
                        "fuzziness": "AUTO",
                        "minimum_should_match": "50%"
                    }
                }
            ],
            "filter": [
                {
                    "match": {
                        "country": "USA"
                    }
                },
                {
                    "match": {
                        "is_citizen": true
                    }
                }
            ]
        }
    }

With the above query the problem I'm seeing is that the results also show people **who don't have their name as John but are from USA **.


Expectation : To filter results of given keyword specific to given country. 

CodePudding user response:

Instead of using should you need to use must clause in your name query.

Below query should give you expected results. refer boolean query official doc to understand the difference with examples.

"query": {
        "bool": {
            "must": [ --> note `must` here
                {
                    "multi_match": {
                        "query": "John",
                        "fields": ["username", "first_name", "last_name"],
                        "fuzziness": "AUTO",
                        "minimum_should_match": "50%"
                    }
                }
            ],
            "filter": [
                {
                    "match": {
                        "country": "USA"
                    }
                },
                {
                    "match": {
                        "is_citizen": true
                    }
                }
            ]
        }
    }

CodePudding user response:

You are using should clause thats why it is not working. You can use must insted of should and it will resolved your issue.

You can use "type":"phrase_prefix" to match Jo with John.

You can change your query as shown below and it will work:

 "query": {
        "bool": {
            "must": [
                {
                    "multi_match": {
                        "query": "John",
                        "fields": ["username", "first_name", "last_name"],
                        "type":"phrase_prefix",
                        "minimum_should_match": "50%"
                    }
                }
            ],
            "filter": [
                {
                    "match": {
                        "country": "USA"
                    }
                },
                {
                    "match": {
                        "is_citizen": true
                    }
                }
            ]
        }
    }
  • Related