3.12. 查询服务器¶
3.12.1. 查询服务器定义¶
在 2.3 版更改: 已更改查询服务器和本机查询服务器的配置方法。
CouchDB委托计算 design documents 函数到外部查询服务器。外部查询服务器是一个特殊的操作系统进程,它通过标准输入/输出与CouchDB进行通信,使用一个非常简单的基于行的协议和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
.
参见
这个 Mango Query Server 是一种需要 无编程 ,可以更轻松地索引和查找文档中的数据。
这个 Native Erlang Query Server 允许运行 ddocs 本机用Erlang编写,绕过stdio通信和JSON序列化/反序列化往返开销。
3.12.2. 查询服务器配置¶
-
[query_server_config]
¶ -
commit_freq
¶ 指定将视图索引更改提交到磁盘之前的延迟(秒)。默认值为
5
::[query_server_config] commit_freq = 5
-
os_process_limit
¶ -
limit
¶ 对查询服务器可用的操作系统进程数的硬限制。默认值为
100
::[query_server_config] os_process_limit = 100
设置
os_process_limit
太低可能会导致查询服务器耗尽,并在os_process_timeout
错误,但将其设置得过高可能会占用过多的系统资源。生产设置通常是默认值的10-20倍。
-
os_process_soft_limit
¶ -
soft limit
¶ 对查询服务器可用的操作系统进程数的软限制。默认值为
100
::[query_server_config] os_process_soft_limit = 100
空闲操作系统进程将关闭,直到总数达到软限制。
例如,如果硬限制为200,软限制为100,则操作系统进程的总数永远不会超过200,CouchDB将关闭所有空闲的操作系统进程,直到达到100,此时它将保持其余进程不变,即使有些进程处于空闲状态。
-
reduce_limit
¶ 控制 Reduce overflow 当该输出引发错误时 reduce functions 太大了:
[query_server_config] reduce_limit = true
通常,您不必禁用(通过设置
false
值)此选项自主提议 reduce 功能是 减少 输入。
-
3.12.3. 本地Erlang查询服务器¶
-
[native_query_servers]
¶ 警告
由于安全限制,默认情况下禁用Erlang查询服务器。
与沙盒模式不同,JavaScript在沙盒模式下不运行。这意味着Erlang代码可以完全访问您的操作系统、文件系统和网络,这可能会导致安全问题。虽然Erlang函数比JavaScript函数快,但是在运行它们时需要小心,尤其是当它们是由其他人编写的时候。
CouchDB有一个本地Erlang查询服务器,允许您在Erlang中编写map/reduce函数。
首先,您需要编辑 local.ini 包括
[native_query_servers]
章节:[native_query_servers] enable_erlang_query_server = true
要查看这些更改,还需要重新启动服务器。
让我们尝试一个map/reduce函数的例子,它统计每个修订的文档总数(版本“1”有x多个文档,“2”有y个文档。。。等等)。向数据库中添加一些文档,然后输入以下函数作为视图:
%% 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.
如果一切顺利,在运行视图之后,您应该会看到每个修订号的文档总数的列表。
3.12.4. 搜索¶
CouchDB的搜索子系统可以通过 dreyfus
配置部分。
-
[dreyfus]
¶ -
name
¶ 启用搜索功能所需的Clouseau Java服务的名称和位置。默认为
clouseau@127.0.0.1
.
-
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
.
-