【发布时间】:2009-03-17 16:04:23
【问题描述】:
我在 PHP 中使用 Lucene(使用 Zend Framework 实现)。我遇到了一个问题,我无法搜索包含数字的字段。
这是索引中的数据:
ts |内容 --------------+----------------- 1236917100 |狗 猫 沙鼠 1236630752 |牛猪山羊 1235680249 |狮子虎熊 非数字 |鲈鱼虾虎鱼我的问题:对“ts:1236630752”的查询没有返回任何命中。但是,对“ts:nonnumeric”的查询会返回命中。
我将“ts”存储为关键字字段,according to documentation“未标记化,但已编入索引和存储。对非文本字段有用,例如日期或 url。”我尝试将其视为“文本”字段,但行为是相同的,只是当 ts 为文本时,对“ts:*”的查询不返回任何内容。
我正在使用 Zend Framework 1.7(3 天前刚刚下载最新的)和 PHP 5.2.9。这是我的代码:
<?php
//=========================================================
// Initializes Zend Framework (Zend_Loader).
//=========================================================
set_include_path(realpath('../library') . PATH_SEPARATOR . get_include_path());
require_once('Zend/Loader.php');
Zend_Loader::registerAutoload();
//=========================================================
// Delete existing index and create a new one
//=========================================================
define('SEARCH_INDEX', 'test_search_index');
if(file_exists(SEARCH_INDEX))
foreach(scandir(SEARCH_INDEX) as $file)
if(!is_dir($file))
unlink(SEARCH_INDEX . "/$file");
$index = Zend_Search_Lucene::create(SEARCH_INDEX);
//=========================================================
// Create this data in index:
// ts | contents
// --------------+-----------------
// 1236917100 | dog cat gerbil
// 1236630752 | cow pig goat
// 1235680249 | lion tiger bear
// nonnumeric | bass goby trout
//=========================================================
function add_to_index($index, $ts, $contents) {
$doc = new Zend_Search_Lucene_Document();
$doc->addField(Zend_Search_Lucene_Field::Keyword('ts', $ts));
$doc->addField(Zend_Search_Lucene_Field::Text('contents', $contents));
$index->addDocument($doc);
}
add_to_index($index, '1236917100', 'dog cat gerbil');
add_to_index($index, '1236630752', 'cow pig goat');
add_to_index($index, '1235680249', 'lion tiger bear');
add_to_index($index, 'nonnumeric', 'bass goby trout');
//=========================================================
// Run some test queries and output results
//=========================================================
echo '<html><body><pre>';
function run_query($index, $query) {
echo "Running query: $query\n";
$hits = $index->find($query);
echo 'Got ' . count($hits) . " hits.\n";
foreach($hits as $hit)
echo " ts='$hit->ts', contents='$hit->contents'\n";
echo "\n";
}
run_query($index, 'pig'); //1 hit
run_query($index, 'ts:1236630752'); //0 hits
run_query($index, '1236630752'); //0 hits
run_query($index, 'ts:pig'); //0 hits
run_query($index, 'contents:pig'); //1 hits
run_query($index, 'ts:[1236630700 TO 1236630800]'); //0 hits (range query)
run_query($index, 'ts:*'); //4 hits if ts is keyword, 1 hit otherwise
run_query($index, 'nonnumeric'); //1 hits
run_query($index, 'ts:nonnumeric'); //1 hits
run_query($index, 'trout'); //1 hits
输出
运行查询:猪 获得 1 次命中。 ts='1236630752',内容='牛猪山羊' 运行查询:ts:1236630752 获得 0 次点击。 运行查询:1236630752 获得 0 次点击。 运行查询:ts:pig 获得 0 次点击。 运行查询:内容:猪 获得 1 次命中。 ts='1236630752',内容='牛猪山羊' 运行查询:ts:[1236630700 TO 1236630800] 获得 0 次点击。 运行查询:ts:* 打了4次。 ts='1236917100', 内容='狗猫沙鼠' ts='1236630752',内容='牛猪山羊' ts='1235680249', contents='狮虎熊' ts='非数字',内容='鲈鱼虾虎鱼' 运行查询:非数字 获得 1 次命中。 ts='非数字',内容='鲈鱼虾虎鱼' 运行查询:ts:nonnumeric 获得 1 次命中。 ts='非数字',内容='鲈鱼虾虎鱼' 运行查询:鳟鱼 获得 1 次命中。 ts='非数字',内容='鲈鱼虾虎鱼'【问题讨论】:
标签: php zend-framework lucene