Manticore 支持多种操作系统,包括 Linux、FreeBSD、MacOS、Windows 等。
考虑到系统的实际运行环境,下面以 Ubuntu 20.04LTS 为例,介绍如何从源码构建系统。
下面假设工作的目录为 $(WSPACE)
-
git clone 或解压源码包到
$(WSPACE)/manticoresearch
-
将依赖的第三方源码包 复制到
$(WSPACE)/manticore_bundle
, 包括-
galera-cmake-3.x-5.7.zip
-
googletestmaster.zip
-
icu4c-65_1-src.tgz
-
libstemmer_c.tgz
-
master.zip
-
re2_master.zip
-
Tip
|
其中 master.zip 与 re2_master.zip 是一个文件 |
-
创建 编译使用的目录
mkdir -p $(WSPACE)/build && cd $(WSPACE)/build
-
确保编译所需的系统库存在
sudo apt install build-essential libssl-dev \
libmysqlclient-dev flex bison libpcre3-dev \
libzstd-dev
-
构建
cmake ../manticoresearch -DLIBS_BUNDLE=../manticore_bundle \
-DWITH_ICONV=OFF -DWITH_RE2=1 -DWITH_MYSQL=1 \
-DCMAKE_BUILD_TYPE=DEBUG -DBoost_NO_SYSTEM_PATHS=TRUE -DBoost_NO_BOOST_CMAKE=TRUE \
-DCMAKE_CXX_FLAGS="-Wno-error=stringop-truncation -Wno-error=deprecated-copy"
Tip
|
以上命令编译出来是调试版本的,如果是发行版本,应该用 -DCMAKE_BUILD_TYPE=Release 或 -DCMAKE_BUILD_TYPE=RelWithDebInfo
|
TIPS: 这个配置中,关闭了 ICONV,启用了 RE2,启用了 MySQL DataSource
-
Windows 上需要手动安装 Python3 和 Git
-
需要 bison 和 flex,目前无法在 Windows 上生成正确的 c 文件,需要在 Linux 上生成完毕后再到 Windows 上构造;另外一个可选方式是通过 https://github.com/lexxmark/winflexbison 未测试。
-
需要 VC BuildTools, 2019 版本已经自带 Cmake
-
执行构建指令
cmake ../manticoresearch -DLIBS_BUNDLE=../manticore_bundle \
-DWITH_ICONV=OFF -DWITH_RE2=1 -DWITH_MYSQL=0 \
-DCMAKE_BUILD_TYPE=DEBUG
假设 Windows 版本放弃 MySQL 支持,如果启用需要额外配置 MySQL Client 的库。
为了调试 Sphinx, 应使用 Debug 或 RelWithDebInfo 进行构建。
Sphinx 采用了多线架构(历史上是多进程,但是目前版本已经默认是多现成),而且其使用由 master 进程的 Fork 的 worker进程来对外提供服务,默认情况下,直接使用 gdb 将挂在到 worker 进程导致端点失效。
对于大部分场景不需要调试 Sphinx 有关并发的逻辑,此时需要在启动 searchd
时额外提供 --console
参数,在此模式下, master 进程将不会 fork worker 进程,转而自行对外提供服务。
推荐使用 SourceTrail 阅读代码 ,需要增加 cmake 参数
-DCMAKE_EXPORT_COMPILE_COMMANDS=1 -G Ninja
├── README.md
├── TESTING.md
├── api
│ ├── java
│ ├── libsphinxclient
│ ├── ruby
│ ├── sphinxapi.py
│ ├── test.php
│ ├── test.py
│ ├── test2.php
│ └── test2.py
├── cmake
├── debian
├── dist
├── doc
├── docker-compose-test.yml
├── docs
├── libicu
│ └── CMakeLists.txt
├── libre2
│ ├── CMakeLists.txt
│ └── libre2.patch
├── libstemmer_c
│ ├── CMakeLists.txt
│ └── README
├── manticore.conf.in
├── misc
│ ├── ctest
│ ├── dockerfiles
│ ├── junit
│ ├── manticore.natvis
│ ├── manticore_lldb.py
│ ├── raminfo.py
│ ├── resolve.py
│ ├── search_json_pretty.php
│ ├── stopwords
│ ├── suggest
│ │ ├── README
│ │ ├── suggest.conf
│ │ └── suggest.php
│ └── wordbreak.pl
├── mysqlse
│ ├── CMakeLists.txt
│ ├── INSTALL
│ ├── Makefile.am
│ ├── gen_data.php
│ ├── ha_sphinx.cc
│ ├── ha_sphinx.h
│ ├── make-patch.sh
│ ├── plug.in
│ ├── snippets_udf.cc
│ ├── sphinx.5.0.22.diff
│ ├── sphinx.5.0.27.diff
│ ├── sphinx.5.0.37.diff
│ └── sphinx.5.0.91.diff
├── smoke.sh
├── sphinxrev.cmake
├── src
│ ├── CMakeLists.txt
│ ├── accumulator.h
│ ├── attribute.cpp
│ ├── attribute.h
│ ├── charsets
│ │ ├── cjk.txt
│ │ ├── english.txt
│ │ ├── globalaliases.h.in
│ │ ├── non_cjk.txt
│ │ └── russian.txt
│ ├── coreseek
│ │ ├── zmemorypool.cpp
│ │ └── zmemorypool.h
│ ├── datareader.cpp
│ ├── datareader.h
│ ├── ddl.l
│ ├── ddl.y
│ ├── docstore.cpp
│ ├── docstore.h
│ ├── event.h
│ ├── fileutils.cpp
│ ├── fileutils.h
│ ├── global_idf.cpp
│ ├── global_idf.h
│ ├── gtests
│ ├── http
│ │ ├── http_parser.c
│ │ └── http_parser.h
│ ├── icu.cpp
│ ├── icu.h
│ ├── index_converter.cpp
│ ├── indexcheck.cpp
│ ├── indexcheck.h
│ ├── indexer.cpp
│ ├── indexformat.cpp
│ ├── indexformat.h
│ ├── indexsettings.cpp
│ ├── indexsettings.h
│ ├── indextool.cpp
│ ├── json
│ │ ├── cJSON.c
│ │ └── cJSON.h
│ ├── killlist.cpp
│ ├── killlist.h
│ ├── literal.h.in
│ ├── loop_profiler.h
│ ├── lz4
│ │ ├── lz4.c
│ │ ├── lz4.h
│ │ ├── lz4hc.c
│ │ └── lz4hc.h
│ ├── net_action_accept.cpp
│ ├── net_action_accept.h
│ ├── netreceive_api.cpp
│ ├── netreceive_api.h
│ ├── netreceive_http.cpp
│ ├── netreceive_http.h
│ ├── netreceive_httpcommon.h
│ ├── netreceive_https.cpp
│ ├── netreceive_https.h
│ ├── netreceive_ql.cpp
│ ├── netreceive_ql.h
│ ├── netstate_api.cpp
│ ├── netstate_api.h
│ ├── networking_daemon.cpp
│ ├── networking_daemon.h
│ ├── optional.h
│ ├── replication
│ │ ├── CMakeLists.txt
│ │ ├── COPYING
│ │ ├── README.md
│ │ ├── wsrep.xcf
│ │ ├── wsrep_api.h
│ │ ├── wsrep_api_stub.h
│ │ ├── wsrep_dummy.c
│ │ ├── wsrep_gtid.c
│ │ ├── wsrep_listener.c
│ │ ├── wsrep_loader.c
│ │ └── wsrep_uuid.c
│ ├── reserved.py
│ ├── searchd.cpp
│ ├── searchdaemon.cpp
│ ├── searchdaemon.h
│ ├── searchdconfig.cpp
│ ├── searchdconfig.h
│ ├── searchdddl.cpp
│ ├── searchdddl.h
│ ├── searchdexpr.cpp
│ ├── searchdexpr.h
│ ├── searchdfields.cpp
│ ├── searchdha.cpp
│ ├── searchdha.h
│ ├── searchdhttp.cpp
│ ├── searchdreplication.cpp
│ ├── searchdreplication.h
│ ├── searchdsql.cpp
│ ├── searchdsql.h
│ ├── searchdssl.cpp
│ ├── searchdssl.h
│ ├── searchdtask.cpp
│ ├── searchdtask.h
│ ├── searchnode.cpp
│ ├── searchnode.h
│ ├── secondaryindex.cpp
│ ├── secondaryindex.h
│ ├── snippetfunctor.cpp
│ ├── snippetfunctor.h
│ ├── snippetindex.cpp
│ ├── snippetindex.h
│ ├── snippetstream.cpp
│ ├── snippetstream.h
│ ├── spelldump.cpp
│ ├── sphinx.cpp
│ ├── sphinx.h
│ ├── sphinxaot.cpp
│ ├── sphinxexcerpt.cpp
│ ├── sphinxexcerpt.h
│ ├── sphinxexpr.cpp
│ ├── sphinxexpr.h
│ ├── sphinxexpr.y
│ ├── sphinxfilter.cpp
│ ├── sphinxfilter.h
│ ├── sphinxint.h
│ ├── sphinxjson.cpp
│ ├── sphinxjson.h
│ ├── sphinxjson.l
│ ├── sphinxjson.y
│ ├── sphinxjsonquery.cpp
│ ├── sphinxjsonquery.h
│ ├── sphinxmetaphone.cpp
│ ├── sphinxplugin.cpp
│ ├── sphinxplugin.h
│ ├── sphinxpq.cpp
│ ├── sphinxpq.h
│ ├── sphinxqcache.cpp
│ ├── sphinxqcache.h
│ ├── sphinxql.l
│ ├── sphinxql.y
│ ├── sphinxquery.cpp
│ ├── sphinxquery.h
│ ├── sphinxquery.y
│ ├── sphinxrt.cpp
│ ├── sphinxrt.h
│ ├── sphinxsearch.cpp
│ ├── sphinxsearch.h
│ ├── sphinxselect.y
│ ├── sphinxsort.cpp
│ ├── sphinxsoundex.cpp
│ ├── sphinxstd.cpp
│ ├── sphinxstd.h
│ ├── sphinxstem.h
│ ├── sphinxstemar.cpp
│ ├── sphinxstemcz.cpp
│ ├── sphinxstemen.cpp
│ ├── sphinxstemru.cpp
│ ├── sphinxstemru.inl
│ ├── sphinxudf.c
│ ├── sphinxudf.h
│ ├── sphinxutils.cpp
│ ├── sphinxutils.h
│ ├── sphinxversion.cpp
│ ├── sphinxversion.h.in
│ ├── taskflushattrs.cpp
│ ├── taskflushattrs.h
│ ├── taskflushbinlog.cpp
│ ├── taskflushbinlog.h
│ ├── taskflushmutable.cpp
│ ├── taskflushmutable.h
│ ├── taskglobalidf.cpp
│ ├── taskglobalidf.h
│ ├── taskmalloctrim.cpp
│ ├── taskmalloctrim.h
│ ├── taskoptimize.cpp
│ ├── taskoptimize.h
│ ├── taskping.cpp
│ ├── taskping.h
│ ├── taskpreread.cpp
│ ├── taskpreread.h
│ ├── tasksavestate.cpp
│ ├── tasksavestate.h
│ ├── testrt.conf.in
│ ├── testrt.cpp
│ ├── tests.cpp
│ ├── threadutils.cpp
│ ├── threadutils.h
│ ├── udfexample.c
│ └── wordbreaker.cpp
└── test
├ ...
├── test_icu.conf
├── test_odbc.conf
├── test_re.conf
├── ubertest.php
├── ubertest.php.in
├── valgrind.supp
└── wordforms.txt
413 directories, 1545 files
Coreseek / Manticore 中提供了如下的源码文件/目录,具体用途如下(一些约定俗成,通过名字可知的文件略过):
目录 | 用途 |
---|---|
api |
API 模式访问 Sphinx 客户端库 |
cmake |
cmake 构建用到的文件 |
debian |
作为 deb 包 要求存在的文件 |
dist |
构造 deb 和 rpm 包依赖的其他文件 |
doc |
构建文档所需要的工具 |
docs |
实际文档的原始文件 |
libicu |
libicu 的 cmake 构建文件 |
libre2 |
libre2 的 cmake 构建文件 |
libstremmer_c |
libstremmer_c 的 cmake 构建文件 |
misc |
其他杂项文件,包括 停止词、lldb 的适配、docker、natvis 的配置、stopword,搜索建议功能的演示配置等 |
mysqlse |
MySql SE 的接口文件,用于作为存储引擎与 MySQL集成 |
src |
主体源代码 |
src/charsets |
预制的字符集, cjk,英文, 俄文 |
src/coreseek |
支持 spdz 所需要的文件,基于 zstd 的内存池访问机制 |
src/http |
http api 依赖的文件 |
src/json |
处理 json 解析 |
src/lz4 |
lz4 算法,用于 docstore 压缩 |
src/replication |
多主的复制机制,基于 galera |
test |
单元测试 |
在源代码目录中,与 Schema On Read 和 索引压缩相关的文件用途说明如下。
文件 | 用途 |
---|---|
sphinxint.h |
Cell in column 2, row 1 |
sphinx.h |
Cell in column 2, row 1 |
sphinx.cpp |
Cell in column 2, row 1 |
sphinxutils.* |
Cell in column 2, row 1 |
sphinxexpr.* |
Cell in column 2, row 1 |
searchdexpr.* |
Cell in column 2, row 1 |