清单 9. Body Parts 的示例 sphinx.conf
source catalog { type = mysql
sql_host = localhost sql_user = reaper sql_pass = s3cr3t sql_db = body_parts sql_sock = /var/run/mysqld/mysqld.sock sql_port = 3306
PHP程序员站--PHP程序员之家
# indexer query # document_id MUST be the very first field # document_id MUST be positive (non-zero, non-negative) # document_id MUST fit into 32 bits # document_id MUST be unique phperz.com
sql_query = \ SELECT \ id, partno, description, \ assembly, model \ FROM \ Catalog; www~phperz~.com
sql_group_column = assembly sql_group_column = model www~phperz~.com
# document info query # ONLY used by search utility to display document information # MUST be able to fetch document info by its id, therefore # MUST contain '$id' macro # PHP程序员站
sql_query_info = SELECT * FROM Inventory WHERE id=$id } www phperz com
index catalog { source = catalog path = /var/data/sphinx/catalog morphology = stem_en www phperz com
min_word_len = 3 min_prefix_len = 0 min_infix_len = 3 } PHP程序员站
searchd { port = 3312 log = /var/log/searchd/searchd.log query_log = /var/log/searchd/query.log pid_file = /var/log/searchd/searchd.pid } PHP程序员站
底部的 searchd 部分将配置 searchd 守护程序本身。该部分中的条目不言自明。query.log 尤为有用:它将在运行时显示每次搜索并显示结果,例如搜索的文档数和匹配总数。
PHP程序员站--PHP程序员之家
www phperz com
PHP程序员站
构建和测试索引 PHP程序员站
您现在已经准备好为 Body Parts 应用程序构建索引。为此,需要执行以下步骤: PHP程序员站--PHP程序员之家
键入 $ sudo mkdir -p /var/data/sphinx 创建目录结构 /var/data/sphinx 假定 MySQL 正在运行,使用如下所示的代码运行索引器来创建索引。 PHP程序员站
清单 10. 创建索引
$ sudo /usr/local/bin/indexer --config /usr/local/etc/sphinx.conf --all Sphinx 0.9.7 Copyright (c) 2001-2007, Andrew Aksyonoff PHP程序员站--PHP程序员之家
using config file '/usr/local/etc/sphinx.conf'... indexing index 'catalog'... collected 8 docs, 0.0 MB sorted 0.0 Mhits, 82.8% done total 8 docs, 149 bytes total 0.010 sec, 14900.00 bytes/sec, 800.00 docs/sec PHP程序员站--PHP程序员之家
注: -all 参数将重构 sphinx.conf 中列出的所有索引。如果不需要重构所有索引,您可以使用其他参数只对部分索引进行重构。 您现在可以使用如下所示的代码用 search 实用程序测试索引(不必运行 searchd 即可使用 search)。 PHP程序员站
清单 11. 用 search 测试索引
$ /usr/local/bin/search --config /usr/local/etc/sphinx.conf ENG Sphinx 0.9.7 Copyright (c) 2001-2007, Andrew Aksyonoff PHP程序员站
index 'catalog': query 'ENG ': returned 2 matches of 2 total in 0.000 sec PHP程序员站
displaying matches: 1. document=8, weight=1, assembly=5, model=7 id=8 partno=ENG088 description=Cylinder head price=55 2. document=9, weight=1, assembly=5, model=3 id=9 partno=ENG976 description=Large cylinder head price=65 PHP程序员站
words: 1. 'eng': 2 documents, 2 hits PHP程序员站
$ /usr/local/bin/search --config /usr/local/etc/sphinx.conf wind Sphinx 0.9.7 Copyright (c) 2001-2007, Andrew Aksyonoff www phperz com
index 'catalog': query 'wind ': returned 2 matches of 2 total in 0.000 sec phperz.com
displaying matches: 1. document=1, weight=1, assembly=3, model=1 id=1 partno=WIN408 description=Portal window price=423 2. document=5, weight=1, assembly=3, model=1 id=5 partno=WIN958 description=Windshield, front price=500 www.phperz.com
words: 1. 'wind': 2 documents, 2 hits www phperz com
$ /usr/local/bin/search \ --config /usr/local/etc/sphinx.conf --filter model 3 ENG Sphinx 0.9.7 Copyright (c) 2001-2007, Andrew Aksyonoff PHP程序员站
index 'catalog': query 'ENG ': returned 1 matches of 1 total in 0.000 sec PHP程序员站
displaying matches: 1. document=9, weight=1, assembly=5, model=3 id=9 partno=ENG976 description=Large cylinder head price=65 www phperz com
words: 1. 'eng': 2 documents, 2 hits PHP程序员站
第一条命令 /usr/local/bin/search --config /usr/local/etc/sphinx.conf ENG 在零件号中找到了两个含有 ENG 的结果。第二条命令 /usr/local/bin/search --config /usr/local/etc/sphinx.conf wind 在两个零件描述中找到了子字符串 wind。而第三条命令把结果限定为 model 为 3 的条目。
www phperz com
www phperz com
编写代码 www phperz com
最后,您可以编写 PHP 代码来调用 Sphinx 搜索引擎。Sphinx PHP API 非常小并且易于掌握。清单 12 是一个小型 PHP 应用程序,用于调用 searchd 以得到使用上面所示的最后一条命令得到的相同结果("在属于型号 3 的名称中找到含有 ‘cylinder' 的所有零件")。 PHP程序员站
清单 12. 从 PHP 调用 Sphinx 搜索引擎
>?php include('sphinx-0.9.7/api/sphinxapi.php'); www~phperz~.com
$cl = new SphinxClient(); $cl- $cl- $cl- phperz.com
$result = $cl- PHP程序员站--PHP程序员之家
if ( $result === false ) { echo "Query failed: " . $cl- } else { if ( $cl- echo "WARNING: " . $cl- } www~phperz~.com
if ( ! empty($result["matches"]) ) { foreach ( $result["matches"] as $doc =< $docinfo ) { echo "$doc\n"; }
print_r( $result );
|