PHPackages                             bentools/meilisearch-filters - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Search &amp; Filtering](/categories/search)
4. /
5. bentools/meilisearch-filters

ActiveLibrary[Search &amp; Filtering](/categories/search)

bentools/meilisearch-filters
============================

Expression builder for Meilisearch filters.

1.1.1(1y ago)21.5k↓67.3%1MITPHPPHP &gt;= 8.2CI passing

Since Jan 9Pushed 1y ago1 watchersCompare

[ Source](https://github.com/bpolaszek/meilisearch-filters-php)[ Packagist](https://packagist.org/packages/bentools/meilisearch-filters)[ RSS](/packages/bentools-meilisearch-filters/feed)WikiDiscussions main Synced 2d ago

READMEChangelog (3)Dependencies (4)Versions (5)Used By (1)

[![Latest Stable Version](https://camo.githubusercontent.com/9c442fbf5d8f220d63f6104c02054f1494698e002ab4ee2c0776ab43cff2450a/68747470733a2f2f706f7365722e707567782e6f72672f62656e746f6f6c732f6d65696c697365617263682d66696c746572732f762f737461626c65)](https://packagist.org/packages/bentools/meilisearch-filters)[![License](https://camo.githubusercontent.com/808d133ebe69a3d9ba3d66b1533a7e6756bb8d1e612ce975218e14eb6adc5599/68747470733a2f2f706f7365722e707567782e6f72672f62656e746f6f6c732f6d65696c697365617263682d66696c746572732f6c6963656e7365)](https://packagist.org/packages/bentools/meilisearch-filters)[![CI Workflow](https://github.com/bpolaszek/meilisearch-filters-php/actions/workflows/ci.yml/badge.svg)](https://github.com/bpolaszek/meilisearch-filters-php/actions/workflows/ci.yml)[![Coverage](https://camo.githubusercontent.com/4dd09ca16e36a0496a694081f38ba0f6f6bb9a8cff7be115d892caa8f174e7f3/68747470733a2f2f636f6465636f762e696f2f67682f62706f6c61737a656b2f6d65696c697365617263682d66696c746572732d7068702f6272616e63682f6d61737465722f67726170682f62616467652e7376673f746f6b656e3d4c35756c5461796d6274)](https://codecov.io/gh/bpolaszek/meilisearch-filters-php)[![Total Downloads](https://camo.githubusercontent.com/b8bae56c366e92e2f373c3f7b3dc6345dcf1c3ce7e9336a7b6fe8aa3673e654b/68747470733a2f2f706f7365722e707567782e6f72672f62656e746f6f6c732f6d65696c697365617263682d66696c746572732f646f776e6c6f616473)](https://packagist.org/packages/bentools/meilisearch-filters)

MeiliSearch Filter Builder
==========================

[](#meilisearch-filter-builder)

This library allows you to build [Meilisearch filters](https://www.meilisearch.com/docs/learn/fine_tuning_results/filtering#filter-basics) using PHP.

This is a port of the [JS library](https://github.com/bpolaszek/meilisearch-filters).

Examples:

### Comparison Filters

[](#comparison-filters)

```
use function Bentools\MeilisearchFilters\field;

echo field('cat')->equals("Berlioz"); // cat = 'Berlioz'
echo field('cat')->notEquals("O'Malley"); // cat != 'O\\'Malley'
echo field('age')->isGreaterThan(5); // age > '5'
echo field('age')->isGreaterThan(5, true); // age >= '5'
echo field('age')->isNotGreaterThan(5); // age isNotGreaterThan(5, true); // age < '5'
echo field('age')->isLowerThan(10); // age < '10'
echo field('age')->isLowerThan(10, true); // age isNotLowerThan(10); // age >= '10'
echo field('age')->isNotLowerThan(10, true); // age > '10'
```

### Between Filter

[](#between-filter)

```
use function Bentools\MeilisearchFilters\field;

echo field('age')->isBetween(5, 10); // age '5' TO '10'
echo field('age')->isNotBetween(5, 10); // NOT age '5' TO '10'
echo field('age')->isBetween(5, 10, false); // age > '5' AND age < '10'
echo field('age')->isNotBetween(5, 10, false); // NOT (age > '5' AND age < '10')
```

### Exists Filter

[](#exists-filter)

```
use function Bentools\MeilisearchFilters\field;

echo field('god')->exists(); // god EXISTS
echo field('god')->doesNotExist(); // god NOT EXISTS
```

### Empty Filter

[](#empty-filter)

```
use function Bentools\MeilisearchFilters\field;

echo field('glass')->isEmpty(); // glass IS EMPTY
echo field('glass')->isNotEmpty(); // glass IS NOT EMPTY
```

### Null Filter

[](#null-filter)

```
use function Bentools\MeilisearchFilters\field;

echo field('nullish')->isNull(); // nullish IS NULL
echo field('nullish')->isNotNull(); // nullish IS NOT NULL
```

### IN Filter

[](#in-filter)

```
use function Bentools\MeilisearchFilters\field;

$cat = field('cat')
echo $cat->isIn(['Berlioz', "O'Malley"]); // cat IN ['Berlioz', 'O\\'Malley']
echo $cat->isNotIn(['Berlioz', "O'Malley"]); // cat NOT IN ['Berlioz', 'O\\'Malley']
```

### CONTAINS filter

[](#contains-filter)

```
use function Bentools\MeilisearchFilters\field;

$cat = field('cat')
echo $cat->contains('Berlioz'); // cat CONTAINS 'Berlioz'
echo $cat->doesNotContain('Berlioz'); // cat NOT CONTAINS 'Berlioz'
```

### STARTS WITH filter

[](#starts-with-filter)

```
use function Bentools\MeilisearchFilters\field;

$cat = field('cat')
echo $cat->startWith('Ber'); // cat STARTS WITH 'Ber'
echo $cat->doesNotStartWith('Ber'); // cat NOT STARTS WITH 'Ber'
```

### Geographic filters

[](#geographic-filters)

```
use function Bentools\MeilisearchFilters\{withinGeoRadius, notWithinGeoRadius};

echo withinGeoRadius(50.35, 3.51, 3000); // _geoRadius(50.35, 3.51, 3000)
echo notWithinGeoRadius(50.35, 3.51, 3000); // NOT _geoRadius(50.35, 3.51, 3000)
```

```
use function Bentools\MeilisearchFilters\{withinGeoBoundingBox, notWithinGeoBoundingBox};

echo withinGeoBoundingBox([50.55, 3], [50.52, 3.08]); // _geoBoundingBox([50.55, 3], [50.52, 3.08])
echo notWithinGeoBoundingBox([50.55, 3], [50.52, 3.08]); // NOT _geoBoundingBox([50.55, 3], [50.52, 3.08])
```

### Composite filters

[](#composite-filters)

```
use function Bentools\MeilisearchFilters\field;

$cat = field('cat')
$color = field('color')
$age = field('age')
echo $cat->equals("Berlioz")->and($age->between(5, 10)); // cat = 'Berlioz' AND age '5' TO '10'
echo $cat->equals("Berlioz")->or($age->between(5, 10)); // cat = 'Berlioz' OR age '5' TO '10'

// Automatic grouping
echo $color->equals('ginger')->or($cat->equals("Berlioz")->and($age->between(5, 10))); // color = 'ginger' OR (cat = 'Berlioz' AND age '5' TO '10')
```

### NOT filter

[](#not-filter)

```
use function Bentools\MeilisearchFilters\{field, not};

$color = field('ginger')
echo not($color->equals('ginger')); // NOT color = 'ginger'
```

### Adding parentheses

[](#adding-parentheses)

```
use function Bentools\MeilisearchFilters\{field, group};

$color = field('ginger')
echo group($color->equals('ginger')); // (color = 'ginger')
```

Installation
============

[](#installation)

```
composer req bentools/meilisearch-filters

```

Tests
=====

[](#tests)

```
composer ci:check

```

License
=======

[](#license)

MIT.

###  Health Score

37

—

LowBetter than 81% of packages

Maintenance46

Moderate activity, may be stable

Popularity23

Limited adoption so far

Community9

Small or concentrated contributor base

Maturity58

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~244 days

Total

3

Last Release

418d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/acdd1a8ee0e657ddd06cf11f98a32100ef7121afb8aa270a5b295f5c29c038b3?d=identicon)[bpolaszek](/maintainers/bpolaszek)

---

Top Contributors

[![bpolaszek](https://avatars.githubusercontent.com/u/5569077?v=4)](https://github.com/bpolaszek "bpolaszek (8 commits)")

###  Code Quality

TestsPest

Static AnalysisPHPStan

Code StylePHP CS Fixer

Type Coverage Yes

### Embed Badge

![Health badge](/badges/bentools-meilisearch-filters/health.svg)

```
[![Health](https://phpackages.com/badges/bentools-meilisearch-filters/health.svg)](https://phpackages.com/packages/bentools-meilisearch-filters)
```

###  Alternatives

[awesome-nova/dependent-filter

Dependent filters for Laravel Nova

26193.1k](/packages/awesome-nova-dependent-filter)[algolia/php-dom-parser

A simple tool to turn DOM into Algolia search friendly record objects.

181.8k](/packages/algolia-php-dom-parser)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
