2012-09-03 3 views
1

Il ya quelques mois, j'ai posé une question similaire here. Cependant, je n'arrive pas à le faire fonctionner correctement:NGram dans-ordre de recherche

Je tente de construire une recherche simple de nom de fichier. Je veux que l'utilisateur peut rechercher pour une partie du nom de fichier.
Disons que les noms de fichiers suivants sont indexés:

[1] My_file_2012.01.12.txt 
[2] My_file_2012.01.05.txt 
[3] My_file_2012.05.01.txt 
[4] My_file_2012.08.27.txt 
[5] My_file_2012.12.12.txt 
[6] My_file_2011.12.12.txt 
[7] file_01_2012.09.09.txt 

Ensuite, l'utilisateur peut rechercher:

"ile_20"     (finds the first six documents) 
"12.txt"     (finds 1, 5, 6) 
"12" followed by "01"  (finds 1, 2, 3 - NOT 7) 
"2012" followed by "01"  (finds 1, 2, 3 - NOT 7) 

(Note: Oui, l'utilisateur peut vraiment rechercher des chaînes comme "ile_20" ... par exemple, en raison d'erreurs de copier-coller)

Par conséquent, j'utilise un tokenizer nGram pour indexer chaque partie du nom de fichier. Ce fonctionne très bien jusqu'à présent. Pour soutenir le "suivi par" -search mentionné ci-dessus, j'ai besoin d'une requête que respecte l'ordre des termes, peu importe combien de texte est entre ces deux termes (okay disons 100 caractères maximum).

Puisqu'un "text_phrase" -query avec un "slop" ne respecte pas l'ordre de les termes correctement, j'ai décidé d'utiliser une requête "span_near". Cela fonctionne bien dans la plupart des cas.

Voir ici mon exemple complet-index incl. -Description de l'erreur: click

Comme mentionné dans l'exemple ci-dessus la requête « 2012» suivi de «01 » ne fonctionne pas depuis le tokenizer ngram génère une valeur de position pour chaque jeton , mais ces valeurs ne sont pas très utile lorsqu'il est utilisé par la requête "span_near". Pendant l'indexation , le terme "2012" est affecté à une valeur de position (50) qui est plus grande que la valeur de position pour le terme "01" (par exemple 10). Puisque 50 et 10 ne sont pas dans l'ordre la requête n'aura aucun résultat. La chose in-order fonctionne uniquement pour les termes qui ont la même longueur (par exemple "12" suivi de '01' ") ou si les termes sont classés par longueur (par exemple" '20' suivi de '. 12 '").

Alors, comment puis-je obtenir le bon comportement de recherche? Je veux juste la capacité de chercher n'importe quelle partie du nom de fichier tout en respectant l'ordre des termes .
Peut-être qu'il y a un moyen de dire à "span_near" de ne pas utiliser la position mais à la place du "start_offset"? Ou y a-t-il une autre requête que je peux utiliser?

Répondre

0

Que diriez-vous d'une recherche générique comme ceci:

"12" suivi de "01" -> 12 * 01

+0

Oui, ce que je fais depuis hier. Cela fonctionne parce que, grâce au NGram-tokenizer, chaque terme de recherche possible est indexé. Cependant, je me demande si cela peut causer des problèmes de performance. J'accélère déjà la recherche de manière drastique en utilisant un edgeNGram. – Biggie

+0

Vous pouvez le faire de manière limitée: par exemple, vous ne pouvez le faire que sur des dates. En anglais, ce serait "mysubstring commence par A et se termine par B". Je parle en termes de solr, alors traduisez comme approprié. 1. Copiez dans un nouveau champ, appelons-le FieldFront 2. utilisez regex et ne retenez que la partie qui vous intéresse. (Par exemple: [0-9 \.] + correspondra à une sous-chaîne contiguë ou à un nombre entier) 3. Applique un bord n-gramme sur la gauche Répétez 1-3 avec un nouveau champ de copie FieldRev. Sauf à l'étape 3, vous le feriez à partir de la droite. Ensuite, lorsque vous exécutez votre requête, vous pouvez dire quelque chose comme A: 12 ET B: 01 –

Questions connexes