Skip to content

Commit

Permalink
Fix highlighting response parser.
Browse files Browse the repository at this point in the history
Apparently sometimes Solr doesn't output snippets as an <arr>
  • Loading branch information
mausch committed Apr 2, 2014
1 parent bed5fad commit f8acef3
Show file tree
Hide file tree
Showing 5 changed files with 50 additions and 17 deletions.
20 changes: 20 additions & 0 deletions SolrNet.Tests/Resources/responseWithHighlighting3.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<response>

<lst name="responseHeader">
</lst>
<result name="response" numFound="779" start="0" maxScore="17.080061">
</result>
<lst name="highlighting">
<lst name="e44344c4">
<str name="bodytext">&lt;p id="p1"&gt;Den belgiske topspiller Geert De Vos er tilmeldt Denmark Open og &lt;em&gt;Denmark&lt;/em&gt; Masters, der afvikles i weekenden den 3. og 4. maj 2014 på Esbjerg Conference Hotel. Som noget nyt vil vi prøve løbende at opdatere omkring de internationale topnavne, der melder sig til vores internationale flagskib.&lt;/p&gt;&lt;p id="p2"&gt;Geert De Vos ligger pt nummer 9 på WDFs verdensrangliste, mens han på BDOs Invitation ligger som nummer 6. Udover Geert De Vos er også Bryan Whyte tilmeldt. Han ligger pt. nummer 151 på verdensranglisten, men nummer 56 på BDOs Invitation.&lt;/p&gt;</str>
</lst>
<lst name="e442c47a">
<str name="bodytext">&lt;p id="p1"&gt;Garia lancerer en Special Edition Golf Car i forbindelse med det officielle sponsorat af Made in &lt;em&gt;Denmark&lt;/em&gt;, European Tour 2014. Indenfor alle produktgrupper findes der en model, som lige kan lidt ekstra. Golfbuggy-industrien er ikke anderledes, og golfsportens Ferrari hedder Garia.&lt;/p&gt;&lt;p id="p2"&gt;Da Garia er sponsor ved Made in &lt;em&gt;Denmark&lt;/em&gt;, European Tour 2014, har man ønsket at aktivere sit sponsorat ved at lave en helt særlig Made in &lt;em&gt;Denmark&lt;/em&gt; udgave af den populære golfbil. Modellen vil blive leveret med made in &lt;em&gt;Denmark&lt;/em&gt; logo, som dog med lidt knofedt kan fjernes, om man skulle have den lyst. Du ser hele tilbuddet her.&lt;/p&gt;&lt;p id="p3"&gt;Prisen på markedets mest eksklusive golfbil er 69.999 kroner inkl. moms men uden levering. Der bliver kun solgt 15 stk til denne pris, da det er et meget stærkt tilbud. Og de fås kun i Made in &lt;em&gt;Denmark's&lt;/em&gt; farver, rød og hvid.&lt;/p&gt;&lt;p id="p4"&gt;Så vil du give dine golfvenner baghjul, når foråret for alvor rammer de danske golfbaner, så bør du slå til nu.&lt;/p&gt;&lt;p id="p5"&gt;Du finder det vilde Garia kampagnetilbud her .&lt;/p&gt;&lt;p id="p6"&gt;Er du interesseret i tilbuddet, så kan du kontakte Steen Scherff på [email protected] eller på tlf. 46 570 580.&lt;/p&gt;&lt;p id="p7"&gt;Du kan se en af sportens mest populære skikkelse, Bubba Watson, give en præsentation af sin spritnye Garia på&lt;/p&gt;</str>
</lst>
<lst name="e442c4cd">
<str name="bodytext">&lt;p id="p1"&gt;Garia lancerer en Special Edition Golf Car i forbindelse med det officielle sponsorat af Made in &lt;em&gt;Denmark&lt;/em&gt;, European Tour 2014. Indenfor alle produktgrupper findes der en model, som lige kan lidt ekstra. Golfbuggy-industrien er ikke anderledes, og golfsportens Ferrari hedder Garia.&lt;/p&gt;</str>
</lst>
<lst name="e4420cc2"/>
</lst>
</response>
3 changes: 3 additions & 0 deletions SolrNet.Tests/SolrNet.Tests.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -322,6 +322,9 @@
<EmbeddedResource Include="Resources\responseReplicationStatusError.xml" />
<EmbeddedResource Include="Resources\responseReplicationStatusOk.xml" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Resources\responseWithHighlighting3.xml" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Import Project="$(SolutionDir)\.nuget\nuget.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Expand Down
12 changes: 10 additions & 2 deletions SolrNet.Tests/SolrQueryResultsParserTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -406,11 +406,10 @@ public void ExtractResponse() {
}

private static IDictionary<string, HighlightedSnippets> ParseHighlightingResults(string rawXml) {
var parser = new HighlightingResponseParser<Product>();
var xml = XDocument.Parse(rawXml);
var docNode = xml.XPathSelectElement("response/lst[@name='highlighting']");
var item = new Product { Id = "SP2514N" };
return parser.ParseHighlighting(new SolrQueryResults<Product> { item }, docNode);
return HighlightingResponseParser<Product>.ParseHighlighting(new SolrQueryResults<Product> { item }, docNode);
}

[Test]
Expand Down Expand Up @@ -459,6 +458,15 @@ public void ParseHighlighting2WrappedWithClass()
// Console.WriteLine(i);
Assert.AreEqual(3, first.Value.Snippets["source_en"].Count);
}

[Test]
public void ParseHighlighting3() {
var highlights = ParseHighlightingResults(EmbeddedResource.GetEmbeddedString(GetType(), "Resources.responseWithHighlighting3.xml"));
Assert.AreEqual(0, highlights["e4420cc2"].Count);
Assert.AreEqual(1, highlights["e442c4cd"].Count);
Assert.AreEqual(1, highlights["e442c4cd"]["bodytext"].Count);
Assert.Contains(highlights["e442c4cd"]["bodytext"].First(), "Garia lancerer");
}

[Test]
public void ParseSpellChecking() {
Expand Down
28 changes: 15 additions & 13 deletions SolrNet/Impl/ResponseParsers/HighlightingResponseParser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,11 @@
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#endregion

using System.Collections.Generic;
#endregion

using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;
using System.Xml.XPath;
using SolrNet.Utils;
Expand Down Expand Up @@ -42,7 +44,7 @@ public void Parse(XDocument xml, SolrQueryResults<T> results) {
/// <param name="results"></param>
/// <param name="node"></param>
/// <returns></returns>
public IDictionary<string, HighlightedSnippets> ParseHighlighting(IEnumerable<T> results, XElement node) {
public static IDictionary<string, HighlightedSnippets> ParseHighlighting(IEnumerable<T> results, XElement node) {
var highlights = new Dictionary<string, HighlightedSnippets>();
var docRefs = node.Elements("lst");
foreach (var docRef in docRefs) {
Expand All @@ -57,17 +59,17 @@ public IDictionary<string, HighlightedSnippets> ParseHighlighting(IEnumerable<T>
/// </summary>
/// <param name="nodes"></param>
/// <returns></returns>
public HighlightedSnippets ParseHighlightingFields(IEnumerable<XElement> nodes)
{
var fields = new HighlightedSnippets();
foreach (var field in nodes){
public static HighlightedSnippets ParseHighlightingFields(IEnumerable<XElement> nodes) {
var fields = new HighlightedSnippets();
foreach (var field in nodes) {
var fieldName = field.Attribute("name").Value;
var snippets = new List<string>();
foreach (var str in field.Elements("str")){
snippets.Add(str.Value);
}
ICollection<string> snippets = field.Elements("str")
.Select(str => str.Value)
.ToList();
if (snippets.Count == 0 && !string.IsNullOrEmpty(field.Value))
snippets = new[] { field.Value };
fields.Add(fieldName, snippets);
}
}
return fields;
}
}
Expand Down
4 changes: 2 additions & 2 deletions Tests.fsx
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ let solrUrl = "http://localhost:8983/solr"
System.Configuration.ConfigurationManager.AppSettings.["solr"] <- solrUrl

let test =
Fuchu.MbUnit.MbUnitTestToFuchu typeof<IntegrationFixture>
|> Test.filter (fun s -> s.Contains "Highlighting")
Fuchu.MbUnit.MbUnitTestToFuchu typeof<SolrQueryResultsParserTests>
//|> Test.filter (fun s -> s.Contains "Highlighting3")
//|> testWithCultures [CultureInfo "en-US"; CultureInfo "fr-FR"]
run test

0 comments on commit f8acef3

Please sign in to comment.