2014-04-20 6 views
1

Objectif: exécuter la recherche floue, puis recherche générique avec ces termes similairesZend Lucene - recherche Wildcard basé sur de la recherche floue

J'ai une requête booléenne en place au moment, illustré ci-dessous:

$query = new Zend_Search_Lucene_Search_Query_Boolean(); 

$pattern = new Zend_Search_Lucene_Index_Term("*$string*"); 
$subquery1 = new Zend_Search_Lucene_Search_Query_Wildcard($pattern); 

$term = new Zend_Search_Lucene_Index_Term("$string"); 
$subquery2 = new Zend_Search_Lucene_Search_Query_Fuzzy($term); 

$query->addSubquery($subquery1, null /* optional */); 
$query->addSubquery($subquery2, null /* optional */); 

$hits = $index->find($query); 

Cela semble être l'exécution d'une recherche ou/ou. Par exemple: si je cherche le terme

"berry" 

je frappe tout avec « baie » partout dans le titre

berry, wild berry, strawberry, blueberry 

Mais si je cherche

"bery" 

Je ne les résultats touchés comme

berry 

Je suis pas exactement sûr comment la recherche floue est alimentée. Existe-t-il un moyen de modifier ma requête afin que je puisse effectuer une recherche générique après que la recherche floue a renvoyé les termes similaires?

Répondre

2

Je suppose que ce champ n'est pas analysé lorsqu'il est indexé. Ainsi, avec la première requête, vous obtenez des résultats de la requête générique. *berry* correspond à tous les exemples que vous avez donnés. *bery* ne correspond à aucun des documents, car il ne s'agit pas d'une sous-chaîne de l'un d'entre eux.

Pour la requête floue, les termes sont comparés par distance d'édition (Damerau–Levenshtein distance). Une distance d'édition de deux est le maximum par défaut pour une correspondance.

  • bery à berry - distance d'édition: 1
  • bery-wild berry - distance d'édition: 6
  • bery-strawberry - distance d'édition: 6
  • bery-blueberry - distance d'édition: 5

Cela pourrait être géré en partie en utilisant un analyseur, au lieu de indexer la chaîne entière en un seul jeton. L'analyseur standard diviserait wild berry en les jetons wild et berry, et vous pourriez vous attendre à une correspondance floue sur cela.

En ce qui concerne la fraise et bleuet, à moins que votre analyseur se démonte straw et berry en quelque sorte, vous pouvez spécifier manuellement termes de fendit en incorporant un SynonymFilter dans votre analyseur.

Une autre option serait de tenter de corriger l'orthographe de la requête avant de rechercher, en utilisant SpellChecker Lucene

+0

Grande réponse. Je vais regarder dans ceux-ci. Je vous remercie. –