J'utilise Lucene en PHP (en utilisant l'implémentation de Zend Framework). J'ai un problème que je ne peux pas rechercher sur un champ qui contient un nombre.Problème avec Lucene: la recherche n'indexe pas les valeurs numériques?
Voici les données de l'indice:
ts | contents --------------+----------------- 1236917100 | dog cat gerbil 1236630752 | cow pig goat 1235680249 | lion tiger bear nonnumeric | bass goby trout
Mon problème: Une requête pour "ts:1236630752
" renvoie pas de résultats. Cependant, une requête pour "ts:nonnumeric
" renvoie un succès.
Je stocke "ts" en tant que champ de mot-clé, qui according to documentation "n'est pas segmenté, mais indexé et stocké, utile pour les champs non textuels, par exemple la date ou l'URL." J'ai essayé de le traiter comme un champ "texte", mais le comportement est le même sauf qu'une requête pour "ts:*
" ne renvoie rien quand ts est du texte. J'utilise Zend Framework 1.7 (il y a juste 3 jours) et PHP 5.2.9. Voici mon code:
<?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
Sortie
Running query: pig Got 1 hits. ts='1236630752', contents='cow pig goat' Running query: ts:1236630752 Got 0 hits. Running query: 1236630752 Got 0 hits. Running query: ts:pig Got 0 hits. Running query: contents:pig Got 1 hits. ts='1236630752', contents='cow pig goat' Running query: ts:[1236630700 TO 1236630800] Got 0 hits. Running query: ts:* Got 4 hits. ts='1236917100', contents='dog cat gerbil' ts='1236630752', contents='cow pig goat' ts='1235680249', contents='lion tiger bear' ts='nonnumeric', contents='bass goby trout' Running query: nonnumeric Got 1 hits. ts='nonnumeric', contents='bass goby trout' Running query: ts:nonnumeric Got 1 hits. ts='nonnumeric', contents='bass goby trout' Running query: trout Got 1 hits. ts='nonnumeric', contents='bass goby trout'
Notez que les nouvelles versions de Zend Search Lucene incluent un analyseur alphanumérique; il vous suffit de le définir par défaut. Assurez-vous d'inclure ce près du début de votre script d'indexation ainsi que avant d'exécuter $ index-> find(): Zend_Search_Lucene_Analysis_Analyzer :: setDefault (nouveau Zend_Search_Lucene_Analysis_Analyzer_Common_TextNum_CaseInsensitive()); –