2013-06-23 5 views
6

Ich erkunde die neue Sitecore.ContentSearch API "LINQ zu Sitecore" in Sitecore 7. Es ist mein Verständnis, dass Sitecore empfiehlt, die neue API LINQ über die vorhandene API Sitecore.Search zu verwenden, jedoch habe ich Mühe, selbst die einfachsten Abfragen auszuführen. B. die folgende Suchanfrage: "hello world".Wie führt man die Suche nach mehreren Begriffen in der ContentSearch-API von Sitecore 7 durch?

Mit der API Sitecore.Search werden die Begriffe "Hallo Welt" normalerweise durch eine QueryParser übergeben, die zu Dokumenten führen würde, die mit dem Wort "Hallo" ODER "Welt" übereinstimmen. Dokumente, die beide Begriffe enthalten, würden höher bewertet als solche mit nur einem.

Wie führt man dieselbe Abfrage mit LINQ aus?

Hier ist, was ich versucht habe:

var results = SearchContext.GetQueryable<MyResultItem>(); 

var terms = searchTerm.Split(' '); 

// Not supported exception 
results = results.Where(r => terms.Any(t => r.Content.Contains(r))); 

// Close, but performs an "AND" between terms, and does not appear 
// to score documents properly 
foreach (var term in terms) 
{ 
    results = results.Where(r => r.Content.Contains(t)); 
} 

UPDATE

Ich bin überzeugt, dass ich etwas wirklich einfach fehle. Sicherlich wurde bei all der Arbeit, die in die neue Such-API einfloss, dieser einfache Anwendungsfall nicht übersehen ... oder?

Als Workaround habe ich versucht, die Standard-sitecore_web_index mit dem vorhandenen SearchManager zu öffnen, jedoch funktioniert dies nicht.

Leider musste ich auf die vorhandene API zurückgreifen, bis ich das herausfinden kann. Ich werde diese Frage mit meinen Ergebnissen aktualisieren.

UPDATE 2

Ich fand die Sitecore.ContentSearch.Utilities.LinqHelper Klasse, die das Problem teilweise gelöst werden. Sie können es verwenden, um dynamisch eine Abfrage zu erstellen, die ähnlich einer in Lucene.Net ist, jedoch sind seine Optionen begrenzt und es fügt ein bisschen Leistungsoverhead hinzu.

+0

Dieser Blogartikel könnte helfen http://www.sitecore.net/Community/Technical-Blogs/Getting-to-Know-Sitecore/Posts/2013/06/Using-Luke-to-Understand-Sitecore- 7-Search.aspx? KeepThis = wahr & TB_iframe = wahr & height = 650 & width = 850 – geedubb

+0

@geedubb Danke für den Link! Das LinqScratchPad-Tool wird definitiv nützlich sein. Trotzdem kann ich immer noch kein Beispiel für eine ODER-Abfrage finden, die irgendeine Art von Abfrageparsing verwendet. Sie zeigen nur anhand einfacher Kriterien, wie zum Beispiel '_templatename ==" X "'. Obwohl das nützlich ist, versuche ich einfach, an dieser Stelle eine gewöhnliche Site-Suche zu implementieren. –

Antwort

21

der Prädikatsbauer Alles, was ich versuchte, nicht funktioniert hat, aber Sitecores 7 Schiffe mit einer PredicateBuilder von sich, die den Trick gemacht hat.

using Sitecore.ContentSearch; 
using Sitecore.ContentSearch.Linq; 
using Sitecore.ContentSearch.SearchTypes; 
using Sitecore.ContentSearch.Utilities; 
// Sitecore 7 (Update 1+): using Sitecore.ContentSearch.Linq.Utilities; 

... 

var index = ContentSearchManager.GetIndex("sitecore_web_index"); 
using (var context = index.CreateSearchContext()) 
{ 
    var predicate = PredicateBuilder.True<SearchResultItem>(); 
    foreach (var t in term.Split(' ')) 
    { 
     var tempTerm = t; 
     predicate = predicate.Or(p => p.Content.Contains(tempTerm)); 
    } 

    var results = context.GetQueryable<SearchResultItem>().Where(predicate).GetResults(); 

    ... 
} 
+0

Gut zu wissen :) –

+0

Derek, hast du das mit Solr oder nur mit Lucene gemacht? Ich bekomme Fehler, wenn ich versuche, das Prädikat zu verwenden. Oder mit Solr. –

+0

Ich habe das nur mit Lucene benutzt. –

1

Ich denke, das ist mit Linq nicht zu Sitecore verwandt.

teste ich das nicht, aber haben einen Blick auf diesen Artikel http://www.albahari.com/nutshell/predicatebuilder.aspx

Sie können an dieser Dokumentation auch einen Blick http://sdn.sitecore.net/upload/sitecore7/70/developer's_guide_to_item_buckets_and%20search_sc7-a4.pdf

+1

Vielen Dank. Seite 50 des zweiten Links beantwortet alle meine Fragen! –

+0

Leider gibt der PredicateBuilder vom ersten Link eine Ausnahme aus: ** Nicht unterstützter Ausdrucksknotentyp: Lambda ** –

Verwandte Themen