Weave Code
Code Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Elasticsearch Search String Parser Laravel Package

spatie/elasticsearch-search-string-parser

Parse custom search strings into Elasticsearch queries. Supports regex-based directives like status:active or @user, grouping directives, and autocomplete suggestions. Build searches via spatie/elasticsearch-query-builder and get results + directive suggestions.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture Fit

  • Search Layer Alignment: The package excels as a search abstraction layer for Laravel applications leveraging Elasticsearch, enabling custom query parsing without exposing raw Elasticsearch DSL. It bridges the gap between user-facing search syntax (e.g., status:active) and Elasticsearch’s structured queries.
  • Decoupling: Aligns with hexagonal architecture by encapsulating search logic, allowing the TPM to isolate search concerns from business logic.
  • Extensibility: Supports custom directives via regex and the spatie/elasticsearch-query-builder, enabling tailored search syntax (e.g., @mentions, group_by:). This is critical for domain-specific use cases (e.g., e-commerce filters, ticketing systems).

Integration Feasibility

  • Elasticsearch Dependency: Requires an existing Elasticsearch cluster (7.x+). Feasibility hinges on:
    • Cluster health and version compatibility (package targets Elasticsearch 7+).
    • Index mapping alignment (e.g., status field must exist for status:active to work).
  • Laravel Ecosystem Fit: Works seamlessly with Laravel’s service container and Scout (if used). Minimal boilerplate for integration.
  • Query Builder Synergy: Leverages spatie/elasticsearch-query-builder for complex queries, reducing custom DSL development.

Technical Risk

  • Schema Rigidity: Directives (e.g., status:) must map to Elasticsearch fields. Misalignment risks runtime errors or silent failures.
  • Performance Overhead: Custom regex parsing adds latency. Benchmark parsing time for high-traffic search queries (e.g., >10k QPS).
  • Maintenance Debt: Directives require manual regex updates. Risk of regex sprawl as directives grow (e.g., priority:high AND @team:dev).
  • Elasticsearch Version Lock: Package updates may lag behind Elasticsearch releases (last update: 2025-06-27). Monitor for breaking changes.

Key Questions

  1. Search Complexity: Does the app require advanced query types (e.g., fuzzy matching, geo-search) beyond basic directives? If yes, assess if elasticsearch-query-builder suffices or if raw DSL is needed.
  2. Scalability: How will search volume scale? Consider caching parsed queries (e.g., Redis) to mitigate parsing overhead.
  3. User Experience: Are there edge cases in search syntax (e.g., escaped characters, multilingual queries) that need handling?
  4. Monitoring: How will search performance and failures be tracked? Integrate with Laravel’s monitoring (e.g., Sentry) for query parsing errors.
  5. Team Expertise: Does the team have Elasticsearch/Laravel search experience? If not, budget for training or hire a specialist for initial setup.

Integration Approach

Stack Fit

  • Laravel Native: Designed for Laravel’s service container. Integrates via config/app.php and service providers.
  • Elasticsearch Stack: Compatible with:
    • Official Elasticsearch PHP Client (v8+).
    • Scout (if using Laravel Scout for search).
    • Tymon/JWT-Auth or similar for role-based search filters.
  • Frontend Agnostic: Works with any frontend (React, Vue, etc.) via API endpoints (e.g., /api/search?q=foo).

Migration Path

  1. Phase 1: Proof of Concept (PoC)
    • Set up a local Elasticsearch cluster (Docker) and Laravel app.
    • Test basic directives (e.g., status:active) and validate query output against raw Elasticsearch DSL.
    • Benchmark parsing time for 100+ queries.
  2. Phase 2: Core Integration
    • Replace existing search logic with the package.
    • Migrate custom search syntax to directives (e.g., category:electronicscategory:electronics).
    • Integrate with elasticsearch-query-builder for complex queries.
  3. Phase 3: Extensions
    • Add auto-completion for directives (e.g., suggest status: values).
    • Implement caching for parsed queries (e.g., Redis).
    • Add analytics (e.g., track popular search terms).

Compatibility

  • Elasticsearch: Tested on 7.x+. Verify compatibility with your cluster version (e.g., 8.x may require updates).
  • Laravel: Supports Laravel 8+. For older versions, check for BC breaks.
  • Dependencies:
    • spatie/elasticsearch-query-builder (required for directives).
    • elasticsearch/elasticsearch (PHP client, v8+ recommended).

Sequencing

  1. Pre-requisites:
    • Elasticsearch cluster up and running.
    • Laravel app with Elasticsearch PHP client configured.
  2. Core Setup:
    • Install package: composer require spatie/elasticsearch-search-string-parser.
    • Publish config: php artisan vendor:publish --provider="Spatie\SearchStringParser\SearchStringParserServiceProvider".
    • Configure directives in config/search-string-parser.php.
  3. API Layer:
    • Create a Laravel route/controller to handle search requests (e.g., SearchController@execute).
    • Example:
      use Spatie\SearchStringParser\SearchStringParser;
      
      public function execute(Request $request) {
          $query = $request->input('q');
          $parser = app(SearchStringParser::class);
          $elasticsearchQuery = $parser->parse($query);
          return Elasticsearch::search($elasticsearchQuery);
      }
      
  4. Testing:
    • Unit test directive parsing (e.g., status:active → correct Elasticsearch query).
    • Load test with 1k+ concurrent searches.

Operational Impact

Maintenance

  • Directive Management:
    • Pros: Centralized config (config/search-string-parser.php) for directives.
    • Cons: Regex updates require config changes and testing. Use feature flags for gradual rollouts.
  • Dependency Updates:
    • Monitor spatie/elasticsearch-query-builder and Elasticsearch PHP client for updates.
    • Automate dependency updates via Dependabot or GitHub Actions.
  • Documentation:
    • Maintain a runbook for common issues (e.g., "Directive status: not working? Check Elasticsearch field mapping").

Support

  • Debugging:
    • Log parsed queries for troubleshooting (e.g., Log::debug('Parsed query:', $elasticsearchQuery)).
    • Use Elasticsearch’s _validate/query API to validate queries before execution.
  • User Feedback:
    • Implement a search analytics dashboard to identify failing queries (e.g., via Sentry or custom logs).
    • Example metrics:
      • Query parsing failures.
      • Directives with zero results.
  • SLAs:
    • Define SLA for search response time (e.g., 95% < 500ms). Use New Relic or Laravel Telescope to monitor.

Scaling

  • Horizontal Scaling:
    • Package is stateless (except for caching). Scale Laravel app horizontally.
    • Elasticsearch cluster must handle query load (sharding/replicas).
  • Caching Strategies:
    • Query Caching: Cache parsed queries (e.g., cache()->remember('search:foo', 5, fn() => $parser->parse('foo'))).
    • Result Caching: Cache Elasticsearch results (e.g., scout:cache).
  • Rate Limiting:
    • Protect search endpoints from abuse (e.g., throttle:60,1 in Laravel middleware).

Failure Modes

Failure Scenario Impact Mitigation
Elasticsearch cluster down No search results Fallback to database search (degraded mode).
Invalid directive syntax 500 errors Graceful fallback (e.g., return empty results).
Regex parsing timeout Slow responses Increase PHP max_execution_time.
Elasticsearch version mismatch Query failures Pin package version and test upgrades.
High query volume Cluster overload Implement query throttling and caching.

Ramp-Up

  • Onboarding:
    • Developer Training:
      • Workshop on Elasticsearch basics and directive syntax.
      • Hands-on lab: Build a custom directive (e.g., priority:high).
    • Documentation:
      • Internal wiki with:
        • Directive reference (e.g., status:, @mentions).
        • Troubleshooting guide (e.g., "Why is my query returning no results?").
  • Phased Rollout:
    • Alpha: Internal team-only search (e.g., /admin/search).
    • Beta: Limited public exposure (e.g., 10% of users).
    • Production: Full rollout with monitoring.
  • Key Metrics for Go/No-Go:
    • <5% query parsing failures.
    • <10% increase in search latency.
    • User satisfaction (e.g., NPS for
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
davejamesmiller/laravel-breadcrumbs
artisanry/parsedown
christhompsontldr/phpsdk
enqueue/dsn
bunny/bunny
enqueue/test
enqueue/null
enqueue/amqp-tools
milesj/emojibase
bower-asset/punycode
bower-asset/inputmask
bower-asset/jquery
bower-asset/yii2-pjax
laravel/nova
spatie/laravel-mailcoach
spatie/laravel-superseeder
laravel/liferaft
nst/json-test-suite
danielmiessler/sec-lists
jackalope/jackalope-transport