OpenAPI specification

The Manticore Search API is documented using the OpenAPI specification that can be used to generate client SDKs. A machine readable YAML file is available at

You can also look at the specification visualized with the online Swagger Editor here.


Version 5.0.2

Released: May 30th 2022


  • Issue #791 - wrong stack size could cause a crash.

Version 5.0.0

Released: May 18th 2022

Major new features

  • 🔬 Support for Manticore Columnar Library 1.15.2, which enables Secondary indexes beta version. Building secondary indexes is on by default for plain and real-time columnar and row-wise indexes (if Manticore Columnar Library is in use), but to enable it for searching you need to set secondary_indexes = 1 either in your configuration file or using SET GLOBAL. The new functionality is supported in all operating systems except old Debian Stretch and Ubuntu Xenial.

  • Read-only mode: you can now specify listeners that process only read queries discarding any writes.

  • New /cli endpoint for running SQL queries over HTTP even easier.

  • Faster bulk INSERT/REPLACE/DELETE via JSON over HTTP: previously you could provide multiple write commands via HTTP JSON protocol, but they were processed one by one, now they are handled as a single transaction.

  • #720 Nested filters support in JSON protocol. Previously you couldn't code things like a=1 and (b=2 or c=3) in JSON: must (AND), should (OR) and must_not (NOT) worked only on the highest level. Now they can be nested.

  • Support for Chunked transfer encoding in HTTP protocol. You can now use chunked transfer in your application to transfer large batches with lower resource consumption (since you don't need to calculate Content-Length). On the server's side Manticore now always processes incoming HTTP data in streaming fashion without waiting for the whole batch to be transferred as previously, which:

    • decreases peak RAM consumption, which lowers a chance of OOM
    • decreases response time (our tests showed 11% decrease for processing a 100MB batch)
    • lets you overcome max_packet_size and transfer batches much larger than the largest allowed value of max_packet_size (128MB), e.g. 1GB at once.
  • #719 HTTP interface support of 100 Continue: now you can transfer large batches from curl (including curl libraries used by various programming languages) which by default does Expect: 100-continue and waits some time before actually sending the batch. Previously you had to add Expect: header, now it's not needed.

  • ⚠️ BREAKING CHANGE: Pseudo sharding is enabled by default. If you want to disable it make sure you add pseudo_sharding = 0 to section searchd of your Manticore configuration file.

  • Having at least one full-text field in a real-time/plain index is not mandatory anymore. You can now use Manticore even in cases not having anything to do with full-text search.

  • Fast fetching for attributes backed by Manticore Columnar Library: queries like select * from <columnar table> are now much faster than previously, especially if there are many fields in the schema.

  • ⚠️ BREAKING CHANGE: Implicit cutoff. Manticore now doesn't spend time and resources processing data you don't need in the result set which will be returned. The downside is that it affects total_found in SHOW META and in JSON output. It is now only accurate in case you see total_relation: eq while total_relation: gte means the actual number of matching documents is greater than the total_found value you've got. To retain the previous behaviour you can use search option cutoff=0, which makes total_relation always eq.

  • ⚠️ BREAKING CHANGE: All full-text fields are now stored by default. You need to use stored_fields = (empty value) to make all fields non-stored (i.e. revert to the previous behaviour).

  • #715 HTTP JSON supports search options.

Minor changes

  • ⚠️ BREAKING CHANGE: Index meta file format change. Previously meta files (.meta, .sph) were in binary format, now it's just json. The new Manticore version will convert older indexes automatically, but:
    • you can get warning like WARNING: ... syntax error, unexpected TOK_IDENT
    • you won't be able to run the index with previous Manticore versions, make sure you have a backup
  • ⚠️ BREAKING CHANGE: Session state support with help of HTTP keep-alive. This makes HTTP stateful when the client supports it too. For example, using the new /cli endpoint and HTTP keep-alive (which is on by default in all browsers) you can call SHOW META after SELECT and it will work the same way it works via mysql. Note, previously Connection: keep-alive HTTP header was supported too, but it only caused reusing the same connection. Since this version it also makes the session stateful.
  • You can now specify columnar_attrs = * to define all your attributes as columnar in the plain mode which is useful in case the list is long.
  • Faster replication SST
  • ⚠️ BREAKING CHANGE: Replication protocol has been changed. If you are running a replication cluster, then when upgrading to Manticore 5 you need to:
    • stop all your nodes first cleanly
    • and then start the node which was stopped last with --new-cluster (run tool manticore_new_cluster in Linux).
    • read about restarting a cluster for more details.
  • Replication improvements:
    • Faster SST
    • Noise resistance which can help in case of unstable network between replication nodes
    • Improved logging
  • Security improvement: Manticore now listens on instead of in case no listen at all is specified in config. Even though in the default configuration which is shipped with Manticore Search the listen setting is specified and it's not typical to have a configuration with no listen at all, it's still possible. Previously Manticore would listen on which is not secure, now it listens on which is usually not exposed to the Internet.
  • Faster aggregation over columnar attributes.
  • Increased AVG() accuracy: previously Manticore used float internally for aggregations, now it uses double which increases the accuracy significantly.
  • Improved support for JDBC MySQL driver.
  • DEBUG malloc_stats support for jemalloc.
  • optimize_cutoff is now available as a per-table setting which can be set when you CREATE or ALTER a table.
  • ⚠️ BREAKING CHANGE: query_log_format is now sphinxql by default. If you are used to plain format you need to add query_log_format = plain to your configuration file.
  • Significant memory consumption improvements: Manticore consumes significantly less RAM now in case of long and intensive insert/replace/optimize workload in case stored fields are used.
  • shutdown_timeout default value was increased from 3 seconds to 60 seconds.
  • Commit ffd0499d Support for Java mysql connector >= 6.0.3: in Java mysql connection 6.0.3 they changed the way they connect to mysql which broke compatibility with Manticore. The new behaviour is now supported.
  • Commit 1da6dbec disabled saving a new disk chunk on loading an index (e.g. on searchd startup).
  • Issue #746 Support for glibc >= 2.34.
  • Issue #784 count 'VIP' connections separately from usual (non-VIP). Previously VIP connections were counted towards the max_connections limit, which could cause "maxed out" error for non-VIP connections. Now VIP connections are not counted towards the limit. Current number of VIP connections can be also seen in SHOW STATUS and status.
  • ID can now be specified explicitly.
  • Issue #687 support zstd compression for mysql proto

⚠️ Other minor breaking changes

  • ⚠️ BM25F formula has been slightly updated to improve search relevance. This only affects search results in case you use function BM25F(), it doesn't change behaviour of the default ranking formula.
  • ⚠️ Changed behaviour of REST /sql endpoint: /sql?mode=raw now requires escaping and returns an array.
  • ⚠️ Format change of the response of /bulk INSERT/REPLACE/DELETE requests:
    • previously each sub-query constituted a separate transaction and resulted in a separate response
    • now the whole batch is considered a single transaction, which returns a single response
  • ⚠️ Search options low_priority and boolean_simplify now require a value (0/1): previously you could do SELECT ... OPTION low_priority, boolean_simplify, now you need to do SELECT ... OPTION low_priority=1, boolean_simplify=1.
  • ⚠️ If you are using old php, python or java clients please follow the corresponding link and find an updated version. The old versions are not fully compatible with Manticore 5.
  • ⚠️ HTTP JSON requests are now logged in different format in mode query_log_format=sphinxql. Previously only full-text part was logged, now it's logged as is.

New packages

  • ⚠️ BREAKING CHANGE: because of the new structure when you upgrade to Manticore 5 it's recommended to remove old packages before you install the new ones:

    • RPM-based: yum remove manticore*
    • Debian and Ubuntu: apt remove manticore*
  • New deb/rpm packages structure. Previous versions provided:

    • manticore-server with searchd (main search daemon) and all needed for it
    • manticore-tools with indexer and indextool
    • manticore including everything
    • manticore-all RPM as a meta package referring to manticore-server and manticore-tools

    The new structure is:

    • manticore - deb/rpm meta package which installs all the above as dependencies
    • manticore-server-core - searchd and everything to run it alone
    • manticore-server - systemd files and other supplementary scripts
    • manticore-tools - indexer, indextool and other tools
    • manticore-common - default configuration file, default data directory, default stopwords
    • manticore-icudata, manticore-dev, manticore-converter didn't change much
    • .tgz bundle which includes all the packages
  • Support for Ubuntu Jammy

  • Support for Amazon Linux 2 via YUM repo


  • Issue #287 out of memory while indexing RT index
  • Issue #604 Breaking change 3.6.0, 4.2.0 sphinxql-parser
  • Issue #667 FATAL: out of memory (unable to allocate 9007199254740992 bytes)
  • Issue #676 Strings not passed correctly to UDFs
  • Issue #698 Searchd crashes after trying to add a text column to a rt index
  • Issue #705 Indexer couldn't find all columns
  • Issue #709 Grouping by json.boolean works wrong
  • Issue #716 indextool commands related to index (eg. --dumpdict) failure
  • Issue #724 Fields disappear from the selection
  • Issue #727 .NET HttpClient Content-Type incompatibility when using application/x-ndjson
  • Issue #729 Field length calculation
  • Issue #730 create/insert into/drop columnar table has a memleak
  • Issue #731 Empty column in results under certain conditions
  • Issue #749 Crash of daemon on start
  • Issue #750 Daemon hangs on start
  • Issue #751 Crash at SST
  • Issue #752 Json attribute marked as columnar when engine='columnar'
  • Issue #753 Replication listens on 0
  • Issue #754 columnar_attrs = * is not working with csvpipe
  • Issue #755 Crash on select float in columnar in rt
  • Issue #756 Indextool changes rt index during check
  • Issue #757 Need a check for listeners port range intersections
  • Issue #758 Log original error in case RT index failed to save disk chunk
  • Issue #759 Only one error reported for RE2 config
  • Issue #760 RAM consumption changes in commit 5463778558586d2508697fa82e71d657ac36510f
  • Issue #761 3rd node doesn't make a non-primary cluster after dirty restart
  • Issue #762 Update counter gets increased by 2
  • Issue #763 New version 4.2.1 corrupt index created with 4.2.0 with morphology using
  • Issue #764 No escaping in json keys /sql?mode=raw
  • Issue #765 Using function hides other values
  • Issue #766 Memleak triggered by a line in FixupAttrForNetwork
  • Issue #767 Memleak in 4.2.0 and 4.2.1 related with docstore cache
  • Issue #768 Strange ping-pong with stored fields over network
  • Issue #769 lemmatizer_base reset to empty if not mentioned in 'common' section
  • Issue #770 pseudo_sharding makes SELECT by id slower
  • Issue #771 DEBUG malloc_stats output zeros when using jemalloc
  • Issue #772 Drop/add column makes value invisible
  • Issue #773 Can't add column bit(N) to columnar table
  • Issue #774 "cluster" gets empty on start in manticore.json
  • Commit 1da4ce89 HTTP actions are not tracked in SHOW STATUS
  • Commit 381000ab disable pseudo_sharding for low frequency single keyword queries
  • Commit 800325cc fixed stored attributes vs index merge
  • Commit cddfeed6 generalized distinct value fetchers; added specialized distinct fetchers for columnar strings
  • Commit fba4bb4f fixed fetching null integer attributes from docstore
  • Commit f3009a92 ranker could be specified twice in query log

Version 4.2.0, Dec 23 2021

Major new features

  • Pseudo-sharding support for real-time indexes and full-text queries. In previous release we added limited pseudo sharding support. Starting from this version you can get all benefits of the pseudo sharding and your multi-core processor by just enabling searchd.pseudo_sharding. The coolest thing is that you don't need to do anything with your indexes or queries for that, just enable it and if you have free CPU it will be used to lower your response time. It supports plain and real-time indexes for full-text, filtering and analytical queries. For example, here is how enabling pseudo sharding can make most queries' response time in average about 10x lower on Hacker news curated comments dataset multiplied 100 times (116 million docs in a plain index).

Pseudo sharding on vs off in 4.2.0

  • PQ transactions are now atomic and isolated. Previously PQ transactions support was limited. It enables much faster REPLACE into PQ, especially when you need to replace a lot of rules at once. Performance details:
  • 4.0.2
  • 4.2.0

It takes 48 seconds to insert 1M PQ rules and 406 seconds to REPLACE just 40K in 10K batches.

root@perf3 ~ # mysql -P9306 -h0 -e "drop table if exists pq; create table pq (f text, f2 text, j json, s string) type='percolate';"; date; for m in `seq 1 1000`; do (echo -n "insert into pq (id,query,filters,tags) values "; for n in `seq 1 1000`; do echo -n "(0,'@f (cat | ( angry dog ) | (cute mouse)) @f2 def', 'j.json.language=\"en\"', '{\"tag1\":\"tag1\",\"tag2\":\"tag2\"}')"; [ $n != 1000 ] && echo -n ","; done; echo ";")|mysql -P9306 -h0; done; date; mysql -P9306 -h0 -e "select count(*) from pq"

Wed Dec 22 10:24:30 AM CET 2021
Wed Dec 22 10:25:18 AM CET 2021
| count(*) |
|  1000000 |

root@perf3 ~ # date; (echo "begin;"; for offset in `seq 0 10000 30000`; do n=0; echo "replace into pq (id,query,filters,tags) values "; for id in `mysql -P9306 -h0 -NB -e "select id from pq limit $offset, 10000 option max_matches=1000000"`; do echo "($id,'@f (tiger | ( angry bear ) | (cute panda)) @f2 def', 'j.json.language=\"de\"', '{\"tag1\":\"tag1\",\"tag2\":\"tag2\"}')"; n=$((n+1)); [ $n != 10000 ] && echo -n ","; done; echo ";"; done; echo "commit;") > /tmp/replace.sql; date
Wed Dec 22 10:26:23 AM CET 2021
Wed Dec 22 10:26:27 AM CET 2021
root@perf3 ~ # time mysql -P9306 -h0 < /tmp/replace.sql

real    6m46.195s
user    0m0.035s
sys 0m0.008s

Minor changes

  • optimize_cutoff is now available as a configuration option in section searchd. It's useful when you want to limit the RT chunks count in all your indexes to a particular number globally.
  • Commit 00874743 accurate count(distinct ...) and FACET ... distinct over several local physical indexes (real-time/plain) with identical fields set/order.
  • PR #598 bigint support for YEAR() and other timestamp functions.
  • Commit 8e85d4bc Adaptive rt_mem_limit. Previously Manticore Search was collecting exactly up to rt_mem_limit of data before saving a new disk chunk to disk, and while saving was still collecting up to 10% more (aka double-buffer) to minimize possible insert suspension. If that limit was also exhausted, adding new documents was blocked until the disk chunk was fully saved to disk. The new adaptive limit is built on the fact that we have auto-optimize now, so it's not a big deal if disk chunks do not fully respect rt_mem_limit and start flushing a disk chunk earlier. So, now we collect up to 50% of rt_mem_limit and save that as a disk chunk. Upon saving we look at the statistics (how much we've saved, how many new documents have arrived while saving) and recalculate the initial rate which will be used next time. For example, if we saved 90 million documents, and another 10 million docs arrived while saving, the rate is 90%, so we know that next time we can collect up to 90% of rt_mem_limit before starting flushing another disk chunk. The rate value is calculated automatically from 33.3% to 95%.
  • Issue #628 unpack_zlib for PostgreSQL source. Thank you, Dmitry Voronin for the contribution.
  • Commit 6d54cf2b indexer -v and --version. Previously you could still see indexer's version, but -v/--version were not supported.
  • Issue #662 infinit mlock limit by default when Manticore is started via systemd.
  • Commit 63c8cd05 spinlock -> op queue for coro rwlock.
  • Commit 41130ce3 environment variable MANTICORE_TRACK_RT_ERRORS useful for debugging RT segments corruption.

Breaking changes

  • Binlog version was increased, binlog from previous version won't be replayed, so make sure you stop Manticore Search cleanly during upgrade: no binlog files should be in /var/lib/manticore/binlog/ except binlog.meta after stopping the previous instance.
  • Commit 3f659f36 new column "chain" in show threads option format=all. It shows stack of some task info tickets, most useful for profiling needs, so if you are parsing show threads output be aware of the new column.
  • searchd.workers was obsoleted since 3.5.0, now it's deprecated, if you still have it in your configuration file it will trigger a warning on start. Manticore Search will start, but with a warning.
  • If you use PHP and PDO to access Manticore you need to do PDO::ATTR_EMULATE_PREPARES


  • Issue #650 Manticore 4.0.2 slower than Manticore 3.6.3. 4.0.2 was faster than previous versions in terms of bulk inserts, but significantly slower for single document inserts. It's been fixed in 4.2.0.
  • Commit 22f4141b RT index could get corrupted under intensive REPLACE load, or it could crash
  • Commit 03be91e4 fixed average at merging groupers and group N sorter; fixed merge of aggregates
  • Commit 2ea575d3 indextool --check could crash
  • Commit 7ec76d4a RAM exhaustion issue caused by UPDATEs
  • Commit 658a727e daemon could hang on INSERT
  • Commit 46e42b9b daemon could hang on shutdown
  • Commit f8d7d517 daemon could crash on shutdown
  • Commit 733accf1 daemon could hang on crash
  • Commit f7f8bd8c daemon could crash on startup trying to rejoin cluster with invalid nodes list
  • Commit 14015561 distributed index could get completely forgotten in RT mode in case it couldn't resolve one of its agents on start
  • Issue #683 attr bit(N) engine='columnar' fails
  • Issue #682 create table fails, but leaves dir
  • Issue #663 Config fails with: unknown key name 'attr_update_reserve'
  • Issue #632 Manticore crash on batch queries
  • Issue #679 Batch queries causing crashes again with v4.0.3
  • Commit f7f8bd8c fixed daemon crash on startup trying to re-join cluster with invalid nodes list
  • Issue #643 Manticore 4.0.2 does not accept connections after batch of inserts
  • Issue #635 FACET query with ORDER BY JSON.field or string attribute could crash
  • Issue #634 Crash SIGSEGV on query with packedfactors
  • Commit 41657f15 morphology_skip_fields was not supported by create table

Version 4.0.2, Sep 21 2021

Major new features

  • Full support of Manticore Columnar Library. Previously Manticore Columnar Library was supported only for plain indexes. Now it's supported:

    • in real-time indexes for INSERT, REPLACE, DELETE, OPTIMIZE
    • in replication
    • in ALTER
    • in indextool --check
  • Automatic indexes compaction (Issue #478). Finally, you don't have to call OPTIMIZE manually or via a crontask or other kind of automation. Manticore now does it for you automatically and by default. You can set default compaction threshold via optimize_cutoff global variable.

  • Chunk snapshots and locks system revamp. These changes may be invisible from outside at first glance, but they improve the behaviour of many things happening in real-time indexes significantly. In a nutshell, previously most Manticore data manipulation operations relied on locks heavily, now we use disk chunk snapshots instead.

  • Significantly faster bulk INSERT performance into a real-time index. For example on Hetzner's server AX101 with SSD, 128 GB of RAM and AMD's Ryzen™ 9 5950X (16*2 cores) with 3.6.0 you could get 236K docs per second inserted into a table with schema name text, email string, description text, age int, active bit(1) (default rt_mem_limit, batch size 25000, 16 concurrent insert workers, 16 million docs inserted overall). In 4.0.2 the same concurrency/batch/count gives 357K docs per second.

  • ALTER can add/remove a full-text field (in RT mode). Previously it could only add/remove an attribute.

  • 🔬 Experimental: pseudo-sharding for full-scan queries - allows to parallelize any non-full-text search query. Instead of preparing shards manually you can now just enable new option searchd.pseudo_sharding and expect up to CPU cores lower response time for non-full-text search queries. Note it can easily occupy all existing CPU cores, so if you care not only about latency, but throughput too - use it with caution.

Minor changes

  • Linux Mint and Ubuntu Hirsute Hippo are supported via APT repository
  • faster update by id via HTTP in big indexes in some cases (depends on the ids distribution)
  • 671e65a2 - added caching to lemmatizer-uk
  • 3.6.0
  • 4.0.2
time curl -X POST -d '{"update":{"index":"idx","id":4611686018427387905,"doc":{"mode":0}}}' -H "Content-Type: application/x-ndjson"

real    0m43.783s
user    0m0.008s
sys     0m0.007s

Breaking changes

  • the new version can read older indexes, but the older versions can't read Manticore 4's indexes
  • removed implicit sorting by id. Sort explicitly if required
  • charset_table's default value changes from 0..9, A..Z->a..z, _, a..z, U+410..U+42F->U+430..U+44F, U+430..U+44F, U+401->U+451, U+451 to non_cjk
  • OPTIMIZE happens automatically. If you don't need it make sure to set auto_optimize=0 in section searchd in the configuration file
  • Issue #616 ondisk_attrs_default were deprecated, now they are removed
  • for contributors: we now use Clang compiler for Linux builds as according to our tests it can build a faster Manticore Search and Manticore Columnar Library
  • if max_matches is not specified in a search query it gets updated implicitly with the lowest needed value for the sake of performance of the new columnar storage. It can affect metric total in SHOW META, but not total_found which is the actual number of found documents.

Migration from Manticore 3

  • make sure you a stop Manticore 3 cleanly:
    • no binlog files should be in /var/lib/manticore/binlog/ (only binlog.meta should be in the directory)
    • otherwise the indexes Manticore 4 can't reply binlogs for won't be run
  • the new version can read older indexes, but the older versions can't read Manticore 4's indexes, so make sure you make a backup if you want to be able to rollback the new version easily
  • if you run a replication cluster make sure you:
    • stop all your nodes first cleanly
    • and then start the node which was stopped last with --new-cluster (run tool manticore_new_cluster in Linux).
    • read about restarting a cluster for more details


  • Lots of replication issues have been fixed:
    • Commit 696f8649 - fixed crash during SST on joiner with active index; added sha1 verify at joiner node at writing file chunks to speed up index loading; added rotation of changed index files at joiner node on index load; added removal of index files at joiner node when active index gets replaced by a new index from donor node; added replication log points at donor node for sending files and chunks
    • Commit b296c55a - crash on JOIN CLUSTER in case the address is incorrect
    • Commit 418bf880 - while initial replication of a large index the joining node could fail with ERROR 1064 (42000): invalid GTID, (null), the donor could become unresponsive while another node was joining
    • Commit 6fd350d2 - hash could be calculated wrong for a big index which could result in replication failure
    • Issue #615 - replication failed on cluster restart
  • Issue #574 - indextool --help doesn't display parameter --rotate
  • Issue #578 - searchd high CPU usage while idle after ca. a day
  • Issue #587 - flush .meta immediately
  • Issue #617 - manticore.json gets emptied
  • Issue #618 - searchd --stopwait fails under root. It also fixes systemctl behaviour (previously it was showing failure for ExecStop and didn't wait long enough for searchd to stop properly)
  • Issue #619 - INSERT/REPLACE/DELETE vs SHOW STATUS. command_insert, command_replace and others were showing wrong metrics
  • Issue #620 - charset_table for a plain index had a wrong default value
  • Commit 8f753688 - new disk chunks don't get mlocked
  • Issue #607 - Manticore cluster node crashes when unable to resolve a node by name
  • Issue #623 - replication of updated index can lead to undefined state
  • Commit ca03d228 - indexer could hang on indexing a plain index source with a json attribute
  • Commit 53c75305 - fixed not equal expression filter at PQ index
  • Commit ccf94e02 - fixed select windows at list queries above 1000 matches. SELECT * FROM pq ORDER BY id desc LIMIT 1000 , 100 OPTION max_matches=1100 was not working previously
  • Commit a0483fe9 - HTTPS request to Manticore could cause warning like "max packet size(8388608) exceeded"
  • Issue #648 - Manticore 3 could hang after a few updates of string attributes

Version 3.6.0, May 3rd 2021

Maintenance release before Manticore 4

Major new features

  • Support for Manticore Columnar Library for plain indexes. New setting columnar_attrs for plain indexes
  • Support for Ukrainian Lemmatizer
  • Fully revised histograms. When building an index Manticore also builds histograms for each field in it, which it then uses for faster filtering. In 3.6.0 the algorithm was fully revised and you can get a higher performance if you have a lot of data and do a lot of filtering.

Minor changes


  • faster JSON parsing, our tests show 3-4% lower latency on queries like WHERE json.a = 1
  • non-documented command DEBUG SPLIT as a prerequisite for automatic sharding/rebalancing


  • Issue #584 - inaccurate and unstable FACET results
  • Issue #506 - Strange behavior when using MATCH: those who suffer from this issue need to rebuild the index as the problem was on the phase of building an index
  • Issue #387 - intermittent core dump when running query with SNIPPET() function
  • Stack optimizations useful for processing complex queries:
    • Issue #469 - SELECT results in CRASH DUMP
    • e8420cc7 - stack size detection for filter trees
  • Issue #461 - Update using the IN condition does not take effect correctly
  • Issue #464 - SHOW STATUS immediately after CALL PQ returns - Issue #481 - Fixed static binary build
  • Issue #502 - bug in multi-queries
  • Issue #514 - Unable to use unusual names for columns when use 'create table'
  • Commit d1dbe771 - daemon crash on replay binlog with update of string attribute; set binlog version to 10
  • Commit 775d0555 - fixed expression stack frame detection runtime (test 207)
  • Commit 4795dc49 - percolate index filter and tags were empty for empty stored query (test 369)
  • Commit c3f0bf4d - breaks of replication SST flow at network with long latency and high error rate (different data centers replication); updated replication command version to 1.03
  • Commit ba2d6619 - joiner lock cluster on write operations after join into cluster (test 385)
  • Commit de4dcb9f - wildcards matching with exact modifier (test 321)
  • Commit 6524fc6a - docid checkpoints vs docstore
  • Commit f4ab83c2 - Inconsistent indexer behavior when parsing invalid xml
  • Commit 7b727e22 - Stored percolate query with NOTNEAR runs forever (test 349)
  • Commit 812dab74 - wrong weight for phrase starting with wildcard
  • Commit 1771afc6 - percolate query with wildcards generate terms without payload on matching causes interleaved hits and breaks matching (test 417)
  • Commit aa0d8c2b - fixed calculation of 'total' in case of parallelized query
  • Commit 18d81b3c - crash in Windows with multiple concurrent sessions at daemon
  • Commit 84432f23 - some index settings could not be replicated
  • Commit 93411fe6 - On high rate of adding new events netloop sometimes freeze because of atomic 'kick' event being processed once for several events a time and loosing actual actions from them status of the query, not the server status
  • Commit d805fc12 - New flushed disk chunk might be lost on commit
  • Commit 63cbf008 - inaccurate 'net_read' in profiler
  • Commit f5379bb2 - Percolate issue with arabic (right to left texts)
  • Commit 49eeb420 - id not picked correctly on duplicate column name
  • Commit refactoring of network events to fix a crash in rare cases
  • e8420cc7 fix in indextool --dumpheader
  • Commit ff716353 - TRUNCATE WITH RECONFIGURE worked wrong with stored fields

Breaking changes:

  • New binlog format: you need to make a clean stop of Manticore before upgrading
  • Index format slightly changes: the new version can read you existing indexes fine, but if you decide to downgrade from 3.6.0 to an older version the newer indexes will be unreadable
  • Replication format change: don't replicate from an older version to 3.6.0 and vice versa, switch to the new version on all your nodes at once
  • reverse_scan is deprecated. Make sure you don't use this option in your queries since 3.6.0 since they will fail otherwise
  • As of this release we don't provide builds for RHEL6, Debian Jessie and Ubuntu Trusty any more. If it's mission critical for you to have them supported contact us


  • No more implicit sorting by id. If you rely on it make sure to update your queries accordingly
  • Search option reverse_scan has been deprecated

Version 3.5.4, Dec 10 2020

New Features

  • New Python, Javascript and Java clients are generally available now and are well documented in this manual.
  • automatic drop of a disk chunk of a real-time index. This optimization enables dropping a disk chunk automatically when OPTIMIZing a real-time index when the chunk is obviously not needed any more (all the documents are suppressed). Previously it still required merging, now the chunk can be just dropped instantly. The cutoff option is ignored, i.e. even if nothing is actually merged an obsoleted disk chunk gets removed. This is useful in case you maintain retention in your index and delete older documents. Now compacting such indexes will be faster.
  • standalone NOT as an option for SELECT

Minor Changes


  • indexer --verbose is deprecated as it never added anything to the indexer output
  • For dumping watchdog's backtrace signal USR2 is now to be used instead of USR1


Version 3.5.2, Oct 1 2020

New features

  • OPTIMIZE reduces disk chunks to a number of chunks ( default is 2* No. of cores) instead of a single one. The optimal number of chunks can be controlled by cutoff option.
  • NOT operator can be now used standalone. By default it is disabled since accidental single NOT queries can be slow. It can be enabled by setting new searchd directive not_terms_only_allowed to 0.
  • New setting max_threads_per_query sets how many threads a query can use. If the directive is not set, a query can use threads up to the value of threads. Per SELECT query the number of threads can be limited with OPTION threads=N overriding the global max_threads_per_query.
  • Percolate indexes can be now be imported with IMPORT TABLE.
  • HTTP API /search receives basic support for faceting/grouping by new query node aggs.

Minor changes

  • If no replication listen directive is declared, the engine will try to use ports after the defined 'sphinx' port, up to 200.
  • listen=...:sphinx needs to be explicit set for SphinxSE connections or SphinxAPI clients.
  • SHOW INDEX STATUS outputs new metrics: killed_documents, killed_rate, disk_mapped_doclists, disk_mapped_cached_doclists, disk_mapped_hitlists and disk_mapped_cached_hitlists.
  • SQL command status now outputs Queue\Threads and Tasks\Threads.


  • dist_threads is completely deprecated now, searchd will log a warning if the directive is still used.


The official Docker image is now based on Ubuntu 20.04 LTS


Besides the usual manticore package, you can also install Manticore Search by components:

  • manticore-server-core - provides searchd, manpage, log dir, API and galera module. It will also install manticore-common as the dependency.
  • manticore-server - provides automation scripts for core (init.d, systemd), and manticore_new_cluster wrapper. It will also install manticore-server-core as the dependency.
  • manticore-common - provides config, stopwords, generic docs and skeleton folders (datadir, modules, etc.)
  • manticore-tools - provides auxiliary tools ( indexer, indextool etc.), their manpages and examples. It will also install manticore-common as the dependency.
  • manticore-icudata (RPM) or manticore-icudata-65l (DEB) - provides ICU data file for icu morphology usage.
  • manticore-devel (RPM) or manticore-dev (DEB) - provides dev headers for UDFs.


  1. Commit 2a474dc1 Crash of daemon at grouper at RT index with different chunks
  2. Commit 57a19e5a Fastpath for empty remote docs
  3. Commit 07dd3f31 Expression stack frame detection runtime
  4. Commit 08ae357c Matching above 32 fields at percolate indexes
  5. Commit 16b9390f Replication listen ports range
  6. Commit 5fa671af Show create table on pq
  7. Commit 54d133b6 HTTPS port behavior
  8. Commit fdbbe524 Mixing docstore rows when replacing
  9. Commit afb53f64 Switch TFO unavailable message level to 'info'
  10. Commit 59d94cef Crash on strcmp invalid use
  11. Commit 04af0349 Adding index to cluster with system (stopwords) files
  12. Commit 50148b4e Merge indexes with large dictionaries; RT optimize of large disk chunks
  13. Commit a2adf158 Indextool can dump meta from current version
  14. Commit 69f6d5f7 Issue in group order in GROUP N
  15. Commit 24d5d80f Explicit flush for SphinxSE after handshake
  16. Commit 31c4d78a Avoid copy of huge descriptions when not necessary
  17. Commit 2959e2ca Negative time in show threads
  18. Commit f0b35710 Token filter plugin vs zero position deltas
  19. Commit a49e5bc1 Change 'FAIL' to 'WARNING' on multiple hits

Version 3.5.0, 22 Jul 2020

Major new features:

  • This release took so long, because we were working hard on changing multitasking mode from threads to coroutines. It makes configuration simpler and queries parallelization much more straightforward: Manticore just uses given number of threads (see new setting threads) and the new mode makes sure it's done in the most optimal way.

  • Changes in highlighting:

    • any highlighting that works with several fields (highlight({},'field1, field2') or highlight in json queries) now applies limits per-field by default.
    • any highlighting that works with plain text (highlight({}, string_attr) or snippet() now applies limits to the whole document.
    • per-field limits can be switched to global limits by limits_per_field=0 option (1 by default).
    • allow_empty is now 0 by default for highlighting via HTTP JSON.
  • The same port can now be used for http, https and binary API (to accept connections from a remote Manticore instance). listen = *:mysql is still required for connections via mysql protocol. Manticore now detects automatically the type of client trying to connect to it except for MySQL (due to restrictions of the protocol).

  • In RT mode a field can now be text and string attribute at the same time - GitHub issue #331.

    In plain mode it's called sql_field_string. Now it's available in RT mode for real-time indexes too. You can use it as shown in the example:

    create table t(f string attribute indexed);
    insert into t values(0,'abc','abc');
    select * from t where match('abc');
    | id                  | f    |
    | 2810845392541843463 | abc  |
    1 row in set (0.01 sec)
    mysql> select * from t where f='abc';
    | id                  | f    |
    | 2810845392541843463 | abc  |
    1 row in set (0.00 sec)

Minor changes

  • You can now highlight string attributes.
  • SSL and compression support for SQL interface
  • Support of mysql client status command.
  • Replication can now replicate external files (stopwords, exceptions etc.).
  • Filter operator in is now available via HTTP JSON interface.
  • expressions in HTTP JSON.
  • You can now change rt_mem_limit on the fly in RT mode, i.e. can do ALTER ... rt_mem_limit=<new value>.
  • You can now use separate CJK charset tables: chinese, japanese and korean.
  • thread_stack now limits maximum thread stack, not initial.
  • Improved SHOW THREADS output.
  • Display progress of long CALL PQ in SHOW THREADS.
  • cpustat, iostat, coredump can be changed during runtime with SET.
  • SET [GLOBAL] wait_timeout=NUM implemented ,

Breaking changes:

  • Index format has been changed. Indexes built in 3.5.0 cannot be loaded by Manticore version < 3.5.0, but Manticore 3.5.0 understands older formats.
  • INSERT INTO PQ VALUES() (i.e. without providing column list) previously expected exactly (query, tags) as the values. It's been changed to (id,query,tags,filters). The id can be set to 0 if you want it to be auto-generated.
  • allow_empty=0 is a new default in highlighting via HTTP JSON interface.
  • Only absolute paths are allowed for external files (stopwords, exceptions etc.) in CREATE TABLE/ALTER TABLE.


  • ram_chunks_count was renamed to ram_chunk_segments_count in SHOW INDEX STATUS.
  • workers is obsolete. There's only one workers mode now.
  • dist_threads is obsolete. All queries are as much parallel as possible now (limited by threads and jobs_queue_size).
  • max_children is obsolete. Use threads to set the number of threads Manticore will use (set to the # of CPU cores by default).
  • queue_max_length is obsolete. Instead of that in case it's really needed use jobs_queue_size to fine-tune internal jobs queue size (unlimited by default).
  • All /json/* endpoints are now available w/o /json/, e.g. /search, /insert, /delete, /pq etc.
  • field meaning "full-text field" was renamed to "text" in describe.


    mysql> describe t;
    | Field | Type   | Properties     |
    | id    | bigint |                |
    | f     | field  | indexed stored |


    mysql> describe t;
    | Field | Type   | Properties     |
    | id    | bigint |                |
    | f     | text   | indexed stored |
  • Cyrillic и doesn't map to i in non_cjk charset_table (which is a default) as it affected Russian stemmers and lemmatizers too much.
  • read_timeout. Use network_timeout instead which controls both reading and writing.


  • Ubuntu Focal 20.04 official package
  • deb package name changed from manticore-bin to manticore


  1. Issue #351 searchd memory leak
  2. Commit ceabe44f Tiny read out of bounds in snippets
  3. Commit 1c3e84a3 Dangerous write into local variable for crash queries
  4. Commit 26e094ab Tiny memory leak of sorter in test 226
  5. Commit d2c7f86a Huge memory leak in test 226
  6. Commit 0dd80122 Cluster shows the nodes are in sync, but count(*) shows different numbers
  7. Commit f1c1ac3f Cosmetic: Duplicate and sometimes lost warning messages in the log
  8. Commit f1c1ac3f Cosmetic: (null) index name in log
  9. Commit 359dbd30 Cannot retrieve more than 70M results
  10. Commit 19f328ee Can't insert PQ rules with no-columns syntax
  11. Commit bf685d5d Misleading error message when inserting a document to an index in a cluster
  12. Commit 2cf18c83 /json/replace and json/update return id in exponent form
  13. Issue #324 Update json scalar properties and mva in the same query
  14. Commit d38409eb hitless_words doesn't work in RT mode
  15. Commit 5813d639 ALTER RECONFIGURE in rt mode should be disallowed
  16. Commit 5813d639 rt_mem_limit gets reset to 128M after searchd restart
  17. highlight() sometimes hangs
  18. Commit 7cd878f4 Failed to use U+code in RT mode
  19. Commit 2b213de4 Failed to use wildcard at wordforms at RT mode
  20. Commit e9d07e68 Fixed SHOW CREATE TABLE vs multiple wordform files
  21. Commit fc90a84f JSON query without "query" crashes searchd
  22. Manticore official docker couldn't index from mysql 8
  23. Commit 23e05d32 HTTP /json/insert requires id
  24. Commit bd679af0 SHOW CREATE TABLE doesn't work for PQ
  25. Commit bd679af0 CREATE TABLE LIKE doesn't work properly for PQ
  26. Commit 5eacf28f End of line in settings in show index status
  27. Commit cb153228 Empty title in "highlight" in HTTP JSON response
  28. Issue #318 CREATE TABLE LIKE infix error
  29. Commit 9040d22c RT crashes under load
  30. cd512c7d Lost crash log on crash at RT disk chunk
  31. Issue #323 Import table fails and closes the connection
  32. Commit 6275316a ALTER reconfigure corrupts a PQ index
  33. Commit 9c1d221e Searchd reload issues after change index type
  34. Commit 71e2b5bb Daemon crashes on import table with missed files
  35. Issue #322 Crash on select using multiple indexes, group by and ranker = none
  36. Commit c3f58490 HIGHLIGHT() doesn't higlight in string attributes
  37. Issue #320 FACET fails to sort on string attribute
  38. Commit 4f1a1f25 Error in case of missing data dir
  39. Commit 04f4ddd4 access_* are not supported in RT mode
  40. Commit 1c0616a2 Bad JSON objects in strings: 1. CALL PQ returns "Bad JSON objects in strings: 1" when the json is greater than some value.
  41. Commit 32f943d6 RT-mode inconsistency. In some cases I can't drop the index since it's unknown and can't create it since the directory is not empty.
  42. Issue #319 Crash on select
  43. Commit 22a28dd7 max_xmlpipe2_field = 2M returned warning on 2M field
  44. Issue #342 Query conditions execution bug
  45. Commit dd8dcab2 Simple 2 terms search finds a document containing only one term
  46. Commit 90919e62 It was impossible in PQ to match a json with capital letters in keys
  47. Commit 56da086a Indexer crashes on csv+docstore
  48. Issue #363 using [null] in json attr in centos 7 causes corrupted inserted data
  49. Major Issue #345 Records not being inserted, count() is random, "replace into" returns OK
  50. max_query_time slows down SELECTs too much
  51. Issue #352 Master-agent communication fails on Mac OS
  52. Issue #328 Error when connecting to Manticore with Connector.Net/Mysql 8.0.19
  53. Commit daa760d2 Fixed escaping of \0 and optimized performance
  54. Commit 9bc5c01a Fixed count distinct vs json
  55. Commit 4f89a965 Fixed drop table at other node failed
  56. Commit 952af5a5 Fix crashes on tightly running call pq

Version 3.4.2, 10 April 2020

Critical bugfixes

Version 3.4.0, 26 March 2020

Major changes

  • server works in 2 modes: rt-mode and plain-mode
    • rt-mode requires data_dir and no index definition in config
    • in plain-mode indexes are defined in config; no data_dir allowed
  • replication available only in rt-mode

Minor changes

  • charset_table defaults to non_cjk alias
  • in rt-mode full-text fields are indexed and stored by default
  • full-text fields in rt-mode renamed from 'field' to 'text'


  • stored-only fields


  • much faster lockless PQ
  • /sql can execute any type of SQL statement in mode=raw
  • alias mysql for mysql41 protocol
  • default state.sql in data_dir


Version 3.3.0, 4 February 2020


  • Parallel Real-Time index searching
  • EXPLAIN QUERY command
  • configuration file without index definitions (alpha version)
  • CREATE/DROP TABLE commands (alpha version)
  • indexer --print-rt - can read from a source and print INSERTs for a Real-Time index


  • Updated to Snowball 2.0 stemmers
  • improved memory usage for high max_matches
  • SHOW INDEX STATUS adds ram_chunks_count for RT indexes
  • lockless PQ
  • changed LimitNOFILE to 65536


Version 3.2.2, 19 December 2019


  • Autoincrement ID for RT indexes
  • Highlight support for docstore via new HIGHLIGHT() function, available also in HTTP API
  • SNIPPET() can use special function QUERY() which returns current MATCH query
  • new field_separator option for highlighting functions.

Improvements and changes

  • lazy fetch of stored fields for remote nodes (can significantly increase performance)
  • strings and expressions don't break anymore multi-query and FACET optimizations
  • RHEL/CentOS 8 build now uses mysql libclient from mariadb-connector-c-devel
  • ICU data file is now shipped with the packages, icu_data_dir removed
  • systemd service files include 'Restart=on-failure' policy
  • indextool can now check real-time indexes online
  • default conf is now /etc/manticoresearch/manticore.conf
  • service on RHEL/CentOS renamed to 'manticore' from 'searchd'
  • removed query_mode and exact_phrase snippet's options


  • Commit 6ae474c7 fix crash on SELECT query over HTTP interface
  • Commit 59577513 fix RT index saves disk chunks but does not mark some documents deleted
  • Commit e861f0fc fix crash on search of multi index or multi queries with dist_threads
  • Commit 440991fc fix crash on infix generation for long terms with wide utf8 codepoints
  • Commit 5fd599b4 fix race at adding socket to IOCP
  • Commit cf10d7d3 fix issue of bool queries vs json select list
  • Commit 996de77f fix indextool check to report wrong skiplist offset, check of doc2row lookup
  • Commit 6e3fc9e8 fix indexer produces bad index with negative skiplist offset on large data
  • Commit faed3220 fix JSON converts only numeric to string and JSON string to numeric conversion at expressions
  • Commit 53319720 fix indextool exit with error code in case multiple commands set at command line
  • Commit 795520ac fix #275 binlog invalid state on error no space left on disk
  • Commit 2284da5e fix #279 crash on IN filter to JSON attribute
  • Commit ce2e4b47 fix #281 wrong pipe closing call
  • Commit 535589ba fix server hung at CALL PQ with recursive JSON attribute encoded as string
  • Commit a5fc8a36 fix advancing beyond the end of the doclist in multiand node
  • Commit a3628617 fix retrieving of thread public info
  • Commit f8d2d7bb fix docstore cache locks

Version 3.2.0, 17 October 2019


  • Document storage
  • new directives stored_fields, docstore_cache_size, docstore_block_size, docstore_compression, docstore_compression_level

Improvements and changes

  • improved SSL support
  • non_cjk built-in charset updated
  • disabled UPDATE/DELETE statements logging a SELECT in query log
  • RHEL/CentOS 8 packages


Version 3.1.2, 22 August 2019

Features and Improvements

  • Experimental SSL support for HTTP API
  • field filter for CALL KEYWORDS
  • max_matches for /json/search
  • automatic sizing of default Galera gcache.size
  • improved FreeBSD support


Version 3.1.0, 16 July 2019

Features and Improvements

  • replication for RealTime indexes
  • ICU tokenizer for chinese
  • new morphology option icu_chinese
  • new directive icu_data_dir
  • multiple statements transactions for replication
  • LAST_INSERT_ID() and @session.last_insert_id
  • LIKE 'pattern' for SHOW VARIABLES
  • Multiple documents INSERT for percolate indexes
  • Added time parsers for config
  • internal task manager
  • mlock for doc and hit lists components
  • jail snippets path


  • RLP library support dropped in favor of ICU; all rlp* directives removed
  • updating document ID with UPDATE is disabled


Version 3.0.2, 31 May 2019


  • added mmap readers for docs and hit lists
  • /sql HTTP endpoint response is now the same as /json/search response
  • new directives access_plain_attrs, access_blob_attrs, access_doclists, access_hitlists
  • new directive server_id for replication setups


  • removed HTTP /search endpoint


  • read_buffer, ondisk_attrs, ondisk_attrsdefault, mlock (replaced by `access*` directives)


Version 3.0.0, 6 May 2019

Features and improvements

  • New index storage. Non-scalar attributes are not limited anymore to 4GB size per index
  • attr_update_reserve directive
  • String,JSON and MVAs can be updated using UPDATE
  • killlists are applied at index load time
  • killlist_target directive
  • multi AND searches speedup
  • better average performance and RAM usage
  • convert tool for upgrading indexes made with 2.x
  • CONCAT() function
  • JOIN CLUSTER cluster AT 'nodeaddress:port'
  • ALTER CLUSTER posts UPDATE nodes
  • node_address directive
  • list of nodes printed in SHOW STATUS

Behaviour changes

  • in case of indexes with killists, server doesn't rotate indexes in order defined in conf, but follows the chain of killlist targets
  • order of indexes in a search no longer defines the order in which killlists are applied
  • Document IDs are now signed big integers

Removed directives

  • docinfo (always extern now), inplace_docinfo_gap, mva_updates_pool

Version 2.8.2 GA, 2 April 2019

Features and improvements

  • Galera replication for percolate indexes
  • OPTION morphology

Compiling notes

Cmake minimum version is now 3.13. Compiling requires boost and libssl development libraries.


Version 2.8.1 GA, 6 March 2019

Features and improvements

  • SENTENCE and PARAGRAPH support for percolate queries
  • systemd generator for Debian/Ubuntu; also added LimitCORE to allow core dumping


Version 2.8.0 GA, 28 January 2019


  • Distributed indexes for percolate indexes
  • CALL PQ new options and changes:
    • skip_bad_json
    • mode (sparsed/sharded)
    • json documents can be passed as a json array
    • shift
    • Column names 'UID', 'Documents', 'Query', 'Tags', 'Filters' were renamed to 'id', 'documents', 'query', 'tags', 'filters'
  • SELECT FROM pq WHERE UID is not possible any more, use 'id' instead
  • SELECT over pq indexes is on par with regular indexes (e.g. you can filter rules via REGEX())
  • ANY/ALL can be used on PQ tags
  • expressions have auto-conversion for JSON fields, not requiring explicit casting
  • built-in 'non_cjk' charset_table and 'cjk' ngram_chars
  • built-in stopwords collections for 50 languages
  • multiple files in a stopwords declaration can also be separated by comma
  • CALL PQ can accept JSON array of documents


  • Commit a4e19af fixed csjon-related leak
  • Commit 28d8627 fixed crash because of missed value in json
  • Commit bf4e9ea fixed save of empty meta for RT index
  • Commit 33b4573 fixed lost form flag (exact) for sequence of lemmatizer
  • Commit 6b95d48 fixed string attrs > 4M use saturate instead of overflow
  • Commit 621418b fixed crash of server on SIGHUP with disabled index
  • Commit 3f7e35d fixed server crash on simultaneous API session status commands
  • Commit cd9e4f1 fixed crash of server at delete query to RT index with field filters
  • Commit 9376470 fixed crash of server at CALL PQ to distributed index with empty document
  • Commit 8868b20 fixed cut Manticore SQL error message larger 512 chars
  • Commit de9deda fixed crash on save percolate index without binlog
  • Commit 2b219e1 fixed http interface is not working in OSX
  • Commit e92c602 fixed indextool false error message on check of MVA
  • Commit 238bdea fixed write lock at FLUSH RTINDEX to not write lock whole index during save and on regular flush from rt_flush_period
  • Commit c26a236 fixed ALTER percolate index stuck waiting search load
  • Commit 9ee5703 fixed max_children to use default amount of thread_pool workers for value of 0
  • Commit 5138fc0 fixed error on indexing of data into index with index_token_filter plugin along with stopwords and stopword_step=0
  • Commit 2add3d3 fixed crash with absent lemmatizer_base when still using aot lemmatizers in index definitions

Version 2.7.5 GA, 4 December 2018


  • REGEX function
  • limit/offset for json API search
  • profiler points for qcache


  • Commit eb3c768 fixed crash of server on FACET with multiple attribute wide types
  • Commit d915cf6 fixed implicit group by at main select list of FACET query
  • Commit 5c25dc2 fixed crash on query with GROUP N BY
  • Commit 85d30a2 fixed deadlock on handling crash at memory operations
  • Commit 85166b5 fixed indextool memory consumption during check
  • Commit 58fb031 fixed gmock include not needed anymore as upstream resolve itself

Version 2.7.4 GA, 1 November 2018


  • SHOW THREADS in case of remote distributed indexes prints the original query instead of API call
  • SHOW THREADS new option format=sphinxql prints all queries in SQL format
  • SHOW PROFILE prints additional clone_attrs stage


  • Commit 4f15571 fixed failed to build with libc without malloc_stats, malloc_trim
  • Commit f974f20 fixed special symbols inside words for CALL KEYWORDS result set
  • Commit 0920832 fixed broken CALL KEYWORDS to distributed index via API or to remote agent
  • Commit fd686bf fixed distributed index agent_query_timeout propagate to agents as max_query_time
  • Commit 4ffa623 fixed total documents counter at disk chunk got affected by OPTIMIZE command and breaks weight calculation
  • Commit dcaf4e0 fixed multiple tail hits at RT index from blended
  • Commit eee3817 fixed deadlock at rotation

Version 2.7.3 GA, 26 September 2018


  • sort_mode option for CALL KEYWORDS
  • DEBUG on VIP connection can perform 'crash ' for intentional SIGEGV action on server
  • DEBUG can perform 'malloc_stats' for dumping malloc stats in searchd.log 'malloc_trim' to perform a malloc_trim()
  • improved backtrace is gdb is present on the system


Version 2.7.2 GA, 27 August 2018


  • compatibility with MySQL 8 clients
  • retired memory counter on SHOW STATUS for RT indexes
  • global cache of multi agents
  • improved IOCP on Windows
  • VIP connections for HTTP protocol
  • Manticore SQL DEBUG command which can run various subcommands
  • shutdown_token - SHA1 hash of password needed to invoke shutdown using DEBUG command
  • new stats to SHOW AGENT STATUS (_ping, _has_perspool, _need_resolve)
  • --verbose option of indexer now accept [debugvv] for printing debug messages


Version 2.7.1 GA, 4 July 2018


  • improved wildcards performance on matching multiple documents at PQ
  • support for fullscan queries at PQ
  • support for MVA attributes at PQ
  • regexp and RLP support for percolate indexes


Version 2.7.0 GA, 11 June 2018


  • reduced number of syscalls to avoid Meltdown and Spectre patches impact
  • internal rewrite of local index management
  • remote snippets refactor
  • full configuration reload
  • all node connections are now independent
  • proto improvements
  • Windows communication switched from wsapoll to IO completion ports
  • TFO can be used for communication between master and nodes
  • SHOW STATUS now outputs to server version and mysql_version_string
  • added docs_id option for documents called in CALL PQ.
  • percolate queries filter can now contain expressions
  • distributed indexes can work with FEDERATED
  • dummy SHOW NAMES COLLATE and SET wait_timeout (for better ProxySQL compatibility)


Version 2.6.4 GA, 3 May 2018

Features and improvements

  • MySQL FEDERATED engine support
  • MySQL packets return now SERVER_STATUS_AUTOCOMMIT flag, adds compatibility with ProxySQL
  • listen_tfo - enable TCP Fast Open connections for all listeners
  • indexer --dumpheader can dump also RT header from .meta file
  • cmake build script for Ubuntu Bionic


  • Commit 355b116 fixed invalid query cache entries for RT index;
  • Commit 546e229 fixed index settings got lost next after seamless rotation
  • Commit 0c45098 fixed fixed infix vs prefix length set; added warning on unsupportedinfix length
  • Commit 80542fa fixed RT indexes auto-flush order
  • Commit 705d8c5 fixed result set schema issues for index with multiple attributes and queries to multiple indexes
  • Commit b0ba932 fixed some hits got lost at batch insert with document duplicates
  • Commit 4510fa4 fixed optimize failed to merge disk chunks of RT index with large documents count

Version 2.6.3 GA, 28 March 2018


  • jemalloc at compilation. If jemalloc is present on system, it can be enabled with cmake flag -DUSE_JEMALLOC=1


  • Commit 85a6d7e fixed log expand_keywords option into Manticore SQL query log
  • Commit caaa384 fixed HTTP interface to correctly process query with large size
  • Commit e386d84 fixed crash of server on DELETE to RT index with index_field_lengths enable
  • Commit cd538f3 fixed cpustats searchd cli option to work with unsupported systems
  • Commit 8740fd6 fixed utf8 substring matching with min lengths defined

Version 2.6.2 GA, 23 February 2018


  • improved Percolate Queries performance in case of using NOT operator and for batched documents.
  • percolate_query_call can use multiple threads depending on dist_threads
  • new full-text matching operator NOTNEAR/N
  • LIMIT for SELECT on percolate indexes
  • expand_keywords can accept 'start','exact' (where 'star,exact' has same effect as '1')
  • ranged-main-query for joined fields which uses the ranged query defined by sql_query_range


  • Commit 72dcf66 fixed crash on searching ram segments; deadlock on save disk chunk with double buffer; deadlock on save disk chunk during optimize
  • Commit 3613714 fixed indexer crash on xml embedded schema with empty attribute name
  • Commit 48d7e80 fixed erroneous unlinking of not-owned pid-file
  • Commit a5563a4 fixed orphaned fifos sometimes left in temp folder
  • Commit 2376e8f fixed empty FACET result set with wrong NULL row
  • Commit 4842b67 fixed broken index lock when running server as windows service
  • Commit be35fee fixed wrong iconv libs on mac os
  • Commit 83744a9 fixed wrong count(*)

Version 2.6.1 GA, 26 January 2018


  • agent_retry_count in case of agents with mirrors gives the value of retries per mirror instead of per agent, the total retries per agent being agent_retry_count*mirrors.
  • agent_retry_count can now be specified per index, overriding global value. An alias mirror_retry_count is added.
  • a retry_count can be specified in agent definition and the value represents retries per agent
  • Percolate Queries are now in HTTP JSON API at /json/pq.
  • Added -h and -v options (help and version) to executables
  • morphology_skip_fields support for Real-Time indexes


  • Commit a40b079 fixed ranged-main-query to correctly work with sql_range_step when used at MVA field
  • Commit f2f5375 fixed issue with blackhole system loop hung and blackhole agents seems disconnected
  • Commit 84e1f54 fixed query id to be consistent, fixed duplicated id for stored queries
  • Commit 1948423 fixed server crash on shutdown from various states
  • Commit 9a706b Commit 3495fd7 timeouts on long queries
  • Commit 3359bcd8 refactored master-agent network polling on kqueue-based systems (Mac OS X, BSD).

Version 2.6.0, 29 December 2017

Features and improvements


  • Commit 0cfae4c fixed crash on debug build of server (and m.b. UB on release) when built with rlp
  • Commit 324291e fixed RT index optimize with progressive option enabled that merges kill-lists with wrong order
  • Commit ac0efee minor crash on mac
  • lots of minor fixes after thorough static code analysis
  • other minor bugfixes


In this release we've changed internal protocol used by masters and agents to speak with each other. In case you run Manticoresearch in a distributed environment with multiple instances make sure your first upgrade agents, then the masters.

Version 2.5.1, 23 November 2017

Features and improvements

  • JSON queries on HTTP API protocol. Supported search, insert, update, delete, replace operations. Data manipulation commands can be also bulked, also there are some limitations currently as MVA and JSON attributes can't be used for inserts, replaces or updates.
  • RELOAD INDEXES command
  • FLUSH LOGS command
  • SHOW THREADS can show progress of optimize, rotation or flushes.
  • GROUP N BY work correctly with MVA attributes
  • blackhole agents are run on separate thread to not affect master query anymore
  • implemented reference count on indexes, to avoid stalls caused by rotations and high load
  • SHA1 hashing implemented, not exposed yet externally
  • fixes for compiling on FreeBSD, macOS and Alpine


Version 2.4.1 GA, 16 October 2017

Features and improvements

  • OR operator in WHERE clause between attribute filters
  • Maintenance mode ( SET MAINTENANCE=1)
  • CALL KEYWORDS available on distributed indexes
  • Grouping in UTC
  • query_log_mode for custom log files permissions
  • Field weights can be zero or negative
  • max_query_time can now affect full-scans
  • added net_wait_tm, net_throttle_accept and net_throttle_action for network thread fine tuning (in case of workers=thread_pool)
  • COUNT DISTINCT works with facet searches
  • IN can be used with JSON float arrays
  • multi-query optimization is not broken anymore by integer/float expressions
  • SHOW META shows a multiplier row when multi-query optimization is used


Manticore Search is built using cmake and the minimum gcc version required for compiling is 4.7.2.

Folders and service

  • Manticore Search runs under manticore user.
  • Default data folder is now /var/lib/manticore/.
  • Default log folder is now /var/log/manticore/.
  • Default pid folder is now /var/run/manticore/.


  • Commit a58c619 fixed SHOW COLLATION statement that breaks java connector
  • Commit 631cf4e fixed crashes on processing distributed indexes; added locks to distributed index hash; removed move and copy operators from agent
  • Commit 942bec0 fixed crashes on processing distributed indexes due to parallel reconnects
  • Commit e5c1ed2 fixed crash at crash handler on store query to server log
  • Commit 4a4bda5 fixed a crash with pooled attributes in multiqueries
  • Commit 3873bfb fixed reduced core size by prevent index pages got included into core file
  • Commit 11e6254 fixed searchd crashes on startup when invalid agents are specified
  • Commit 4ca6350 fixed indexer reports error in sql_query_killlist query
  • Commit 123a9f0 fixed fold_lemmas=1 vs hit count
  • Commit cb99164 fixed inconsistent behavior of html_strip
  • Commit e406761 fixed optimize rt index loose new settings; fixed optimize with sync option lock leaks;
  • Commit 86aeb82 fixed processing erroneous multiqueries
  • Commit 2645230 fixed result set depends on multi-query order
  • Commit 72395d9 fixed server crash on multi-query with bad query
  • Commit f353326 fixed shared to exclusive lock
  • Commit 3754785 fixed server crash for query without indexes
  • Commit 29f360e fixed dead lock of server

Version 2.3.3, 06 July 2017

  • Manticore branding

Reporting bugs

Unfortunately, Manticore is not yet 100% bug-free (although we are working hard towards that goal). You may occasionally encounter some issues.

It is very important to report as much information as possible about each bug. To fix a bug, we need to either reproduce and fix it or deduce what is causing it based on the information you provide. Therefore, here are some instructions on how to do that.


We track bugs and feature requests on Github. Feel free to create a new ticket and describe your bug in detail so that you and the developers can save time.

Documentation updates

Updates to the documentation (what you are reading now) are also done on Github.


Manticore is written in C++, a low-level programming language that allows for direct communication with the computer for faster performance. The drawback of that is that in rare cases, it may not be possible to elegantly handle a bug by writing an error to a log and skipping the processing of the command that caused the problem. Instead, the program may crash, which means it will stop completely and need to be restarted.

When Manticore Search crashes, you need to let the Manticore team know about it by making a bug report on GitHub, or if you use Manticore's professional services in your private helpdesk. The Manticore team needs the following information:

  1. Searchd log
  2. Coredump
  3. Query log

It will be great if you additionally do the following:

  1. Run gdb to inspect the coredump:
    gdb /usr/bin/searchd </path/to/coredump>
  2. Find crashed thread id in the coredump file name (make sure you have %p in /proc/sys/kernel/core_pattern), e.g. core.work_6.29050.server_name.1637586599 means thread_id=29050
  3. In gdb run:
    set pagination off
    info threads
    # find thread number by it's id (e.g. for `LWP 29050` it will be thread number 8
    thread apply all bt
    thread <thread number>
    bt full
    info locals
  4. Provide the outputs

What do I do when Manticore Search hangs?

You need to run gdb manually and collect some info that may be useful to understand why it's hanging.

  1. show threads option format=all run trough a VIP port

  2. collect lsof output since hanging can be caused by too many connections or open file descriptors

    lsof -p `cat /var/run/manticore/`
  3. dump core

    gcore `cat /var/run/manticore/`

    (it will save the dump to the current dir)

  4. Install and run gdb:

    gdb /usr/bin/searchd `cat /var/run/manticore/`

    Note it will halt your running searchd, but if it's alredy hanging it shouldn't be a problem.

  5. In gdb run:

    set pagination off
    info threads
    thread apply all bt
  6. Collect all the outputs and files and provide them in a bug report.

For experts: the macros added in this commit can be helpful to debug.

How to enable saving coredumps on crash?

[root@srv lib]# systemctl set-environment _ADDITIONAL_SEARCHD_PARAMS='--coredump'
[root@srv lib]# systemctl restart manticore
[root@srv lib]# ps aux|grep searchd
mantico+  1955  0.0  0.0  61964  1580 ?        S    11:02   0:00 /usr/bin/searchd --config /etc/manticoresearch/manticore.conf --coredump
mantico+  1956  0.6  0.0 392744  2664 ?        Sl   11:02   0:00 /usr/bin/searchd --config /etc/manticoresearch/manticore.conf --coredump
  • make sure that your OS allows you to save coredumps: /proc/sys/kernel/core_pattern should be non-empty - this is where it will save them. If you do:
    echo "/cores/core.%e.%p.%h.%t" > /proc/sys/kernel/core_pattern

    it will instruct your kernel to save them to file like core.searchd.1773.centos-4gb-hel1-1.1636454937

  • searchd should be started with ulimit -c unlimited, but if you start Manticore via systemctl it does it for yourself since it does:
    [root@srv lib]# grep CORE /lib/systemd/system/manticore.service

How do I install debug symbols?

Manticore Search and Manticore Columnar Library are written in C++, which means that when you run them, you get a compiled, compact binary file that executes optimally on your operating system. However, when you run a binary, your system does not have full access to the names of variables, functions, methods, and classes that are implemented. All of this information is provided separately in something called "debuginfo" or "symbol packages."

Debug symbols are useful for troubleshooting and other debugging purposes, as they allow you to visualize the state of the system when it crashed, including the names of functions, when you have symbols and your binary crashes. Manticore Search provides a backtrace in the searchd log and also generates a coredump if it was run with the --coredump flag. Without symbols, all you get is internal offsets, which can be difficult or impossible to decode. Therefore, if you need to make a bug report about a crash, the Manticore team will often need debug symbols in order to help you.

To install Manticore Search/Manticore Columnar Library debug symbols, you will need to install the *debuginfo* package for CentOS, the *dbgsym* package for Ubuntu and Debian, or the *dbgsymbols* package for Windows and macOS. These packages should be of the same version as the version of Manticore that you are running. For example, if you've installed Manticore Search in Centos 8 from the package , the corresponding package with symbols would be

Note that both packages have the same commit id af497f245, which corresponds to the commit that this version was built from.

If you have installed Manticore from a Manticore APT/YUM repository, you can use one of the following tools:

  • debuginfo-install in CentOS 7
  • dnf debuginfo-install CentOS 8
  • find-dbgsym-packages in Debian and Ubuntu

to find a debug symbols package for you.

How to check the debug symbols exist?

  1. Find build id in file /usr/bin/searchd output:
[root@srv lib]# file /usr/bin/searchd
/usr/bin/searchd: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=2c582e9f564ea1fbeb0c68406c271ba27034a6d3, stripped

In this case it's 2c582e9f564ea1fbeb0c68406c271ba27034a6d3.

  1. Find symbols in /usr/lib/debug/.build-id like this:
[root@srv ~]# ls -la /usr/lib/debug/.build-id/2c/582e9f564ea1fbeb0c68406c271ba27034a6d3*
lrwxrwxrwx. 1 root root 23 Nov  9 10:42 /usr/lib/debug/.build-id/2c/582e9f564ea1fbeb0c68406c271ba27034a6d3 -> ../../../../bin/searchd
lrwxrwxrwx. 1 root root 27 Nov  9 10:42 /usr/lib/debug/.build-id/2c/582e9f564ea1fbeb0c68406c271ba27034a6d3.debug -> ../../usr/bin/searchd.debug

Uploading your data

To fix your bug, developers often need to reproduce it locally. To do this, they need your configuration file, table files, binlog (if present), and sometimes source data (such as data from external storages or XML/CSV files) and queries.

Attach your data when you create a ticket on Github. If it is too large or the data is sensitive, you can feel free to upload it to our write-only S3 storage s3:// Here's how you can do it using Minio client:

  1. Install the client
  2. Add our s3 host: mc config host add manticore manticore manticore
  3. Copy your files: mc cp -r issue-1234/ manticore/write-only/issue-1234 . Make sure you make the folder name unique, best if it corresponds to the issue on GitHub where you described the bug


DEBUG [ subcommand ]

DEBUG statement is designed to call different internal or vip commands for dev/testing purposes. It is not intended for production automation, since the syntax of subcommand part may be freely changed in any build.

Call DEBUG without params to show a list of useful commands (in general) and subcommands (of DEBUG statement) available at the current context.

mysql> debug;
| command                                                                 | meaning                                                                                |
| flush logs                                                              | emulate USR1 signal                                                                    |
| reload indexes                                                          | emulate HUP signal                                                                     |
| debug token <password>                                                  | calculate token for password                                                           |
| debug malloc_stats                                                      | perform 'malloc_stats', result in searchd.log                                          |
| debug malloc_trim                                                       | pefrorm 'malloc_trim' call                                                             |
| debug sleep <N>                                                         | sleep for <N> seconds                                                                  |
| debug tasks                                                             | display global tasks stat (use select from @@system.tasks instead)                     |
| debug sched                                                             | display task manager schedule (use select from @@system.sched instead)                 |
| debug merge <TBL> [chunk] <X> [into] [chunk] <Y> [option sync=1,byid=0] | For RT table <TBL> merge disk chunk X into disk chunk Y                                |
| debug drop [chunk] <X> [from] <TBL> [option sync=1]                     | For RT table <TBL> drop disk chunk X                                                   |
| debug files <TBL> [option format=all|external]                          | list files belonging to <TBL>. 'all' - including external (wordforms, stopwords, etc.) |
| debug close                                                             | ask server to close connection from it's side                                          |
| debug compress <TBL> [chunk] <X> [option sync=1]                        | Compress disk chunk X of RT table <TBL> (wipe out deleted documents)                   |
| debug split <TBL> [chunk] <X> on @<uservar> [option sync=1]             | Split disk chunk X of RT table <TBL> using set of DocIDs from @uservar                 |
| debug wait <cluster> [like 'xx'] [option timeout=3]                     | wait <cluster> ready, but no more than 3 secs.                                         |
| debug wait <cluster> status <N> [like 'xx'] [option timeout=13]         | wait <cluster> commit achieve <N>, but no more than 13 secs                            |
| debug meta                                                              | Show max_matches/pseudo_shards. Needs set profiling=1                                  |
| debug trace OFF|'path/to/file' [<N>]                                    | trace flow to file until N bytes written, or 'trace OFF'                               |
| debug curl <URL>                                                        | request given url via libcurl                                                          |
19 rows in set (0.00 sec)

Same from VIP connection:

mysql> debug;
| command                                                                 | meaning                                                                                |
| flush logs                                                              | emulate USR1 signal                                                                    |
| reload indexes                                                          | emulate HUP signal                                                                     |
| debug shutdown <password>                                               | emulate TERM signal                                                                    |
| debug crash <password>                                                  | crash daemon (make SIGSEGV action)                                                     |
| debug token <password>                                                  | calculate token for password                                                           |
| debug malloc_stats                                                      | perform 'malloc_stats', result in searchd.log                                          |
| debug malloc_trim                                                       | pefrorm 'malloc_trim' call                                                             |
| debug procdump                                                          | ask watchdog to dump us                                                                |
| debug setgdb on|off                                                     | enable or disable potentially dangerous crash dumping with gdb                         |
| debug setgdb status                                                     | show current mode of gdb dumping                                                       |
| debug sleep <N>                                                         | sleep for <N> seconds                                                                  |
| debug tasks                                                             | display global tasks stat (use select from @@system.tasks instead)                     |
| debug sched                                                             | display task manager schedule (use select from @@system.sched instead)                 |
| debug merge <TBL> [chunk] <X> [into] [chunk] <Y> [option sync=1,byid=0] | For RT table <TBL> merge disk chunk X into disk chunk Y                                |
| debug drop [chunk] <X> [from] <TBL> [option sync=1]                     | For RT table <TBL> drop disk chunk X                                                   |
| debug files <TBL> [option format=all|external]                          | list files belonging to <TBL>. 'all' - including external (wordforms, stopwords, etc.) |
| debug close                                                             | ask server to close connection from it's side                                          |
| debug compress <TBL> [chunk] <X> [option sync=1]                        | Compress disk chunk X of RT table <TBL> (wipe out deleted documents)                   |
| debug split <TBL> [chunk] <X> on @<uservar> [option sync=1]             | Split disk chunk X of RT table <TBL> using set of DocIDs from @uservar                 |
| debug wait <cluster> [like 'xx'] [option timeout=3]                     | wait <cluster> ready, but no more than 3 secs.                                         |
| debug wait <cluster> status <N> [like 'xx'] [option timeout=13]         | wait <cluster> commit achieve <N>, but no more than 13 secs                            |
| debug meta                                                              | Show max_matches/pseudo_shards. Needs set profiling=1                                  |
| debug trace OFF|'path/to/file' [<N>]                                    | trace flow to file until N bytes written, or 'trace OFF'                               |
| debug curl <URL>                                                        | request given url via libcurl                                                          |
24 rows in set (0.00 sec)

All debug XXX commands should be regarded as non-stable and subject to modification at any time, so don't be surprised if they change. This example output may not reflect the actual available commands, so try it on your system to see what is available on your instance. Additionally, there is no detailed documentation provided aside from this short 'meaning' column.

As a quick illustration, two commands available only to VIP clients are described below - shutdown and crash. Both require a token, which can be generated with the debug token subcommand, and added to the shutdown_token param in the searchd section of the config file. If no such section exists, or if the provided password hash does not match the token stored in the config, the subcommands will do nothing.

mysql> debug token hello;
| command     | result                                   |
| debug token | aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d |
1 row in set (0,00 sec)

The subcommand shutdown will send a TERM signal to the server, causing it to shut down. This can be dangerous, as nobody wants to accidentally stop a production service. Therefore, it requires a VIP connection and the password to be used.

The subcommand crash literally causes a crash. It may be used for testing purposes, such as to test how the system manager maintains the service's liveness or to test the feasibility of tracking coredumps.

If some commands are found to be useful in a more general context, they may be moved from the debug subcommands to a more stable and generic location (as exemplified by the debug tasks and debug sched in the table).