Question

J'essaie d'intégrer nhibernate.search dans un site Web multilingue. Maintenant, ce site contient une classe Article qui est multilingue. Cela se fait en ayant une classe séparée - Article_CultureInfo qui stocke le contenu spécifique à la langue. Champs de Article sommes

Article
-------
ID
Name

Et Article_CultureInfo sommes:

Article_CultureInfo
-------
ID
ArticleId
CultureCode
PageTitle
Content

j'utilise Nhibernate.Search.Mapping Pour cartographier les informations sur le terrain / document. Je voudrais incorporer des fonctionnalités de recherche telles que la tige et l'analyse des synonymes si possible sur la base de la langue. Existe-t-il un moyen pour l'analyseur de Lucene puisse être spécifié au moment de l'exécution, pas le temps / l'initialisation de compilation?

Disons que nous analysons le contenu de PageTitle qui doit être stocké dans l'indice Lucene respectif - ce contenu peut être anglais, français, italien, etc. basé sur la valeur de CultureCode. Ainsi, l'analyseur doit changer en fonction de cette valeur. J'ai essayé d'implémenter une coutume MultilingualAnalyser, Cependant, les seules données qui m'appartiennent sont la chaîne à analyser, c'est-à-dire la valeur de PageTitle. De cela seulement, je ne peux pas déduire la langue. (Je pourrais examiner les techniques de détection des langues, mais c'est hors de portée car je sais déjà spécifiquement ce qu'elle est, et serait exagérée et non 100% fiable.)

Si je devais avoir en dehors des jetons, une instance de l'objet, je pourrais pouvoir obtenir le CultureCode Valuez-le et analysez en conséquence. Toutes les idées seraient grandement appréciées - je souhaite vraiment éviter d'utiliser lucene.net directement puisque nhibernate.search semble s'intégrer très bien.

Merci!

Était-ce utile?

La solution

J'ai essentiellement fait une solution de travail pour cette méthode - assez exagérée mais fonctionne.

J'ai créé une nouvelle implémentation de IGetter, qui est utilisé pour les propriétés multilingues, que j'ai appelées MultilingualGetter. C'est fondamentalement la même chose que le BasicGetter - Je ne pouvais pas en étendre comme pour une raison quelconque sealed, j'ai donc copié le code.

Ce que ça IGetter fait est: quand le Get() la méthode est appelée, il est donné le target objet. Il s'agit de l'instance de la classe qui contient la propriété. Je vérifie qu'il implémente une interface pour les objets multilingues que j'ai créés, IMultilingualContentInfo. Il récupère ensuite la culture actuelle du IMultilingualContentInfo, et l'ajouta sur le devant du texte réel, par exemple [en] bonjour monde!.

Ce texte est ensuite transmis à un analyseur personnalisé que j'ai créé qui analyse également la culture, et peut déduire ce que c'est. Il utilise ensuite un SnowballFilter Pour endiguer le texte en fonction de la langue.

Ci-dessous est le code pour Get() Méthode de la coutume IGetter la mise en oeuvre - IMultilingualContentInfo

    /// <summary>
    /// Gets the value of the Property from the object.
    /// </summary>
    /// <param name="target">The object to get the Property value from.</param>
    /// <returns>
    /// The value of the Property for the target.
    /// </returns>
    public object Get(object target)
    {

        if (target is IMultilingualContentInfo)
        {
            try
            {
                IMultilingualContentInfo multiLingualTarget = (IMultilingualContentInfo)target;
                string s = (string)property.GetValue(target, new object[0]);
                if (!string.IsNullOrWhiteSpace(s))
                {
                    MultilingualLuceneTextContent mlText = new MultilingualLuceneTextContent();
                    mlText.Culture = multiLingualTarget.CultureInfo.GetCultureCode();
                    s = mlText.GetTextIncCulture();

                }
                return s;
            }
            catch (Exception e)
            {
                throw new PropertyAccessException(e, "Exception occurred", false, clazz, propertyName);
            }
        }
        else
        {
            throw new InvalidOperationException("Multilingual Getter is only available on IMultilingualContentInfo objects");
        }

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