3.12. 查询服务器¶
3.12.1. 查询服务器定义¶
在版本 2.3 中更改: 更改了查询服务器和原生查询服务器的配置方法。
CouchDB 将 设计文档 函数的计算委托给外部查询服务器。外部查询服务器是一个特殊的 OS 进程,它通过标准输入/输出使用非常简单的基于行的协议与 JSON 消息进行通信。
可以使用以下模式的環境變數定義外部查詢伺服器
COUCHDB_QUERY_SERVER_LANGUAGE="PATH ARGS"
其中
LANGUAGE
: 是此查询服务器可能执行的代码的编程语言。例如,在野外有 PYTHON、RUBY、CLOJURE 等查询服务器。此值以小写形式也用于ddoc
字段language
来确定哪个查询服务器处理函数。请注意,您可以为同一编程语言设置多个查询服务器,但必须为它们命名不同的名称(例如 PYTHONDEV 等)。
PATH
: 是运行查询服务器的可执行二进制程序的系统路径。ARGS
: 可选地,您可以为可执行文件PATH
指定其他命令行参数。
默认的查询服务器是用 JavaScript 编写的,通过 Mozilla SpiderMonkey 运行。它不需要特殊的环境设置来启用,但等效于以下两个变量
COUCHDB_QUERY_SERVER_JAVASCRIPT="/opt/couchdb/bin/couchjs /opt/couchdb/share/server/main.js"
COUCHDB_QUERY_SERVER_COFFEESCRIPT="/opt/couchdb/bin/couchjs /opt/couchdb/share/server/main-coffee.js"
默认情况下,couchjs
将最大运行时分配限制为 64MiB。如果您在 ddoc 函数中遇到内存不足问题,您可以调整内存限制(此处,增加到 512 MiB)
COUCHDB_QUERY_SERVER_JAVASCRIPT="/usr/bin/couchjs -S 536870912 /usr/share/server/main.js"
有关可用选项的更多信息,请参阅 couchjs -h
。
注意
CouchDB 版本 3.0.0 到 3.2.2 包含针对自定义 reduce 函数的性能回归。CouchDB 3.3.0 及更高版本附带了一个实验性修复,该修复包含在单独的 .js
文件中。
要启用此修复,您需要定义一个自定义的 COUCHDB_QUERY_SERVER_JAVASCRIPT
环境变量,如上所述。couchjs
的路径需要保持与您在 couchdb
文件中找到的路径相同,并且 main.js
的路径需要设置为 /path/to/couchdb/share/server/main-ast-bypass.js
。
在 Linux 系统上的默认安装中,这将是 COUCHDB_QUERY_SERVER_JAVASCRIPT="/opt/couchdb/bin/couchjs /opt/couchdb/share/server/main-ast-bypass.js"
另请参阅
Mango 查询服务器 是一种声明式语言,不需要编程,允许更轻松地索引和查找文档中的数据。
原生 Erlang 查询服务器 允许以原生方式运行用 Erlang 编写的 ddocs,绕过 stdio 通信和 JSON 序列化/反序列化往返开销。
3.12.2. 查询服务器配置¶
- [query_server_config]¶
- commit_freq¶
指定将视图索引更改提交到磁盘之前的延迟时间(以秒为单位)。默认值为
5
[query_server_config] commit_freq = 5
- os_process_limit¶
查询服务器可用的 OS 进程数量的硬限制。默认值为
100
[query_server_config] os_process_limit = 100
将
os_process_limit
设置得太低会导致查询服务器饥饿,并表现为os_process_timeout
错误,而将其设置得太高可能会使用过多的系统资源。生产环境设置通常是默认值的 10-20 倍。
- os_process_soft_limit¶
查询服务器可用的 OS 进程数量的软限制。默认值为
100
[query_server_config] os_process_soft_limit = 100
空闲的 OS 进程将被关闭,直到总数达到软限制。
例如,如果硬限制为 200,软限制为 100,则 OS 进程的总数永远不会超过 200,CouchDB 将关闭所有空闲的 OS 进程,直到它达到 100,此时它将保留其余进程,即使其中一些是空闲的。
3.12.3. 原生 Erlang 查询服务器¶
- [native_query_servers]¶
警告
由于安全限制,Erlang 查询服务器默认情况下处于禁用状态。
与 JavaScript 查询服务器不同,Erlang 查询服务器不会在沙箱模式下运行。这意味着 Erlang 代码可以完全访问您的 OS、文件系统和网络,这可能会导致安全问题。虽然 Erlang 函数比 JavaScript 函数更快,但您需要谨慎运行它们,尤其是那些由其他人编写的函数。
CouchDB 具有一个原生 Erlang 查询服务器,允许您用 Erlang 编写 map/reduce 函数。
首先,您需要编辑您的 local.ini 以包含一个
[native_query_servers]
部分[native_query_servers] enable_erlang_query_server = true
要查看这些更改,您还需要重新启动服务器。
让我们尝试一个 map/reduce 函数的示例,该函数计算每个修订版本数量的总文档数(有 x 个文档在版本“1”处,有 y 个文档在“2”处……等等)。向数据库添加一些文档,然后将以下函数作为视图输入
%% Map Function fun({Doc}) -> <<K,_/binary>> = proplists:get_value(<<"_rev">>, Doc, null), V = proplists:get_value(<<"_id">>, Doc, null), Emit(<<K>>, V) end. %% Reduce Function fun(Keys, Values, ReReduce) -> length(Values) end.
如果一切顺利,在运行视图后,您应该会看到每个修订版本数量的总文档数列表。
其他示例可在 [email protected] 邮件列表 上找到。
3.12.4. 搜索¶
CouchDB 的搜索子系统可以通过 dreyfus
配置部分进行配置。
- [dreyfus]¶
- name¶
启用搜索功能所需的 Clouseau Java 服务的名称和位置。默认为
[email protected]
。
- retry_limit¶
CouchDB 将尝试使用有界指数退避重新连接到 Clouseau,迭代次数如下。默认为
5
。
- limit¶
如果未指定限制,则全局搜索查询返回的结果数量。默认值为
25
。
- limit_partitions¶
如果未指定限制,则在数据库分区上搜索返回的结果数量。默认值为
2000
。
- max_limit¶
全局搜索查询(或任何对没有用户定义分区的数据库的搜索查询)可以返回的最大结果数。尝试设置
?limit=N higher
超过此值将被拒绝。默认值为200
。
- max_limit_partitions¶
在搜索数据库分区时可以返回的最大结果数。尝试设置
?limit=N
超过此值将被拒绝。如果未定义此配置设置,CouchDB 将使用max_limit
的值。如果两者都没有定义,则默认值为2000
。
3.12.5. Mango¶
Mango 是为 _find 端点提供服务的查询引擎。
- [mango]¶
- index_all_disabled¶
设置为
true
以禁用“索引所有字段”文本索引。当存在具有嵌套数组字段的文档时,这会导致内存不足问题。默认值为false
。[mango] index_all_disabled = false
- default_limit¶
设置将在 _find 响应中返回的默认结果数。单个请求可以通过在查询参数中直接设置
limit
来覆盖此设置。默认值为25
。[mango] default_limit = 25
- index_scan_warning_threshold¶
这将设置扫描的文档与匹配的结果之间的比率,该比率将在 _find 响应中生成警告。例如,如果查询需要读取 100 个文档才能返回 10 行,则如果此值为
10
,则会生成警告。默认值为
10
。将值设置为0
将禁用警告。[mango] index_scan_warning_threshold = 10