Ho una serie di oggetti di tipo Idea
ricerca Substring in RavenDB
public class Idea
{
public string Title { get; set; }
public string Body { get; set; }
}
voglio cercare questo oggetti da stringa. Per esempio quando ho l'oggetto del titolo "idea", voglio che venga trovato quando inserisco una sottostringa di "idea": i, id, ide, idea, d, de, dea, e, ea , a.
Sto utilizzando RavenDB per la memorizzazione dei dati. La query di ricerca sembra che:
var ideas = session
.Query<IdeaByBodyOrTitle.IdeaSearchResult, IdeaByBodyOrTitle>()
.Where(x => x.Query.Contains(query))
.As<Idea>()
.ToList();
mentre l'indice è la seguente:
public class IdeaByBodyOrTitle : AbstractIndexCreationTask<Idea, IdeaByBodyOrTitle.IdeaSearchResult>
{
public class IdeaSearchResult
{
public string Query;
public Idea Idea;
}
public IdeaByBodyOrTitle()
{
Map = ideas => from idea in ideas
select new
{
Query = new object[] { idea.Title.SplitSubstrings().Concat(idea.Body.SplitSubstrings()).Distinct().ToArray() },
idea
};
Indexes.Add(x => x.Query, FieldIndexing.Analyzed);
}
}
SplitSubstrings()
è un metodo di estensione che restituisce sottostringhe tutto distinte di data stringa:
static class StringExtensions
{
public static string[] SplitSubstrings(this string s)
{
s = s ?? string.Empty;
List<string> substrings = new List<string>();
for (int i = 0; i < s.Length; i++)
{
for (int j = 1; j <= s.Length - i; j++)
{
substrings.Add(s.Substring(i, j));
}
}
return substrings.Select(x => x.Trim()).Where(x => !string.IsNullOrEmpty(x)).Distinct().ToArray();
}
}
Questo è non funziona. Soprattutto perché RavenDB non riconosce il metodo SplitSubstrings()
, perché è nel mio assembly personalizzato. Come fare questo lavoro, in pratica come forzare RavenDB a riconoscere questo metodo? Oltre a ciò, il mio approccio è appropriato per questo tipo di ricerca (ricerca per sottostringa)?
EDIT
Fondamentalmente, voglio costruire funzione di completamento automatico su questa ricerca, quindi hanno bisogno di essere veloce.
Btw: sto usando RavenDB - Costruire # 960
Gli indici RavenDB vengono eseguiti sul server e quindi non hanno accesso a un codice personalizzato del genere. L'indice che scrivi viene trasformato in una stringa, inviato al server e compilato lì, il codice StringExtension non lo accompagna, quindi l'errore. –
So che questa è una responsabilità lato server, ma esiste un modo per inserire il mio codice personalizzato? Forse usando la riflessione? – jwaliszko