using CD67.ModeleMVC.Entity; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Xml; namespace CD67.ModeleMVC.Solr { public class IndexeurSolr { public static string SolrUrl = "http://t-lunr4:8080/solr/modele-mvc"; /// /// Ajoute le viking à l'index solr /// /// Un objet Viking /// Un GUID utilisé pour identifier la version des données indéxées /// Si autocommit est vrai, les modifications apportées à l'index seront commitées automatiquement public static void addViking(Viking viking, string version = "", bool autocommit = true) { // Si aucun GUID version n'a été donné en paramètre, en génère un pour cet ajout. if (String.IsNullOrEmpty(version)) { version = Guid.NewGuid().ToString(); } // Génère le document XML qui servira à transmettre les données à SolR XmlDocument toSolr = new XmlDocument(); toSolr.AppendChild(toSolr.CreateElement("add")); XmlNode node = toSolr.CreateElement("doc"); // Ajoute les noeuds au document XML. // >> Cette partie est à modifier selon le type d'objet indéxé (ici: Viking) // Id unique Solr addFieldToNode(ref node, "id", viking.Id.ToString()); // Version de la donnée addFieldToNode(ref node, "version", version); // Donnees addFieldToNode(ref node, "nom", viking.Nom); addFieldToNode(ref node, "description", viking.Description); // Facettes addFieldToNode(ref node, "type_libelle", viking.TypeViking.Libelle); addFieldToNode(ref node, "casque_cornu", (viking.CasqueCornu ? "Oui" : "Non")); addFieldToNode(ref node, "nb_victoires", (viking.NombreVictoires == null) ? "0" : viking.NombreVictoires.ToString()); addFieldToNode(ref node, "annee_creation", viking.DateCreation.Year.ToString()); // Tri addFieldToNode(ref node, "date_edition", String.Format("{0:yyyyMMddhhmmss}", viking.DateEdition)); // contruit le champ recherche par concaténation List recherche_strings = new List() { viking.Nom, viking.TypeViking.Libelle, viking.Description }; string recherche = String.Join(" ", recherche_strings); addFieldToNode(ref node, "recherche", recherche.ToLower()); // Met à jour le document XML toSolr.DocumentElement.AppendChild(node); // Envoie la requete de mise à jour au serveur SolrTools.SolrEngine.SolrUpdate(SolrUrl, toSolr.OuterXml); // Commit les modifications si besoin if (autocommit) { commit(); } } /// /// Commit les ajouts / suppressions /// /// public static void commit() { SolrTools.SolrEngine.SolrUpdate(SolrUrl, ""); } /// /// Optimize les indexes /// (à lancer en fin de traitement) /// /// public static void optimize() { SolrTools.SolrEngine.SolrUpdate(SolrUrl, ""); } /// /// Supprime l'item de l'index /// /// public static void delete(string id) { SolrTools.SolrEngine.SolrUpdate(SolrUrl, "id:" + id + ""); } /// /// Ajoute un noeud 'champ solr: valeur' au noeud en cours du document XML /// /// /// /// /// private static void addFieldToNode(ref XmlNode doc, string name, string value, updateAttributeValues updateAttribute = updateAttributeValues.none) { XmlNode node = doc.AppendChild(doc.OwnerDocument.CreateElement("field")); // description d'un champs node.Attributes.Append(doc.OwnerDocument.CreateAttribute("name")).Value = name; if (updateAttribute != updateAttributeValues.none) node.Attributes.Append(doc.OwnerDocument.CreateAttribute("update")).Value = updateAttribute.ToString(); node.InnerText = value; } enum updateAttributeValues { none, set, add } /// /// Send a query string to Solr /// /// /// public static XmlNode request(string query) { return SolrTools.SolrEngine.SolrRequest(SolrUrl, query); } } }