2 votes

Comment trouver des mots-clés exacts dans une recherche solr ?

En fait, je suis confronté à un problème dans la recherche Solr. Il y a un champ auteur dans lequel j'ai stocké deux valeurs comme "deep kumar-singh" et "deep kumar singh". Lorsque je recherche l'auteur : "deep kumar-singh", il renvoie les deux résultats. Mais je veux qu'un seul résultat soit le résultat exact.

Voici la description de mon champ :

<field name="author" type="text_general" indexed="true" stored="true" multiValued="true"/>

J'ai créé le champ authorFacet pour obtenir la facette auteur.

<field name="authorFacet" type="string_ci" indexed="true" stored="false" multiValued="true"/>

Quand j'ai choisi authorFacet il retourne le compte 1 pour les deux auteurs. Comme :

deep kumar-singh(1)

deep kumar singh(1)

Je ne veux qu'un seul résultat pour être exact.

Comment puis-je l'obtenir ? Toute suggestion serait très utile.

2voto

Abhijit Bashetti Points 4109

Changez le fieldType de author à la chaîne de text_general et réindexer les données. Vous obtiendrez le résultat souhaité. Le champ ayant pour type la chaîne de caractères, il ne créera pas de token du mot et permettra d'obtenir une correspondance exacte.

La même chose peut être analysée à partir de la page d'administration de Solr. Allez sur la page d'administration de Solr. Sélectionnez le noyau/collection. Cliquez sur l'analyse. Vous pouvez sélectionner le champ et vérifier le jeton de temps d'index et le temps de requête s'ils correspondent à vos attentes.

Et avec cela, vous n'avez pas besoin de deux champs différents pour l'auteur. Vous pouvez utiliser un champ qui a une chaîne comme type de champ et qui peut être utilisé à la fois pour le facettage et la recherche.

solr exact match

1voto

Hector Correa Points 10408

Si vous voulez une correspondance exacte, vous devez utiliser un champ de type chaîne plutôt qu'un champ de type texte. Les champs de type chaîne sont stockés tels quels, sans aucune transformation.

<field name="author" type="string" indexed="true" stored="true" multiValued="true"/>

Gardez à l'esprit que si vous utilisez une chaîne, alors "abc" sera différent de "abc". (remarquez le point supplémentaire) ou de "abc " (remarquez l'espace supplémentaire). Le concept de recherche exacte est en fait assez compliqué si vous voulez traiter ces cas différemment (voir https://stackoverflow.com/a/29105025/446681 )

1voto

Rinshad Points 116

Vous pourriez modifier votre type de champ en ajoutant un charFilter dans les analyseurs d'index et de requêtes comme ceci :

<charFilter class="solr.PatternReplaceCharFilterFactory" pattern="[-]" replacement=""/>

Veuillez noter que le charFilter doit être placé avant le tokenizer. En fait, vous supprimez les traits d'union avant la tokénisation.

Donc, si vous cherchez avec :

  • "profond", vous obtenez "profond kumar-singh" et "profond kumar singh".
  • "kumar-singh", vous obtenez "deep kumar-singh" seulement.
  • "kumar singh", vous obtenez "deep kumar singh" seulement.

Je crois que c'est ce dont vous avez besoin.

Si vous ne voulez pas modifier le type de champ text_general, vous pouvez créer un autre type de champ avec les mêmes analyseurs que ceux de text_general et ajouter le charFilter au nouveau type de champ.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X