2016-06-14 28 views
9

Sto utilizzando Sitecore 7.2 con un indice Lucene personalizzato e Linq. Devo dare un peso aggiuntivo (massimo) alle corrispondenze esatte.Frase corrispondente all'API ContentSearch Sitecore

Esempio: un utente cerca "da qualche parte sopra l'arcobaleno"

risultati dovrebbero includere elementi che contengono la parola "arcobaleno", ma gli elementi che contengono il termine esatto e l'intero "da qualche parte sopra l'arcobaleno" dovrebbe essere data peso massimo Visualizzeranno agli utenti i risultati migliori. Ad esempio, un oggetto contenente l'intera frase dovrebbe pesare più pesantemente di un oggetto che contiene la parola "arcobaleno" 100 volte.

Potrei dover gestire la logica di classifica al di fuori dell'API di ContentSearch raccogliendo "corrispondenze di frase" separatamente da "corrispondenze di caratteri jolly", e va bene.

Ecco il mio codice esistente, troncato per brevità. Il codice funziona, ma le corrispondenze esatte delle frasi non sono trattate come ho descritto.

using (var context = ContentSearchManager.GetIndex("sitesearch-index").CreateSearchContext()) 
{ 
    var pred = PredicateBuilder.False<SearchResultItem>(); 
    pred = pred 
     .Or(i => i.Name.Contains(term)).Boost(1) 
     .Or(i => i["Field 1"].Contains(term)).Boost(3) 
     .Or(i => i["Field 2"].Contains(term)).Boost(1); 

    IQueryable<SearchResultItem> query = context.GetQueryable<SearchResultItem>().Where(pred); 
    var hits = query.GetResults().Hits; 
    ... 
} 

Come posso eseguire esatta corrispondenza a frase ed è possibile con l'API Sitecore.ContentSearch.Linq?

+0

Cerca di utilizzare l'utilizzo di PreparedQuery anziché di PredicateBuilder. – Anton

+1

Sembra che PreparedQuery provenga dall'API Sitecore.Search in Sitecore 6, non dall'API ContentSearch in 7. Il mio indice personalizzato corrente è definito in un file di configurazione standalone nel nodo . SearchManager.GetIndex() (utilizzato in v6) non è a conoscenza del mio indice. Sembra che dovrei cambiare tutto per usare l'API v6. Sperando in un'alternativa. – betitall

risposta

0

Rispondendo alla mia domanda. Il problema era con la sintassi della parentesi. Dovrebbe essere

.Or(i => i.Name.Contains(term).Boost(1)) 

piuttosto che

.Or(i => i.Name.Contains(term)).Boost(1) 

non venivano osservate le aumenta.

0

penso che se la seguente risolverà questo:

  • dividere la stringa di ricerca sullo spazio
  • Creare un predicato per ogni split con un valore uguale spinta,
  • Creare un predicato aggiuntivo con la stringa di ricerca completa e con un valore di boost più elevato
  • combinare tutti questi predicati in un predicato "OR".

Inoltre vi consiglio di controllare il seguente:

Sitecore Solr Search Score Value

http://sitecoreinfo.blogspot.com/2015/10/sitecore-solr-search-result-items.html

+0

Questo non funziona come previsto. Ho creato un predicato aggiuntivo con la stringa di ricerca completa e impostato il valore di boost su 30 (30 volte più alto). Quando cerco la frase "insieme di principi guida", i punteggi più alti sono elementi contenenti molte istanze delle parole "set", "impostazioni" e persino "Massachusetts". Gli articoli contenenti l'intera frase sono più in basso. Sto usando .Contains() nei miei predicati, come mostrato sopra. – betitall