2009-02-13 11 views
5

Warum gibt das erste Suchbeispiel unten keine Ergebnisse zurück? Und jede Idee, wie der unten stehende Code geändert werden kann, um die Suche nach Zahlen zu ermöglichen, wäre sehr zu begrüßen.Suche nach Zahlen mit Zend_Search_Lucene

den Index

$index = new Zend_Search_Lucene('/myindex', true); 
$doc->addField(Zend_Search_Lucene_Field::Text('ssn', '123-12-1234')); 
$doc->addField(Zend_Search_Lucene_Field::Text('cats', 'Fluffy')); 
$index->addDocument($doc); 
$index->commit(); 

Suche Neues - ERGEBNISSE NO

$index = new Zend_Search_Lucene('/myindex', true); 
$results = $index->find('123-12-1234'); 

Suche - mit Ergebnissen

$index = new Zend_Search_Lucene('/myindex', true); 
$results = $index->find('Fluffy'); 

Antwort

2

Dies ist ein Effekt, von denen Analyzer Sie gewählt haben.

Ich glaube, die default Analyzer wird nur Begriffe indexieren, die/[a-zA-Z] +/übereinstimmen. Dies bedeutet, dass Ihr SSN nicht als Begriff in den Index aufgenommen wird.

Auch wenn Sie zu dem Text + numerischen Groß-/Kleinschreibung-unabhängigen Analyzer gewechselt haben, was Sie wollen, wird immer noch nicht funktionieren. Der Ausdruck für einen Term lautet/[a-zA-Z0-9] +/dies würde bedeuten, dass Ihre dem Index hinzugefügten Terme 12.123.1.234 wären.

Wenn Sie 123-12-1234 benötigen, um als gültiger Begriff angesehen zu werden, müssen Sie wahrscheinlich Zend_Search_Lucene_Analysis_Analyzer_Common erweitern und es so einrichten, dass 123-12-1234 ein Begriff ist.

Siehe http://framework.zend.com/manual/en/zend.search.lucene.extending.html#zend.search.lucene.extending.analysis

Ihre andere Wahl, um die SSN als Zend_Search_Lucene_Field :: Keyword zu speichern ist. Da ein Keyword nicht in Begriffe aufgeteilt ist.

http://framework.zend.com/manual/en/zend.search.lucene.html#zend.search.lucene.index-creation.understanding-field-types

3

Zuerst müssen Sie Ihren Text analizer ändern Zahlen enthalten

Zend_Search_Lucene_Analysis_Analyzer :: setDefault (neu Zend_Search_Lucene_Analysis_Analyzer_Common_TextNum());

Dann gilt für Felder mit Zahlen Sie Zend_Search_Lucene_Field :: Keyword statt Zend_Search_Lucene_Field :: Text dies überspringen die die Schaffung von Token verwenden und speichert den Wert in dem Index ‚wie besehen‘. Dann können Sie danach suchen. Ich weiß nicht, wie es sich mit Floats verhält (wird wahrscheinlich nicht für Floats funktionieren 3.0 wird nicht mit 3 übereinstimmen), aber für natürliche Zahlen (wie IDs) funktioniert wie ein Zauber.