2013-06-23 15 views
6

Sto esplorando la nuova API "LINQ to Sitecore" Sitecore.ContentSearch in Sitecore 7. Sono a conoscenza del fatto che Sitecore consiglia di utilizzare la nuova API LINQ sull'API esistente Sitecore.Search, tuttavia, sto facendo fatica a eseguire anche le query più semplici.Come eseguire la ricerca di più termini nell'API ContentSearch di Sitecore 7?

Prendiamo ad esempio la seguente query di ricerca: "hello world".

Utilizzando l'API Sitecore.Search, i termini "ciao mondo" normalmente passano attraverso un QueryParser che risulterebbe in documenti corrispondenti alla parola "ciao" O "mondo". I documenti contenenti entrambi i termini sarebbero valutati più alti di quelli con uno solo.

Come si esegue questa stessa query utilizzando LINQ?

Ecco che cosa ho provato:

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

sono convinto che mi manca qualcosa di veramente semplice. Sicuramente con tutto il lavoro che è andato nella nuova API di ricerca, questo semplice caso d'uso non è stato trascurato ... giusto?

Come soluzione alternativa, ho provato ad aprire il valore predefinito sitecore_web_index utilizzando il SearchManager esistente, tuttavia, questo non funziona.

Sfortunatamente, ho dovuto ricorrere all'API esistente finché non riesco a capirlo. Sarò sicuro di aggiornare questa domanda con le mie conclusioni.

UPDATE 2

ho trovato classe Sitecore.ContentSearch.Utilities.LinqHelper che risolve parzialmente il problema. È possibile utilizzarlo per creare dinamicamente una query simile a uno BooleanQuery in Lucene.Net, tuttavia, le sue opzioni sono limitate e aggiunge un po 'di overhead delle prestazioni.

+0

Questo articolo del blog può aiutare http://www.sitecore.net/Community/Technical-Blogs/Getting-to-Know-Sitecore/Posts/2013/06/Using-Luke-to-Understand-Sitecore- 7-Search.aspx? KeepThis = true & TB_iframe = true & height = 650 & width = 850 – geedubb

+0

@geedubb Grazie per il collegamento! Lo strumento LinqScratchPad sarà sicuramente utile. Detto questo, non riesco ancora a trovare un esempio di una query in stile "OR" o di uno che utilizza qualsiasi tipo di analisi delle query. Mostrano solo come abbinare in base a criteri semplici, come '_templatename ==" X "'. Mentre ciò è utile, sto semplicemente cercando di implementare una ricerca del sito run-of-the-mill a questo punto. –

risposta

21

Tutti i costruttori di predicato che ho provato non ha funzionato, tuttavia, Sitecore 7 viene fornito con uno PredicateBuilder proprio che ha fatto il trucco.

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

Buono a sapersi! :) –

+0

Derek, hai fatto questo con Solr o solo con Lucene? Ottengo errori quando provo a usare il predicato. O con Solr. –

+0

L'ho usato solo con Lucene. –

1

Penso che questo sia correlato a linq non al sitecore.

Non provare questo, ma dare un'occhiata a questo articolo http://www.albahari.com/nutshell/predicatebuilder.aspx

Si può anche guardare a questa documentazione http://sdn.sitecore.net/upload/sitecore7/70/developer's_guide_to_item_buckets_and%20search_sc7-a4.pdf

+1

Grazie mille. Pagina 50 del secondo link ha risposto a tutte le mie domande! –

+0

Sfortunatamente, il PredicateBuilder dal primo collegamento genera un'eccezione: ** Tipo di nodo espressione non supportato: Lambda ** –

Problemi correlati