2017-06-30 2 views
2

Ich verwende Sitecore 8.1 Update 1 mit ContentSearch-Funktion. Ich konfiguriere meinen Index wie folgt:Sitecore Content Search (Lucene) - Zwischen <T>() funktioniert nicht

(Ich will Broker/Client Büro von Breite und Länge suchen)

 <fieldMap type="Sitecore.ContentSearch.FieldMap, Sitecore.ContentSearch"> 
     <fieldNames hint="raw:AddFieldByFieldName"> 

      <field fieldName="latitude"   storageType="NO" indexType="UNTOKENIZED" vectorType="NO" boost="1f" type="System.Decimal" settingType="Sitecore.ContentSearch.LuceneProvider.LuceneSearchFieldConfiguration, Sitecore.ContentSearch.LuceneProvider"> 
      </field> 
      <field fieldName="longitude"   storageType="NO" indexType="UNTOKENIZED" vectorType="NO" boost="1f" type="System.Decimal" settingType="Sitecore.ContentSearch.LuceneProvider.LuceneSearchFieldConfiguration, Sitecore.ContentSearch.LuceneProvider"> 
      </field> 

2)

1) in index.config Ok jetzt verwenden Luke.net Werkzeug seinen Wert

image in Luke.net tool

3) meine SearchResultItem Klasse zu überprüfen:

[IndexField("latitude")] 
    public decimal Latitude { get; set; } 

    [IndexField("longitude")] 
    public decimal Longitude { get; set; } 

4) bei meiner Service-Klasse möchte ich versuchen, zwischen Methode, Breite/Länge in Reichweite zu suchen, aber es funktioniert nicht. Ich versuche gleich (==) Methode und es funktioniert. Ich denke, mein Index ist in Ordnung, aber vielleicht stimmt etwas nicht mit meiner Suchsyntax. Kannst du bitte helfen?

//TODO: Testing ----------------- 
    var query = searchContext.GetQueryable<BrokerSearchIndexItem>(); 

    // IF i use this line (BETWEEN) --> NOT work ?? 
    query = query.Where(item => (item.Latitude.Between(-34, -33, Inclusion.Both) 
            && item.Longitude.Between(149, 151, Inclusion.Both))); 

    // If I use this line (EQUAL) --> work ! 
    //query = query.Where(item => item.Latitude == -33.737643m && item.Longitude == 150.856664m); 

    var searchResult = query.GetResults(); 

5) Ich lese schon dieses Tutorial (link) und meine Suchprotokoll als auch, so scheint es zwischen Methode geben Sie mir Recht log, aber nicht sicher, warum ich nichts

9636 21:10:03 INFO ExecuteQueryAgainstLucene (steadfast_broker_location): +latitude:[-34 TO -33] +longitude:[149 TO 151] - Filter : 
    9636 21:10:03 INFO ExecuteQueryAgainstLucene (steadfast_broker_location): +latitude:[-34 TO -33] +longitude:[149 TO 151] - Filter : 
    9636 21:10:03 INFO ExecuteQueryAgainstLucene (steadfast_broker_location): +latitude:[-34 TO -33] +longitude:[149 TO 151] - Filter : 
+0

Nicht sicher, aber versuchen Sie '-34.000000m' anstatt nur '-34'. Oder als Workaround sollte dies helfen: query = query.Where (item => (item.Latitude> -34.000000m && item.Latitude <-33.000000m) && (item.Longitude> 149.000000m && item.Longitude <151.000000m)) –

Antwort

0

Schauen Sie sich die Lucene Spatial Search Support module

bekommen

Es bieten:

  • New Sitecores Feld "Google Map", dass wi ll speichern lat/long und stellen eine Map-Schnittstelle im Content Editor bereit.
  • Index-Schema-Updates zum Speichern der Lat- und Long-Werte.
  • Updates zu Sitecore ContentSearch, um Methoden für Geospatial-Suchen bereitzustellen.

Es gibt auch eine module for Solr.

+0

Danke Nathan Hase, Aber ich benutze auch Between, um andere Dezimalfeld in Bereich zu suchen, also möchte ich noch diesen Fehler für andere Fälle beheben :) –

+0

OK, versuchen Sie einen Blick auf den räumlichen Quellcode, um zu sehen, was sie machen mit dem Prädikat. Ich bemerke auch, dass das Beispiel "Zwischen" Ganzzahlen verwendet, während das Beispiel "Gleich" Dezimalzahlen verwendet. –

+0

Nochmals vielen Dank, Ich werde versuchen, diesen Modul-Quellcode zu lesen. Über meinen Beispielcode habe ich in der Between-Anweisung mit Dezimalzeichen versucht, aber es funktioniert nicht. In meiner Lösung übergebe ich dezimale Variable, nicht harten Code konstanten Wert –

Verwandte Themen