Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ElasticSearch, multi-match with filter?

I have a multi-match query in ES, and wish to add a filter.

{
  "multi_match" : {
    "query" : "this is a test",
    "fields" : [ "subject^2", "message" ]
  }
}

What is the syntax for adding this filter?

I tried:

{
  "multi_match" => {
    "query" => "list",
    "fields" => [ "username" ]

  },
"filter" => {
        "term" => { "username" => "slimkicker"}
    }
}
like image 548
Henley Avatar asked May 27 '13 15:05

Henley


3 Answers

Depending on what you need you have to put the filter in the proper position. You have two options:

Use a top-level filter and apply the filter only to the search results but not to the facets

{
    "query" : {
        "multi_match" : {
            "query" : "this is a test",
            "fields" : [ "subject^2", "message" ]
        }
    },
    "filter" : {
        "term" : { "username": "slimkicker" }
    }
} 

Use a filtered query and apply the filter to both the search results and the facets

{
    "query" : {
        "filtered" : {
            "query" : {
                "multi_match" : {
                    "query" : "this is a test",
                    "fields" : [ "subject^2", "message" ]
                }
            },
            "filter" : {
                "term" : { "username": "slimkicker" }
            }
        }
    }
}
like image 178
javanna Avatar answered Oct 20 '22 06:10

javanna


With Elasticsearch 5 the syntax has changed to the usage of bool query, e.g.

{
  "from" : 0,
  "size" : 10,
  "sort" : "publishDate",
  "query": {
    "bool": {  
      "must" : {
        "multi_match" : {
          "query":      "wedding",
          "type":       "most_fields",
          "fields":     [ "title", "text" ]
        }
      },
      "filter": {
        "term": {
          "locale": "english"
        }
      }
    }
  }
}

Documentation can be found here.

like image 68
Fritz Duchardt Avatar answered Oct 20 '22 05:10

Fritz Duchardt


As per the new Documentation of Elasticsearch, the format is little bit changed, now you have to use bool and must and can apply filter separately from query like follows,

{
    'index' : 'users',
        'type' : 'users',
        'body' : {
          "query" : {
            "bool" : {
              "must" : {
                'multi_match' : {
                    'fields' : {'source^1', 'first_name^5', 'last_name^4', 'email^3', 'postcode^2', 'telephone', 'address', 'alternate_address'
                    },
                    'query' : 'Shahrukh Anwar',
                },
              },
              "filter" : {
                "term" : {
                  'assigned_to' : 125
                }
              }
            }
          }
        }
}
like image 8
Shahrukh Anwar Avatar answered Oct 20 '22 05:10

Shahrukh Anwar