Filtering Search Results
We’ve already mentioned Filters in
our discussion of ConstantScoreQuery and FilteredQuery. Filters
are used to apply extra constraints to a result set. For example, we want
to restrict our search to documents that were created during the last
month. We have two options: add a RangeQuery clause to our query, or apply a
RangeFilter. The main advantage of
using a Filter over a Query is that no score is taken into
account, so a Filter can be a lot faster. To add to
that, Filters cache their results so that subsequent
uses of the Filter perform even better again. All
caching is done against an instance of an IndexReader, so a new cache needs to be
built each time a Filter is used against a different
IndexReader.
Filters also make it easy to apply constraints to
user input queries. Filters are best used when applying
commonly used constraints to a user’s query, such as restricting a search
of a blog to only today’s postings or only to postings marked for publication.
There are only two standard Filters that come
with Ferret:
RangeFilterQueryFilter
Using the RangeFilter
RangeFilter takes the same parameters as RangeQuery as
described in the RangeQuery”
section earlier in this chapter. Basically, you need to supply a
:field and an upper and/or lower
limit for that field. For example, if you want to restrict a search to products
that are priced at $50.00 or more and less than $100.00, we would build
the filter like this:
price_filter=RangeFilter.new(:price,:>=
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access