L'Index Lucene problèmes avec le caractère “-”
J'ai de la difficulté avec l'Index Lucene, qui a des mots, qui contiennent "-" Personnages.
Ça marche pour certains mots qui contiennent "-" mais pas pour tous et je ne trouve pas la raison, pourquoi il ne fonctionne pas.
Le domaine, je suis à la recherche, est analysé et contient la version de la parole, avec et sans le caractère" -".
Je suis à l'aide de l'analyseur: org.apache.lucene.de l'analyse.standard.StandardAnalyzer
voici un exemple:
si je recherche pour "gsx-*" j'ai eu un résultat, le champ indexé contient
"SUZUKI GSX-R 1000 GSX-R1000 GSXR"
mais si je recherche pour "v-*" je n'ai pas de résultat. Le champ indexé du résultat attendu contient:
"SUZUKI DL 1000 V-STROM DL1000V-STROMVSTROM V STROM"
Si je recherche pour "v-strom" sans "*" et ça fonctionne, mais si je viens de la recherche pour "v-str" par exemple, je n'obtenez pas le résultat. (Il devrait y avoir une suite car c'est pour un live de recherche pour une boutique en ligne)
Alors, quelle est la différence entre les 2 résultats attendus? pourquoi faut-il travailler pour "gsx-" mais pas pour "v-" ?
Avez-vous réellement vérifié le contenu du champ indexé ou vous il suffit de s'attendre à être comme ça? Si pas d'utiliser la plus grande de l'index Lucene outil - Luc: code.google.com/p/luke
oui, j'affiche le même domaine, je suis à la recherche dans
OriginalL'auteur Zteve | 2012-04-17
Vous devez vous connecter pour publier un commentaire.
StandardAnalyzer permettra de traiter le trait d'union comme les espaces, je crois. Donc, il transforme votre requête
"gsx-*"
en"gsx*"
et"v-*"
en rien, car au élimine également la seule lettre jetons. Ce que vous voyez comme le contenu d'un champ dans le résultat de recherche est la valeur du champ, qui est totalement indépendant des conditions qui ont été indexés pour ce champ.Donc ce que vous voulez, c'est pour "v-strom" ensemble à être indexé terme.
StandardAnalyzer
n'est pas adapté à ce type de texte. Peut-être avez-un aller avec leWhitespaceAnalyzer
ouSimpleAnalyzer
. Si cela ne fonctionne toujours pas, vous avez également la possibilité de lancer votre propre analyseur, ou juste de démarrer ces deux mentined et la composition avec plus deTokenFilters
. Une très bonne explication est donnée dans la Lucene package d'Analyse Javadoc.BTW, il n'y a pas besoin de saisir toutes les variantes de l'indice, comme la V-strom, la V-Strom, etc. L'idée est pour le même analyseur de normaliser toutes ces variantes de la même chaîne à la fois dans l'index et lors de l'analyse de la requête.
Je suis un peu rouillé avec Solr, mais j'aimerais commencer par l'ajout d'un champ supplémentaire à votre schéma (par exemple, produit_nom), dont vous devez uniquement des lettres minuscules (le champ type = minuscules). Ajouter ce champ (OU) pour votre demande de recherche d'url supplémentaires param avec des poids plus élevé.
ce type de syntaxe/valeur doit être dans ce domaine produit_nom? le même contenu que dans le champ indexé? Il est également possible de modifier la valeur du champ indexé, comme j'ai pu le changer, par exemple, pour "V-STROM v-strom vstrom v strom V STROM", un changement de la valeur de l'offre la solution? Le seul truc, c'est que le client doit être en mesure de trouver le résultat quand il tape "v-str" ou "v-" etc. dans le champ de recherche.
Le champ doit contenir le nom du produit (que vous avez dit que vous vouliez préfixe-recherche par) et être de type "minuscules", qui prendrait soin pour toutes vos questions supplémentaires posées par lui-même.
Eh bien oui, si elle est acceptable pour vous de trouver quelque chose qui analyse les "strom", alors que c'est elle. Mais si par l'interrogation de "x-strom" vous ne voulez pas de résultats "v-strom", puis il y a un problème. La question d'origine n'a même pas impliquer la "strom".
OriginalL'auteur Marko Topolnik
ClassicAnalyzer poignées '-' comme utile, non-caractère délimiteur. Comme je comprends ClassicAnalyzer, il gère '-' comme le pré-3.1 StandardAnalyzer parce que ClassicAnalyzer utilise ClassicTokenizer qui traite des nombres avec un intégré " - " comme un code de produit, donc, le tout est segmenté comme un seul terme.
Quand j'étais à l'Regenstrief Institute, j'ai remarqué cela après la mise à niveau Luc, le LOINC standard termes médicaux (LOINC a été initié par R. I.) sont identifiés par un numéro suivi d'un '-' et un chiffre de contrôle, comme " 1-8 " ou "2857-1'. Mes recherches pour LOINCs comme "45963-6' a échoué à l'aide de StandardAnalyzer dans Luc 3.5.0, mais réussi avec ClassicAnalyzer (et c'est parce que nous avons construit l'index avec le 2.9.2 Lucene.NET).
OriginalL'auteur Mark Leighton Fisher
La ClassicAnalzer est recommandé d'index de texte contenant des codes de produit comme "GSX-R1000'. Il va la reconnaître comme un seul terme et ne pas diviser ses parties. Mais par exemple le texte 'Europe/Berlin' sera divisé par le ClassicAnalzer dans les mots "Europe" et "Berlin". Cela signifie que si vous avez un texte indexé par le ClassicAnalyzer contenant l'expression
vous pouvez rechercher pour "l'europe", "berlin" ou "GSX-R1000".
Mais attention à ce qui l'analyseur de vous utiliser pour la recherche. Je pense que le meilleur choix pour rechercher l'index Lucene est le KeywordAnalyzer. Avec le KeywordAnalyzer vous pouvez également rechercher des champs dans un document et vous pouvez construire des requêtes complexes comme:
Cette requête de recherche des documents avec la phrase "berlin", mais aussi un champ "processid" contenant le numéro 4711.
Mais si vous effectuez une recherche l'index de l'expression "europe/berlin", vous n'obtenez pas de résultat! C'est parce que le KeywordAnalyzer n'a pas changer votre phrase de recherche, mais l'expression 'Europe/Berlin' a été scindée en deux mots séparés par la ClassicAnalyzer. Cela signifie que vous avez à la recherche de "l'europe" et "berlin" séparément.
Pour résoudre ce conflit, que vous pouvez traduire un terme de recherche, entré par l'utilisateur, dans une requête de recherche qui s'adapte à vos besoins en utilisant le code suivant:
Ce code permet de traduire les moteurs de recherche pharse
en
le résultat sera prévue dans le document.
Remarque: Cela fonctionnera également pour les situations plus complexes. Le terme de recherche
sera traduit en:
qui permet de rechercher correctement pour toutes les phrases en combinaison à l'aide de la KeyWordAnalyzer.
OriginalL'auteur Ralph
(Basé sur Lucene 4.7) StandardTokenizer divise or, les mots coupés en deux. par exemple "chat-room" en "chat","la chambre" et de l'index les deux mots séparément au lieu de l'indexation comme un seul mot en entier. Il est assez commun pour séparer les mots pour être connecté avec un trait d'union: “le sport-fou,” l'appareil photo “-prêt”, “vivacité d'esprit”, et ainsi de suite. Un nombre important sont un trait d'union noms, tels que “Emma-Claire.” Quand on fait Toute une Recherche d'un Mot ou d'une requête, les utilisateurs s'attendent à trouver le mot à l'intérieur de ces traits d'union. Bien qu'il existe certains cas où ils sont séparés des mots, c'est pourquoi lucene conserve le trait d'union de la définition par défaut.
Pour offrir un soutien de trait d'union dans
StandardAnalyzer
, vous devez effectuer des changements dansStandardTokenizerImpl.java
qui est généré classe de jFlex.Renvoyer cette lien pour le guide complet.
Vous devez ajouter la ligne suivante dans
SUPPLEMENTARY.jflex-macro
qui est inclus parStandardTokenizerImpl.jflex
fichier.Et Après avoir fait des changements de fournir
StandardTokenizerImpl.jflex
fichier comme entrée de jFlex moteur et cliquez sur générer. La sortie de ce que seraStandardTokenizerImpl.java
Et d'utiliser ce fichier de classe de reconstruire l'index.
OriginalL'auteur PVR