using CD67.ModeleMVC.Solr; using SolrTools; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Web; using System.Web.Configuration; using System.Web.Mvc; using System.Xml; using System.Xml.Xsl; namespace CD67.ModeleMVC.MVC.Controllers { public class RechercheController : Controller { /// /// Recherche via SOLR /// /// public ActionResult Index() { //######## Decommenter cette partie pour que la page soit vide au premier affichage // Si cette partie reste commentée, tous les résultats seront affichés au premier affichage //if (!(Request.QueryString.AllKeys.Count() > 0)) //{ // ViewData["xmlData"] = ""; // return View(); //} // ####### // Construit la requete solr ("q=...") string requeteSolr = BuildSolrRequest(Request); XmlNode xmldata = IndexeurSolr.request(requeteSolr); // Passe les arguments à la XSLT XsltArgumentList argsList = new XsltArgumentList(); argsList.AddParam("recherche", "", this.Request["recherche"] == null ? "*" : this.Request["recherche"]); argsList.AddParam("mode", "", "modele-mvc"); argsList.AddParam("paramrecherche", "", "recherche"); argsList.AddParam("configFile", "", "../solr.config.xml"); ViewData["xmlData"] = ApplyXslt(xmldata, "/xslt/resultat-recherche.xslt", argsList); return View(); } /// /// Construit une requête Solr à partir de la requête Http et des appSettings (Web.config) /// /// /// private string BuildSolrRequest(HttpRequestBase request) { List build = new List(); // 1. recherche (from HttpRequest) string recherche = this.Request["recherche"]; if (string.IsNullOrEmpty(recherche)) { recherche = "*"; } build.Add(string.Format("q=recherche:{0}", recherche.ToLower())); // 2. facettes (from Web.Config) string facette_fields = System.Configuration.ConfigurationManager.AppSettings["facette_fields"]; if (facette_fields.Length > 0) { build.Add("facet=true"); foreach (string facette_field in System.Configuration.ConfigurationManager.AppSettings["facette_fields"].Split(' ')) { build.Add(String.Format("facet.field={0}", facette_field)); } build.Add(String.Format("facet.mincount={0}", System.Configuration.ConfigurationManager.AppSettings["facette_mincount"])); } // 3. Facettes héritées (from HttpRequest)s if (!string.IsNullOrEmpty(request["fq"])) { var fqs = request["fq"].Split(new[] { ',' }); foreach (string fq in fqs) { var fqval = fq.Split(new[] { ':' }); if(fqval[1].ToString().StartsWith("[")) build.Add(String.Format("fq={0}:{1}", fqval[0], fqval[1])); else build.Add(String.Format("fq={0}:\"{1}\"", fqval[0], fqval[1].Replace("\"", ""))); } } //// 4. sort //build.Add(string.Format("sort={0}", System.Configuration.ConfigurationManager.AppSettings["trierPar"])); // 5. nombre de resultats par page build.Add(string.Format("rows={0}", System.Configuration.ConfigurationManager.AppSettings["resultatParPage"])); // 6. Starting point (from HttpRequest) try { build.Add(string.Format("start={0}", int.Parse(request["start"]))); } catch { build.Add("start=0"); } //7. Facette range build.Add(System.Configuration.ConfigurationManager.AppSettings["facette_ranges"]); build.Add("echoParams=explicit"); return string.Join("&", build); } /// /// Transforme le résultat XML à l'aide d'une feuille de style xslt /// /// Resultat de la requete solr au format XML /// Chemin vers la feuille xslt /// private string ApplyXslt(XmlNode xmldata, string xslt, XsltArgumentList args) { // StringBuilder: chaines mutables StringBuilder sb = new StringBuilder(); // Creation et paramétrage d'un XmlWriter XmlWriterSettings writer_options = new XmlWriterSettings(); writer_options.Indent = false; writer_options.IndentChars = "\t"; writer_options.ConformanceLevel = ConformanceLevel.Auto; XmlWriter writer = XmlWriter.Create(sb, writer_options); // Transformation XSL XslCompiledTransform transfo = new XslCompiledTransform(); // new XsltSettings(true/false, true/false) : chargement des documents et des scripts (à activer au besoin) transfo.Load(Server.MapPath(xslt), new XsltSettings(true, false), new XmlUrlResolver()); using (XmlReader reader = new XmlNodeReader(xmldata)) transfo.Transform(reader, args, writer); writer.Close(); return sb.ToString(); } /// /// Méthode appelée dynamiquement pour l'autocomplétion /// /// Premiers termes tapés /// Liste de suggestions [HttpGet] public string AutoComplete(string terms) { Uri SolRUrl = new Uri(WebConfigurationManager.AppSettings["SolrUrl"]); //if (HttpContext.Request.IsAuthenticated) { HttpContext.Response.ContentType = "application/json"; HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache); return SolrEngine.SolrAutoCompleteMultiTerm(SolRUrl.AbsoluteUri, "*:*", "recherche", "count", terms.ToLower(), 10); } //else //{ // HttpContext.Response.ClearContent(); // HttpContext.Response.StatusCode = 401; // HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache); // return null; //} } } }