Solr: expression exacte de la requête avec un EdgeNGramFilterFactory
Dans Solr (3.3), est-il possible d'en faire un terrain de lettre-par-lettre consultable par le biais d'un EdgeNGramFilterFactory
et également sensible à l'expression des requêtes?
Par exemple, je suis à la recherche d'un terrain qui, si contenant "contrat informatique", si l'utilisateur tape:
- contrat
- informatique
- contr
- informa
- "contrat informatique"
- "contrat d'info"
Actuellement, j'ai fait quelque chose comme ceci:
<fieldtype name="terms" class="solr.TextField">
<analyzer type="index">
<charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/>
<tokenizer class="solr.LowerCaseTokenizerFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front"/>
</analyzer>
<analyzer type="query">
<charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/>
<tokenizer class="solr.LowerCaseTokenizerFactory"/>
</analyzer>
</fieldtype>
...mais il a échoué sur les requêtes de phrase.
Quand je me regarde dans le schéma de l'analyseur dans solr admin, je trouve que le "contrat informatique" a généré les jetons suivants:
[...] contr contra contrat in inf info infor inform [...]
De sorte que la requête fonctionne avec "contrat de" (consécutifs jetons), mais pas de "contrat inf" (car ces deux jetons sont séparés).
Je suis sûr que tout type d'enrayer pouvez travailler avec les requêtes de phrase, mais je ne peux pas trouver le bon générateur de jetons de filtre à utiliser avant le EdgeNGramFilterFactory
.
Vous devez vous connecter pour publier un commentaire.
Phrase exacte recherche ne fonctionne pas en raison de requête slop paramètre = 0 par défaut.
Pour rechercher une phrase '"Hello World", " il en recherches pour les termes avec les positions séquentielles.
Je souhaite EdgeNGramFilter avait un paramètre de sortie de contrôle de positionnement, cela ressemble à un vieux question.
Par le réglage de paramètre qs pour certains de très grande valeur (plus de distance maximale entre les ngrams), vous pouvez obtenir des phrases en arrière. Cela résout partiellement le problème en permettant à des phrases, mais elle n'est pas exacte, permutations sera trouvé.
Pour que la recherche pour "contrat informatique" pourrait correspondre à un texte comme "...contrat abandonnée. Informatique..."
À l'appui de exacte requête de phrase, je me retrouve à utiliser des champs séparés pour les ngrams.
Étapes nécessaires:
Définir les types de champ distincts à l'index régulière des valeurs et de l'grammes:
Dire solr pour copie de champs lors de l'indexation:
Vous pouvez définir séparé ngrams réflexion pour chaque champ:
Ou vous pouvez mettre tous les ngrams dans un champ:
Noter que vous ne serez pas en mesure de séparer les boosters dans ce cas.
Et la dernière chose à faire est de spécifier ngrams des champs et des boosters dans la requête.
Une façon est de configurer votre application.
Une autre façon est de spécifier "ajoute" params dans le solrconfig.xml
Comme hélas je n'arrivais pas à utiliser un
PositionFilter
droit comme Jayendra Patil a suggéré (PositionFilter rend toute requête OU requête booléenne), j'ai utilisé une approche différente.Toujours avec le
EdgeNGramFilter
, j'ai ajouté le fait que chaque mot que l'utilisateur a tapé dans l'est obligatoire, et désactivé toutes les phrases.Donc, si l'utilisateur demande
"cont info"
, elle se transforme en+cont +info
. C'est un peu plus permissif qu'un véritable expression, mais il a réussi à faire ce que je veux (et ne retourne pas de résultats avec un seul terme de la deux).Le seul con à l'encontre de cette solution est que les termes peuvent être permutated dans les résultats (donc un document avec "informatique contrat" sera également trouvé), mais c'est pas une grosse affaire.
Ici est ce que je pensais -
Pour les ngrams pour être membre de phrase correspondait à la position des jetons générés pour chaque mot doit être la même.
J'ai vérifié pour le bord grammes filtre et on incrémente le jetons, et n'ai pas trouvé de paramètre pour l'en empêcher.
Il y a une position de filtre disponibles et cela maintient les jetons de la position de la même manière que pour le début.
Donc, si la configuration suivante est utilisée tous les jetons sont à la même position et il correspond à l'expression de la requête (même les postes sont appariés comme des phrases)
Je l'ai vérifié à travers l'analyse de l'outil et les requêtes de correspondance.
De sorte que vous pourriez vouloir essayer l'astuce :-
J'ai fait un correctif à EdgeNGramFilter afin de positions au sein d'un jeton ne sont pas incrémenté plus: