RechercheController.cs 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. using CD67.ModeleMVC.Solr;
  2. using SolrTools;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Web;
  8. using System.Web.Configuration;
  9. using System.Web.Mvc;
  10. using System.Xml;
  11. using System.Xml.Xsl;
  12. namespace CD67.ModeleMVC.MVC.Controllers
  13. {
  14. public class RechercheController : Controller
  15. {
  16. /// <summary>
  17. /// Recherche via SOLR
  18. /// </summary>
  19. /// <returns></returns>
  20. public ActionResult Index()
  21. {
  22. //######## Decommenter cette partie pour que la page soit vide au premier affichage
  23. // Si cette partie reste commentée, tous les résultats seront affichés au premier affichage
  24. //if (!(Request.QueryString.AllKeys.Count() > 0))
  25. //{
  26. // ViewData["xmlData"] = "";
  27. // return View();
  28. //}
  29. // #######
  30. // Construit la requete solr ("q=...")
  31. string requeteSolr = BuildSolrRequest(Request);
  32. XmlNode xmldata = IndexeurSolr.request(requeteSolr);
  33. // Passe les arguments à la XSLT
  34. XsltArgumentList argsList = new XsltArgumentList();
  35. argsList.AddParam("recherche", "", this.Request["recherche"] == null ? "*" : this.Request["recherche"]);
  36. argsList.AddParam("mode", "", "modele-mvc");
  37. argsList.AddParam("paramrecherche", "", "recherche");
  38. argsList.AddParam("configFile", "", "../solr.config.xml");
  39. ViewData["xmlData"] = ApplyXslt(xmldata, "/xslt/resultat-recherche.xslt", argsList);
  40. return View();
  41. }
  42. /// <summary>
  43. /// Construit une requête Solr à partir de la requête Http et des appSettings (Web.config)
  44. /// </summary>
  45. /// <param name="request"></param>
  46. /// <returns></returns>
  47. private string BuildSolrRequest(HttpRequestBase request)
  48. {
  49. List<string> build = new List<string>();
  50. // 1. recherche (from HttpRequest)
  51. string recherche = this.Request["recherche"];
  52. if (string.IsNullOrEmpty(recherche))
  53. {
  54. recherche = "*";
  55. }
  56. build.Add(string.Format("q=recherche:{0}", recherche.ToLower()));
  57. // 2. facettes (from Web.Config)
  58. string facette_fields = System.Configuration.ConfigurationManager.AppSettings["facette_fields"];
  59. if (facette_fields.Length > 0)
  60. {
  61. build.Add("facet=true");
  62. foreach (string facette_field in System.Configuration.ConfigurationManager.AppSettings["facette_fields"].Split(' '))
  63. {
  64. build.Add(String.Format("facet.field={0}", facette_field));
  65. }
  66. build.Add(String.Format("facet.mincount={0}", System.Configuration.ConfigurationManager.AppSettings["facette_mincount"]));
  67. }
  68. // 3. Facettes héritées (from HttpRequest)s
  69. if (!string.IsNullOrEmpty(request["fq"]))
  70. {
  71. var fqs = request["fq"].Split(new[] { ',' });
  72. foreach (string fq in fqs)
  73. {
  74. var fqval = fq.Split(new[] { ':' });
  75. if(fqval[1].ToString().StartsWith("[")) build.Add(String.Format("fq={0}:{1}", fqval[0], fqval[1]));
  76. else build.Add(String.Format("fq={0}:\"{1}\"", fqval[0], fqval[1].Replace("\"", "")));
  77. }
  78. }
  79. //// 4. sort
  80. //build.Add(string.Format("sort={0}", System.Configuration.ConfigurationManager.AppSettings["trierPar"]));
  81. // 5. nombre de resultats par page
  82. build.Add(string.Format("rows={0}", System.Configuration.ConfigurationManager.AppSettings["resultatParPage"]));
  83. // 6. Starting point (from HttpRequest)
  84. try
  85. {
  86. build.Add(string.Format("start={0}", int.Parse(request["start"])));
  87. }
  88. catch
  89. {
  90. build.Add("start=0");
  91. }
  92. //7. Facette range
  93. build.Add(System.Configuration.ConfigurationManager.AppSettings["facette_ranges"]);
  94. build.Add("echoParams=explicit");
  95. return string.Join("&", build);
  96. }
  97. /// <summary>
  98. /// Transforme le résultat XML à l'aide d'une feuille de style xslt
  99. /// </summary>
  100. /// <param name="xmldata">Resultat de la requete solr au format XML</param>
  101. /// <param name="xslt">Chemin vers la feuille xslt</param>
  102. /// <returns></returns>
  103. private string ApplyXslt(XmlNode xmldata, string xslt, XsltArgumentList args)
  104. {
  105. // StringBuilder: chaines mutables
  106. StringBuilder sb = new StringBuilder();
  107. // Creation et paramétrage d'un XmlWriter
  108. XmlWriterSettings writer_options = new XmlWriterSettings();
  109. writer_options.Indent = false;
  110. writer_options.IndentChars = "\t";
  111. writer_options.ConformanceLevel = ConformanceLevel.Auto;
  112. XmlWriter writer = XmlWriter.Create(sb, writer_options);
  113. // Transformation XSL
  114. XslCompiledTransform transfo = new XslCompiledTransform();
  115. // new XsltSettings(true/false, true/false) : chargement des documents et des scripts (à activer au besoin)
  116. transfo.Load(Server.MapPath(xslt), new XsltSettings(true, false), new XmlUrlResolver());
  117. using (XmlReader reader = new XmlNodeReader(xmldata))
  118. transfo.Transform(reader, args, writer);
  119. writer.Close();
  120. return sb.ToString();
  121. }
  122. /// <summary>
  123. /// Méthode appelée dynamiquement pour l'autocomplétion
  124. /// </summary>
  125. /// <param name="terms">Premiers termes tapés</param>
  126. /// <returns>Liste de suggestions</returns>
  127. [HttpGet]
  128. public string AutoComplete(string terms)
  129. {
  130. Uri SolRUrl = new Uri(WebConfigurationManager.AppSettings["SolrUrl"]);
  131. //if (HttpContext.Request.IsAuthenticated)
  132. {
  133. HttpContext.Response.ContentType = "application/json";
  134. HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
  135. return SolrEngine.SolrAutoCompleteMultiTerm(SolRUrl.AbsoluteUri, "*:*", "recherche", "count", terms.ToLower(), 10);
  136. }
  137. //else
  138. //{
  139. // HttpContext.Response.ClearContent();
  140. // HttpContext.Response.StatusCode = 401;
  141. // HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
  142. // return null;
  143. //}
  144. }
  145. }
  146. }