Est-il possible d'avoir SOLR MoreLikeThis utiliser différents champs pour le modèle et les matches?

StackOverflow https://stackoverflow.com/questions/3994423

  •  10-10-2019
  •  | 
  •  

Question

Disons que j'ai des documents avec deux champs, A et B.

Je voudrais utiliser les MoreLikeThis de SOLR, mais avec une touche: je suis plus intéressé à stimuler les documents dont le champ A est comme mon champ de document de modèle B. (C'est extrait des termes « intéressants » de MLT du champ modèle B, mais seulement de recueillir les résultats MLT basés sur le champ A.)

Je ne vois pas un moyen d'utiliser les champs mlt.fl ou mlt.qf booste pour obtenir cet effet dans une seule requête. (Il semble mlt.fl spécifie les champs utilisés pour l'interrogatoire préalable des « termes intéressants » et correspondant à ces termes.) Suis-je manque une option?

Ou devrai-je extraire moi-même les « termes intéressants » et échanger le « champ: terme »? Détails

(D'autres idées dans ce même ordre d'idées aussi bien apprécié.)

Était-ce utile?

La solution 2

Je pense que maintenant, il y a deux façons d'obtenir l'effet désiré (sans personnalisation du code source MLT).

Première possibilité: faire une requête initiale de MLT avec le MLT gestionnaire , ajoutant le paramètre &mlt.interestingTerms=details. Cela inclut la liste des termes jugés intéressants, avec leurs boosts classés relatifs. Le comportement habituel utilise ces termes découverts contre les mêmes champs mlt.fl pour trouver des documents similaires. Par exemple, la réponse comprendra quelque chose comme:

"interestingTerms": 
    ["field_b:foo",5.0,"field_b:bar",2.9085307,"field_b:baz",1.67070794]

(Puisque la seule chose au sujet de cette requête initiale qui est intéressant est le interestingTerms, jetant dans un fq que les règles sur tous les documents pourraient l'aider à sauter le travail de notation inutile.)

Explicitement re-composition qui info interestingTerms dans une nouvelle requête ou des quantités de field_a:foo^5.0 field_a:bar^2.9085307 field_a:baz^1.67070794 à l'aide du texte d'exemple de champ B pour trouver des documents qui sont semblables dans le domaine A, et peut être mimant exactement le genre de requête par défaut MLT fait sur son modèle habituel champ.

Deuxième possibilité: Prenez le champ réel du modèle de document texte B, et se nourrissent directement comme corps ContentStream , à utiliser au lieu d'une requête, pour spécifier le document modèle. Mettez ensuite en mlt.fl au champ A pour le bien de la collecte des résultats similaires. Par exemple, un fragment des paramètres peut être …&stream.body=foo bar baz&mlt.fl=field_a&…. Encore une fois, l'effet net étant que le texte de modèle à l'origine de Champ_B est de trouver des documents similaires que dans Champ_A.

Autres conseils

Deux options que je vois sont:

  1. Utilisez un copyField -. Indexer votre document original avec une copie de champ A nommé B, puis en utilisant la requête B
  2. Étendre MoreLikeThisHandler et modifier les champs requête.

La première option coûte un peu de programmation (principalement des changements de configuration) et une consommation de mémoire. La seconde implique une programmation plus, mais pas d'augmentation de l'empreinte mémoire. Espoir d'entre eux convient à vos besoins.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top