Accélération de correspondance exacte SOLR sur du texte contenant la correspondance exacte
Je ne pouvais pas trouver un meilleur titre, je l'espère, de le changer plus tard si possible lors de vos éventuelles suggestions.
Mon problème:
J'ai une base de données avec des artistes de musique. Ces ressembler à ceci: "dr. dre feat. akon", "eminem & dr. dre", "dr. dre feat. ll cool j", "dr. dre", "dr. dre feat. eminem & skylar grey". Nous n'avons que deux champs: id et le nom.
Sur un schéma par défaut solr core I exécuter cette requête: "q=dr. dre" et les résultats sont ok, mais pas parfait, comme ceci:
- dr. dre feat. akon
- eminem & dr. dre
- dr. dre feat. ll cool j
- dr. dre
- ...
Remarque qu'ils ont obtenu exactement le même score.
Ce que je veux, c'est avoir "dr. dre" dans un premier temps, puis tous les autres, comme ceci:
- dr. dre <<-- dr. dre est le premier
- eminem & dr. dre
- dr. dre feat. ll cool j
- dr. dre feat. akon
- ...
Comment puis-je y parvenir? (filtres, des générateurs de jetons, copie de champs, etc. ist n'a pas d'importance. Je ne peux pas changer de code à l'intérieur de solr que j'ai vu sur un autre forum suggéré)
Grâce.
source d'informationauteur BogdanM
Vous devez vous connecter pour publier un commentaire.
Il ya un couple de façons différentes pour obtenir le "dr. dre" résultat à venir en premier. Je m'excuse pour cette longue réponse, mais comme cela arrive souvent dans Solr, la réponse dépend de vos priorités et vos besoins.
Normes
Normes sont une option flexible permettant de travailler avec Solr assez naturellement. Votre
name
champ doit probablement avoir untype
valeur qui correspond à unfieldType
entrée. LefieldType
doit probablement avoirclass="solr.TextField"
et il ne devrait pas avoiromitNorms="true"
. Sauf si vous avez explicitement omettre les normes relatives à votre nom de domaine, Solr examinera la façon dont beaucoup de ce nom correspond à vos termes de recherche et combien de fois votre correspondance des termes de recherche dans le nom lors du calcul du score d'un document. "dr. dre" aurait le score le plus élevé parce que 100% des mots dans le nom de correspondre à votre recherche.Vous pouvez lire sur les normes et voir un bon texte général
fieldType
de configuration sur le wiki de documentation de Solrou dans votre téléchargé Solr documentation de votre Solr version. L'avantage de s'appuyer sur les normes, c'est qu'en plus d'être assez facile à mettre en œuvre, elles sont progressives. Ainsi, alors que "dr. dre" serait le plus enregistrement pertinent à 100% de son nom correspondant à votre recherche, "eminem & dr. dre" serait également plus pertinent que "toute une liste de gars & aussi dr. dre" parce que votre terme de recherche est une plus grande proportion de ce nom.Correspondance Exacte
Correspondance exacte est une question compliquée dans Solr, en grande partie parce qu'il y a divers degrés de "l'exactitude", et une véritable correspondance exacte est rarement souhaitable dans la vraie vie. Par exemple, si votre dossier avec le nom "dr. dre", "dr dre" (sans le point) assez proches pour être exact? Est "Dr Dre"? Est " dr. dre"?
Si vous décidez de mettre en place une correspondance exacte recherche, alors vous aurez probablement souhaitez mettre en place un copyfield dans votre
schema.xml
:Ensuite, vous voudrez rechercher les deux champs. Comment vous faites cela dépend de l'analyseur de requête que vous utilisez. Si vous utilisez le standard/lucene analyseur de requête, alors vous aurez besoin de configurer vos requêtes OU de la recherche (p. ex.
q=name:"dr. dre" OR exactName:"dr. dre"^4
). Un "^4" après un terme de recherche qui rend ce match 4 fois plus important/un match de ailleurs dans la requête. Si vous utilisez le Dismax ou Étendue Dismax analyseur de requête, vous avez accès à la plus récenteqf
champ, qui permet de fournir une liste de champs à utiliser pour votre recherche, et pour définir certains comme plus importantes que d'autres. Par exempleqf=exactName^4 name&q="dr. dre"
dit Solr à cocher pour "dr. dre" dans les deux champs, mais considère que le match de la exactName champ à 4 fois plus pertinent dans le champ nom. (Si cela fonctionne pour vous, la valeur par défautqf
peut être définie danssolrconfig.xml
de sorte qu'il n'a pas besoin d'être redressé avec chaque requête.)Ce qui laisse la
fieldType
de la exactName champ indécis. Si vous vous sentez que seul un complètement précis match du travail et des variations dans la structure du capital ou des signes de ponctuation faire un match non-exacte, alors vous pouvez définir le exactName champ comme une chaîne de caractères:Mais plus probablement, vous voulez autoriser une certaine variation dans ce qui est considéré comme "exact", dans ce cas, vous aurez besoin de faire un nouveau
fieldType
probablement à l'aide de la Mot-Clé Générateur De Jetonsqui ne cassera pas le nom exact en plusieurs jetons indexés, mais le conserver en un seul jeton. Par exemple:Cet exemple de base ne comprend que le mot-Clé générateur de jetons de garder le nom en entier comme un seul jeton, et le Bas du Boîtier du Filtre pour vous assurer que la différence entre les majuscules et les minuscules n'est pas pertinent. Si vous voulez que votre correspondance exacte pardonner de toutes autres conditions, vous devrez modifier l'analyse du type de champs.
Important: lors de la recherche à l'encontre d'un champ de type chaîne, ou un champ de texte qui a la Clé de générateur de jetons, c'est une bonne idée de faire en sorte que les recherches que vous envoyez à Solr toujours des guillemets autour d'eux (c'est à dire la recherche de phrase). Sinon, votre recherche sera décomposé en termes individuels avant même d'être par rapport au champ, et pas de un de vos conditions est susceptible de correspondre à l'ensemble du champ indexé. Cela peut conduire à ne jamais trouver toutes les correspondances dans le champ à tous, sauf quand les valeurs ne contiennent pas d'espaces, de toute façon. Ce n'est pas un problème si vous venez d'utiliser les Normes de contrôle de la pertinence dans un champ de texte avec plus standard de la segmentation.