2009-03-09 5 views
7

Je veux que ma requête Lucene pour contenir quelque chose de similaire à:Soit Lucene inclure des espaces en terme de correspondance exacte

companyNam: camions mercedes

où il fera une correspondance exacte pour la chaîne " mercedes trucks »dans le champ companyName.
Le companyName est un champ untokenized, mais quoi que ce soit avec un espace renvoie des résultats nuls ..

new TermQuery(new Term("companyName", "mercedes trucks")); 

résultats toujours 0 s'il y a un espace impliqué. Sinon, mon programme fonctionne bien.

+1

Je pense que nous avons besoin de voir le code qui ajoute ce champ aux documents d'index – itsadok

+0

Est-ce que companyName contient uniquement des "camions mercedes"? Avez-vous considéré qu'il pourrait y avoir un problème de boîtier? Ou peut-être une sorte de StemmingFilter qui supprime les s de fin? – jishi

+0

@jishi: Je ne travaille plus sur ce projet et je n'ai plus accès au code. Je pense que cela pourrait être un problème de boîtier, mais je ne peux pas vérifier plus –

Répondre

0

Je devine ici - est-ce que exactMask ajoute des guillemets autour de la chaîne? Vous devez simplement utiliser la chaîne "mercedes truck", sans la manipuler.

new TermQuery(new Term("companyName", "mercedes trucks")); 
+0

En effet, un peu flou, éditera le message original. J'ai essayé le masque avec des citations et non des citations. Aucun n'a travaillé. –

0

Avez-vous envisagé d'utiliser un PhraseQuery? Est-ce que le champ doit être non identifié? Je crois que non-identifié est pour les ids etc. et pas pour les champs ayant plusieurs mots comme leur contenu.

+0

J'ai ajouté un untokenized seulement pour cela. Parce que je pensais avoir besoin des espaces. –

4

Vous utilisez peut-être un analyseur différent lors de la recherche que celui avec lequel vous avez créé l'index.

Essayez d'utiliser KeywordAnalyzer lors de la recherche. Cela va créer un jeton unique de la chaîne de recherche qui est probablement ce que vous cherchez.

+0

Je vais vérifier cela. Merci. –

+0

Avait le même problème et en utilisant KeywordAnalyzer l'a corrigé pour moi. –

+0

J'utilise 'KeyWordAnalyzer' à la fois lors de l'indexation et lors de la recherche, et il interprète toujours la phrase comme plusieurs termes lorsque je recherche. – DCShannon

-1

Même moi je suis confronté au même problème. Vous devez faire la chose suivante pour se débarrasser de ce problème. 1) Lorsque vous ajoutez la valeur du champ au document, supprimez les espaces intermédiaires. 2) Faites la valeur du champ en minuscules. 3) Faites le texte de recherche en minuscules. 4) Supprimer les espaces blancs dans le texte de recherche. Cordialement ~ shef

+0

Cela va ignorer les espaces, ce qui est le contraire de les inclure dans la recherche. En d'autres termes, "One Two" devrait correspondre à "One Two", pas à "OneTwo". – DCShannon

9

Utilisez un PhraseQuery comme ceci:

//create the query objects 
BooleanQuery query = new BooleanQuery(); 
PhraseQuery q2 = new PhraseQuery(); 
//grab the search terms from the query string 
string[] str = Sitecore.Context.Request.QueryString[BRAND_TERM].Split(' '); 
//build the query 
foreach(string word in str) 
{ 
    //brand is the field I'm searching in 
    q2.Add(new Term("brand", word.ToLower())); 
} 

//finally, add it to the BooleanQuery object 
query.Add(q2, BooleanClause.Occur.MUST); 

//Don't forget to run the query 
Hits hits = searcher.Search(query); 

Hope this helps!

+0

+1 pour la division. travaillé très bien. – mathieu

+0

Cela peut être dangereux - http://msdn.microsoft.com/en-us/library/ms973837.aspx "String.Split va créer un tableau de chaînes, ce qui signifie un nouvel objet chaîne pour chaque mot clé à l'origine dans votre Si nous faisons cela dans le contexte d'un tri, c'est beaucoup de comparaisons et votre fonction de comparaison à deux lignes crée maintenant un très grand nombre d'objets temporaires. garbage collector va travailler très dur en votre nom, et même avec le système de collecte le plus intelligent, il y a juste beaucoup de déchets à nettoyer. " – digiguru

8

Peut-être remplacer:

mercedes trucks 

avec

mercedes?trucks 

Works pour moi.

+0

Dans le terme indexé ou dans la requête? Quelle est la signification du point d'interrogation? – DCShannon

+1

Plus de trois ans de retard, mais pour le bénéfice de quiconque lira ceci dans le futur: Le point d'interrogation est un caractère générique pour un seul caractère dans la syntaxe de requête de Lucene – Zout

0

La meilleure façon que j'ai trouvé qui fonctionne est d'analyser la requête en utilisant le mot-clé analyseur avec la requête suivante "mercedes? Trucks".