elasticsearchjbuilder

combine filters using match_phrase - Elastic 1.7


Im using ES 1.7, trying to look for documents using match_phrase to search using exact match string. The filter works fine when used alone, however when I combine the filters, I get an error.

example: people document q=aaron&address=scarborough - searching a person by name and address, works fine.

{
  "query": {
    "match_phrase": {
      "name": "aaron"
    }
  },
  "filter": {
    "bool": {
      "must": {
        "nested": {
          "path": "addresses",
          "query": {
            "match_phrase": {
              "address": "scarborough"
            }
          }
        }
      }
    }
  },

q=aaron&phone=813-689-6889 - searching a person by name and phone number works fine as well.

{
  "query": {
    "match_phrase": {
      "name": "aaron"
    }
  },
  "filter": {
    "bool": {
      "must": {
        "query": {
          "match_phrase": {
            "phone": "813-689-6889"
          }
        }
      }
    }
  }

However, When I try to use both filters, address and phone I get a No filter registered for [match_phrase] error

for example: q=aaron&address=scarborough&phone=813-689-6889

{
  "query": {
    "match_phrase": {
      "name": "aaron"
    }
  },
  "filter": {
    "bool": {
      "must": {
        "nested": {
          "path": "addresses",
          "query": {
            "match_phrase": {
              "address": "scarborough"
            }
          }
        },
        "query": {
          "match_phrase": {
            "phone": "813-689-6889"
          }
        }
      }
    }
  }

the error, when using address and phone filters together:

nested: QueryParsingException[[pl_people] No filter registered for [match_phrase]]; }]","status":400}):

index mapping (person):

{
  "pl_people": {
    "mappings": {
      "person": {
        "properties": {
          "ac_name": {
            "type": "string",
            "analyzer": "autocomplete"
          },
          "addresses": {
            "type": "nested",
            "properties": {
              "address": {
                "type": "string"
              },
              "city": {
                "type": "string",
                "index": "not_analyzed"
              },
              "city_id": {
                "type": "long"
              },
              "country": {
                "type": "string",
                "index": "not_analyzed"
              },
              "county": {
                "type": "string",
                "index": "not_analyzed"
              },
              "county_id": {
                "type": "long"
              },
              "id": {
                "type": "long"
              },
              "location": {
                "type": "geo_point"
              },
              "parameterized": {
                "type": "string"
              },
              "state": {
                "type": "string",
                "index": "not_analyzed"
              },
              "state_id": {
                "type": "long"
              },
              "zip": {
                "type": "string",
                "index": "not_analyzed"
              }
            }
          },
          "author": {
            "type": "string",
            "index": "not_analyzed"
          },
          "body": {
            "type": "string",
            "analyzer": "remove_html",
            "fields": {
              "ns_body": {
                "type": "string",
                "analyzer": "remove_html_stopwords"
              }
            }
          },
          "charities": {
            "type": "nested",
            "properties": {
              "email": {
                "type": "string",
                "index": "not_analyzed"
              },
              "id": {
                "type": "long"
              }
            }
          },
          "community": {
            "properties": {
              "name": {
                "type": "string",
                "index": "not_analyzed"
              },
              "parameterized": {
                "type": "string",
                "index": "not_analyzed"
              },
              "slug": {
                "type": "string",
                "index": "not_analyzed"
              }
            }
          },
          "created_at": {
            "type": "date",
            "format": "dateOptionalTime"
          },
          "date_of_birth": {
            "type": "date",
            "format": "dateOptionalTime"
          },
          "delimiters": {
            "type": "nested",
            "properties": {
              "delimiter_type": {
                "type": "string",
                "index": "not_analyzed"
              },
              "id": {
                "type": "long"
              }
            }
          },
          "description": {
            "type": "string"
          },
          "employments": {
            "type": "nested",
            "properties": {
              "email": {
                "type": "string",
                "index": "not_analyzed"
              },
              "employment_status": {
                "type": "string",
                "index": "not_analyzed"
              },
              "foia_contact": {
                "type": "boolean"
              },
              "id": {
                "type": "long"
              },
              "phone": {
                "type": "string",
                "index": "not_analyzed"
              },
              "phone_extension": {
                "type": "string",
                "index": "not_analyzed"
              }
            }
          },
          "first_name": {
            "type": "string",
            "fields": {
              "na_first_name": {
                "type": "string",
                "index": "not_analyzed"
              }
            }
          },
          "last_name": {
            "type": "string",
            "fields": {
              "na_last_name": {
                "type": "string",
                "index": "not_analyzed"
              }
            }
          },
          "market": {
            "properties": {
              "name": {
                "type": "string",
                "index": "not_analyzed"
              },
              "parameterized": {
                "type": "string",
                "index": "not_analyzed"
              },
              "slug": {
                "type": "string",
                "index": "not_analyzed"
              }
            }
          },
          "middle_name": {
            "type": "string",
            "fields": {
              "na_middle_name": {
                "type": "string",
                "index": "not_analyzed"
              }
            }
          },
          "most_recent_organization": {
            "properties": {
              "description": {
                "type": "string"
              },
              "id": {
                "type": "long"
              },
              "name": {
                "type": "string"
              },
              "parameterized": {
                "type": "string"
              },
              "phone": {
                "type": "string"
              }
            }
          },
          "name": {
            "type": "string",
            "fields": {
              "na_name": {
                "type": "string",
                "index": "not_analyzed"
              },
              "ngram_name": {
                "type": "string",
                "analyzer": "my_start"
              },
              "ns_name": {
                "type": "string",
                "analyzer": "no_stopwords"
              }
            }
          },
          "organizations": {
            "properties": {
              "name": {
                "type": "string"
              },
              "parameterized": {
                "type": "string",
                "index": "not_analyzed"
              }
            }
          },
          "package": {
            "properties": {
              "name": {
                "type": "string",
                "index": "not_analyzed"
              },
              "parameterized": {
                "type": "string",
                "index": "not_analyzed"
              },
              "slug": {
                "type": "string",
                "index": "not_analyzed"
              }
            }
          },
          "parameterized": {
            "type": "string",
            "index": "not_analyzed"
          },
          "phone": {
            "type": "string"
          },
          "photo": {
            "properties": {
              "large": {
                "type": "string"
              },
              "medium": {
                "type": "string"
              },
              "teaser": {
                "type": "string"
              },
              "thumb": {
                "type": "string"
              },
              "url": {
                "type": "string"
              }
            }
          },
          "projects": {
            "properties": {
              "id": {
                "type": "long"
              },
              "name": {
                "type": "string",
                "index": "not_analyzed"
              },
              "parameterized": {
                "type": "string",
                "index": "not_analyzed"
              },
              "slug": {
                "type": "string",
                "index": "not_analyzed"
              }
            }
          },
          "public_offices": {
            "type": "nested",
            "properties": {
              "email": {
                "type": "string",
                "index": "not_analyzed"
              },
              "employment_status": {
                "type": "string",
                "index": "not_analyzed"
              },
              "id": {
                "type": "long"
              }
            }
          },
          "published": {
            "type": "string",
            "index": "not_analyzed"
          },
          "region": {
            "properties": {
              "name": {
                "type": "string",
                "index": "not_analyzed"
              },
              "parameterized": {
                "type": "string",
                "index": "not_analyzed"
              },
              "slug": {
                "type": "string",
                "index": "not_analyzed"
              }
            }
          },
          "resource": {
            "type": "string"
          },
          "short_description": {
            "type": "string"
          },
          "show_path": {
            "type": "string"
          },
          "time": {
            "type": "date",
            "format": "dateOptionalTime"
          },
          "updated_at": {
            "type": "date",
            "format": "dateOptionalTime"
          }
        }
      }
    }
  }
}

Document I am using to test

[
    {
        "_index": "pl_people",
        "_type": "person",
        "_id": "813106",
        "_score": null,
        "sort": [
            -9223372036854775808
        ],
        "resource": "Person",
        "parameterized": "813106-aaron-mcguire",
        "created_at": "2011-10-29T19:51:24.000-05:00",
        "updated_at": "2014-12-11T07:21:08.000-06:00",
        "name": "Aaron McGuire",
        "title": null,
        "photo": {
            "url": "/assets/140x140.gif"
        },
        "description": null,
        "short_description": null,
        "time": "2014-12-11",
        "show_path": "/people/813106-aaron-mcguire",
        "published": true,
        "aliases": [],
        "phone": "813-689-6889",
        "date_of_birth": "1991-03-01",
        "first_name": "Aaron",
        "middle_name": "",
        "last_name": "McGuire",
        "delimiters": [],
        "market": null,
        "region": null,
        "most_recent_organization": null,
        "households": [],
        "court_cases": [],
        "addresses": [
            {
                "id": 1,
                "parameterized": "1",
                "address": "123 Scarborough road",
                "zip": "L5A2A9",
                "city": "Ontario",
                "country": "USA",
                "state": "California",
                "location": null,
                "state_id": null,
                "county_id": null,
                "city_id": null
            }
        ],
        "projects": [],
        "voter_ids": [],
        "id": "813106"
    }
]

Solution

  • Finally, I was able to reproduce the issue, Looks like "include_in_parent": true, missed in your mapping, due to which I was getting the error mentioned In my comment..

    To fix, the issue I used the same mapping provided you but add "include_in_parent": true, at the top level of address nested field. For brevity providing only the address part of modified mapping.

    "addresses": {
                "type": "nested",
                "include_in_parent": true, --> added only this in your mapping.
                "properties": {
                  "address": {
                    "type": "string"
                  },
                  "city": {
                    "type": "string",
                    "index": "not_analyzed"
                  },
                  "city_id": {
                    "type": "long"
                  },
                  "country": {
                    "type": "string",
                    "index": "not_analyzed"
                  },
                  "county": {
                    "type": "string",
                    "index": "not_analyzed"
                  },
                  "county_id": {
                    "type": "long"
                  },
                  "id": {
                    "type": "long"
                  },
                  "location": {
                    "type": "geo_point"
                  },
                  "parameterized": {
                    "type": "string"
                  },
                  "state": {
                    "type": "string",
                    "index": "not_analyzed"
                  },
                  "state_id": {
                    "type": "long"
                  },
                  "zip": {
                    "type": "string",
                    "index": "not_analyzed"
                  }
                }
              }
    

    After that indexed some sample docs, which have different values of address and name param, to verify the right outcome of my search query.

    And final search query which includes both the filter, please note, I removed the nested part on address field as it's included at the parent document, so you can directly query now on it. This query looks much simple and now gives the expected result.

    {
      "query": {
        "match_phrase": {
          "name": "aaron"
        }
      },
      "filter": {
        "bool": {
          "must": [{
            "query": {
              "match_phrase": {
                "address": "scarborough"
              }
            }
          },
          {
           "query": {
              "match_phrase": {
                "phone": "813-689-6889"
              }
            }
          }]
        }
      }
    }
    

    Output on sample docs

     "hits": [
                {
                    "_index": "so-match-phrase",
                    "_type": "pl_people",
                    "_id": "4",
                    "_score": 0.19178301,
                    "_source": {
                        "resource": "Person",
                        "parameterized": "813106-aaron-mcguire",
                        "created_at": "2011-10-29T19:51:24.000-05:00",
                        "updated_at": "2014-12-11T07:21:08.000-06:00",
                        "name": "aaron McGuire",
                        "title": null,
                        "photo": {
                            "url": "/assets/140x140.gif"
                        },
                        "description": null,
                        "short_description": null,
                        "time": "2014-12-11",
                        "show_path": "/people/813106-aaron-mcguire",
                        "published": true,
                        "aliases": [],
                        "phone": "813-689-6889",
                        "date_of_birth": "1991-03-01",
                        "first_name": "Aaron",
                        "middle_name": "",
                        "last_name": "McGuire",
                        "delimiters": [],
                        "market": null,
                        "region": null,
                        "most_recent_organization": null,
                        "households": [],
                        "court_cases": [],
                        "addresses": [
                            {
                                "id": 1,
                                "parameterized": "1",
                                "address": "Scarborough road",
                                "zip": "L5A2A9",
                                "city": "Ontario",
                                "country": "USA",
                                "state": "California",
                                "location": null,
                                "state_id": null,
                                "county_id": null,
                                "city_id": null
                            }
                        ],
                        "id": "813106"
                    }
                },
                {
                    "_index": "so-match-phrase",
                    "_type": "pl_people",
                    "_id": "1",
                    "_score": 0.19178301,
                    "_source": {
                        "resource": "Person",
                        "parameterized": "813106-aaron-mcguire",
                        "created_at": "2011-10-29T19:51:24.000-05:00",
                        "updated_at": "2014-12-11T07:21:08.000-06:00",
                        "name": "Aaron McGuire",
                        "title": null,
                        "photo": {
                            "url": "/assets/140x140.gif"
                        },
                        "description": null,
                        "short_description": null,
                        "time": "2014-12-11",
                        "show_path": "/people/813106-aaron-mcguire",
                        "published": true,
                        "aliases": [],
                        "phone": "813-689-6889",
                        "date_of_birth": "1991-03-01",
                        "first_name": "Aaron",
                        "middle_name": "",
                        "last_name": "McGuire",
                        "delimiters": [],
                        "market": null,
                        "region": null,
                        "most_recent_organization": null,
                        "households": [],
                        "court_cases": [],
                        "addresses": [
                            {
                                "id": 1,
                                "parameterized": "1",
                                "address": "123 Scarborough road",
                                "zip": "L5A2A9",
                                "city": "Ontario",
                                "country": "USA",
                                "state": "California",
                                "location": null,
                                "state_id": null,
                                "county_id": null,
                                "city_id": null
                            }
                        ],
                        "id": "813106"
                    }
                }
            ]