简体   繁体   中英

Elasticsearch Facet List doesn't Match Results

Problem

When I filter by a particular facet, that specific field's facets are correctly filtered in the result but the other facet fields remain the same. Best way to explain this is with the query and the response.

Query

{
    query: {
        match_all: {}
    }, 
    filter: {
        and: [{
            term: {
                "address.state": "oregon"
            }
        }]
    }, 
    facets: {
        "address.city": {
            terms: {
                field: "address.city"
            }, 
            facet_filter: {}
        }, 
        "address.state": {
            terms: {
                field: "address.state"
            }, 
            facet_filter: {
                and: [{
                    term: {
                        "address.state": "oregon"
                    }
                }]
            }
        }, 
        "address.country": {
            terms: {
                field: "address.country"
            }, 
            facet_filter: {}
        }
    }
}

Result

{
    "took": 2,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "failed": 0
    },
    "hits": {
        "total": 1,
        "max_score": 1,
        "hits": [
            {
                "_index": "races",
                "_type": "race",
                "_id": "6",
                "_score": 1,
                "_source": {
                    "id": 6,
                    "name": "Eugene Marathon",
                    "description": "...",
                    "created_at": "2015-05-24T19:41:45.043Z",
                    "updated_at": "2015-05-24T19:41:45.046Z",
                    "address": {
                        "race_id": 6,
                        "id": 7,
                        "line1": null,
                        "line2": null,
                        "city": "Eugene",
                        "state": "oregon",
                        "country": "united_states",
                        "zip": null,
                        "user_id": null,
                        "created_at": "2015-05-24T19:41:45.044Z",
                        "updated_at": "2015-05-24T19:41:45.044Z"
                    },
                    "race_years": []
                }
            }
        ]
    },
    "facets": {
        "address.city": {
            "_type": "terms",
            "missing": 0,
            "total": 7,
            "other": 0,
            "terms": [
                {
                    "term": "long beach",
                    "count": 1
                },
                {
                    "term": "lincoln",
                    "count": 1
                },
                {
                    "term": "las vegas",
                    "count": 1
                },
                {
                    "term": "jackson",
                    "count": 1
                },
                {
                    "term": "eugene",
                    "count": 1
                },
                {
                    "term": "duluth",
                    "count": 1
                },
                {
                    "term": "denver",
                    "count": 1
                }
            ]
        },
        "address.state": {
            "_type": "terms",
            "missing": 0,
            "total": 1,
            "other": 0,
            "terms": [
                {
                    "term": "oregon",
                    "count": 1
                }
            ]
        },
        "address.country": {
            "_type": "terms",
            "missing": 0,
            "total": 7,
            "other": 0,
            "terms": [
                {
                    "term": "united_states",
                    "count": 7
                }
            ]
        }
    }
}

So as you can see it returns all the address.city facets even though the only result is located in Eugene. It is also returning a count of 7 on the united_states . Why would it be returning all of these extra facets and with incorrect counts? My ruby mapping is found below.

Ruby Mapping

settings index: {
  number_of_shards: 1,
  analysis: {
    analyzer: {
      facet_analyzer: {
        type: 'custom',
        tokenizer: 'keyword',
        filter: ['lowercase', 'trim']
      }
    }
  }
} do
  mapping do
    indexes :name, type: 'string', analyzer: 'english', boost: 10
    indexes :description, type: 'string', analyzer: 'english'
    indexes :address do
      indexes :city, type: 'string', analyzer: 'facet_analyzer'
      indexes :state, type: 'string'
      indexes :country, type: 'string'
    end
  end
end

This is the normal behavior of facets when ran against a filter. From the official documentation :

There's one important distinction to keep in mind. While search queries restrict both the returned documents and facet counts, search filters restrict only returned documents — but not facet counts.

In your case, your query matches all documents (ie match_all ) so the facet counts are counted against all documents, too.

Change your query to this and your facet counts will change (in this case you don't need the facet_filter anymore):

{
    query: {
        term: {
            "address.state": "oregon"
        }
    }, 
    facets: {
        "address.city": {
            terms: {
                field: "address.city"
            }
        }, 
        "address.state": {
            terms: {
                field: "address.state"
            }
        }, 
        "address.country": {
            terms: {
                field: "address.country"
            }
        }
    }
}

Another thing worth noting is that facets are deprecated and have been replaced by the much more powerful aggregations .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM