PHPackages                             zinc/neos-search - 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. zinc/neos-search

ActiveNeos-package[Search &amp; Filtering](/categories/search)

zinc/neos-search
================

0.0.1(2y ago)4122[1 issues](https://github.com/sbruggmann/Zinc.NeosSearch/issues)PHP

Since Jan 11Pushed 2y ago1 watchersCompare

[ Source](https://github.com/sbruggmann/Zinc.NeosSearch)[ Packagist](https://packagist.org/packages/zinc/neos-search)[ RSS](/packages/zinc-neos-search/feed)WikiDiscussions main Synced 4w ago

READMEChangelog (1)Dependencies (2)Versions (2)Used By (0)

Zinc.NeosSearch
===============

[](#zincneossearch)

A lightweight fulltext and term search for [Neos CMS](https://www.neos.io/).

Project goals:

- Simple to set up
- Minimal hardware requirements
- Enable professional features like fast server side Node-Querying for "cheap"

Quickstart
----------

[](#quickstart)

### Start Zinc Search Index

[](#start-zinc-search-index)

See [Zinc Documentation](https://docs.zinclabs.io/04_installation/).

```
# DDEV config in .ddev/docker-compose.zincsearch.yaml:
version: '3.6'
services:
  zincsearch:
    container_name: ddev-${DDEV_SITENAME}-zincsearch
    hostname: ${DDEV_SITENAME}-zincsearch
    image: public.ecr.aws/zinclabs/zincsearch:0.4.9
    expose:
      - "4080"
    ports:
      - "4080"
    environment:
      - ZINC_FIRST_ADMIN_USER=admin
      - ZINC_FIRST_ADMIN_PASSWORD=Complexpass#123
      - ZINC_DATA_PATH=/usr/share/zincsearch/data
    labels:
      com.ddev.site-name: ${DDEV_SITENAME}
      com.ddev.approot: $DDEV_APPROOT
    volumes:
      - ./zinc:/usr/share/zincsearch
      - ".:/mnt/ddev_config"

volumes:
  zincsearch:

```

### Install and configure Zinc.NeosSearch

[](#install-and-configure-zincneossearch)

```
composer require zinc/neos-search

```

Settings.Zinc.yaml:

```
Zinc:
  NeosSearch:
    hostname: 'ddev-YOUR_DDEV_SITENAME-zincsearch'

```

### Configure NodeTypes

[](#configure-nodetypes)

See [How to index NodeType Properties](#how-to-index-nodetype-properties).

```
Neos.Neos:Document:
  properties:
    title:
      search:
        zinc:
          mappingType: 'text'
          indexingValue: ${node.properties.title}
          fulltextValue: ${node.properties.title}

'Neos.Demo:Content.Text':
  properties:
    text:
      search:
        zinc:
          mappingType: 'text'
          fulltextValue: ${node.properties.text}

'Neos.NodeTypes.Navigation:Navigation':
  properties:
    selection:
      search:
        zinc:
          mappingType: 'keyword'
          indexingValue: ${value}

'Neos.Neos:Node':
  properties:
    '_creationDateTime':
      search:
        zinc:
          mappingType: 'date'
          indexingValue: ${value}

// ...

```

### Index the data

[](#index-the-data)

```
./flow zinc:index

```

### Enable the fulltext content NodeType

[](#enable-the-fulltext-content-nodetype)

```
'Zinc.NeosSearch:Content.Search':
  abstract: false

```

[Or create server side queries](Resources/Private/Fusion/Examples/QueryData.fusion).

### Now the search should work 🎉

[](#now-the-search-should-work-)

FAQ / How To
------------

[](#faq--how-to)

### How to index NodeType Properties

[](#how-to-index-nodetype-properties)

Each property can be configured manually via

```
Vendor:NodeType:
  properties:
    aPropertyName:
      search:
        zinc: []

```

Available options:

```
# If configured, this type is used for the field:
mappingType: 'text', 'bool', 'keyword' or 'date'

# If configured, this value is added to the index:
indexingValue: ${value}
or specific..
indexingValue: ${node.properties.aPropertyName}

# If Configured, this value is added to the closest document fulltext field:
indexingValue: ${value}
or specific..
fulltextValue: ${node.properties.aPropertyName}

```

### Enable the Queue Indexer

[](#enable-the-queue-indexer)

Settings.Zinc.yaml:

```
Zinc:
  NeosSearch:
    realtimeIndexing:
      enabled: true
      queue: true

# You can enable realtimeIndexing without queue.. but this has a performance impact while publishing content!

```

Create the queue once..

```
./flow queue:setup zincBatchIndexer

```

Fill the queue regularly..

```
./flow zinc:index --queue

```

Work off queue continously..

```
./flow job:work zincBatchIndexer

# If you need to run the job via cronjob,
you can keep the job worker running once with flock:
*/5 * * * * /usr/bin/flock --nonblock --no-fork /tmp/Flow/job-queue-worker-zincBatchIndexer.lockfile -c 'FLOW_CONTEXT=Production /home/www-data/project.com/releases/current/flow job:work --queue zincBatchIndexer --exit-after 1800'

```

### Query builder Prototypes:

[](#query-builder-prototypes)

Example:

```
zincQueryObject = afx`

`

```

Available Prototypes:

- Zinc.NeosSearch:Query, required
    - Default props
        - from = 0
        - size = 10
        - page = 0 (replaces `from`)
        - sort = null (ex. `[{'properties__creationDateTime': 'desc'}]`)
        - stringify = false
- Zinc.NeosSearch:Query.Should
    - Expects one or more nested Prototypes
- Zinc.NeosSearch:Query.Must
    - Expects one or more nested Prototypes
- Zinc.NeosSearch:Query.MustNot
    - Expects one or more nested Prototypes
- Zinc.NeosSearch:Query.Match
    - Default props
        - field = null
        - property = null (replaces `field`)
        - query = null
        - fuzziness = 'AUTO'
        - boost = null
- Zinc.NeosSearch:Query.Prefix
    - Default Props
        - field = null
        - term = null
- Zinc.NeosSearch:Query.Term
    - Default Props
        - field = null
        - term = null
- Zinc.NeosSearch:Query.Terms
    - Default Props
        - field = null
        - terms = null

### Execute the search query

[](#execute-the-search-query)

Get Nodes:

```
result = ${ZincSearch.nodes(site, this.queryBuilder)} # does return an array of nodes
#    Array (
#        ... NodeInterfase items

```

Get a raw result:

```
result = ${ZincSearch.raw(site, this.queryBuilder)}
#    [hits] => Array (
#            [total] => Array (
#                    [value] => 4
#                    [pages] => 1
#                )
#            [max_score] => 6.8515092967801
#            [hits] => Array (
#                ... raw search result items

```

###  Health Score

18

—

LowBetter than 8% of packages

Maintenance15

Infrequent updates — may be unmaintained

Popularity11

Limited adoption so far

Community9

Small or concentrated contributor base

Maturity31

Early-stage or recently created project

 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

Unknown

Total

1

Last Release

849d ago

### Community

Maintainers

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

---

Top Contributors

[![sbruggmann](https://avatars.githubusercontent.com/u/1162368?v=4)](https://github.com/sbruggmann "sbruggmann (11 commits)")

### Embed Badge

![Health badge](/badges/zinc-neos-search/health.svg)

```
[![Health](https://phpackages.com/badges/zinc-neos-search/health.svg)](https://phpackages.com/packages/zinc-neos-search)
```

###  Alternatives

[ruflin/elastica

Elasticsearch Client

2.3k50.4M202](/packages/ruflin-elastica)[opensearch-project/opensearch-php

PHP Client for OpenSearch

15024.3M64](/packages/opensearch-project-opensearch-php)[massive/search-bundle

Massive Search Bundle

721.4M13](/packages/massive-search-bundle)[outl1ne/nova-multiselect-filter

Multiselect filter for Laravel Nova.

45802.7k3](/packages/outl1ne-nova-multiselect-filter)[handcraftedinthealps/zendsearch

a general purpose text search engine written entirely in PHP 5

39921.0k35](/packages/handcraftedinthealps-zendsearch)[outl1ne/nova-detached-filters

This Laravel Nova package allows you to detach filters from the filter dropdown

64343.5k](/packages/outl1ne-nova-detached-filters)

PHPackages © 2026

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