Mam zestaw obiektów typu Idea
wyszukiwania podciągu w RavenDB
public class Idea
{
public string Title { get; set; }
public string Body { get; set; }
}
chcę szukać obiektów przez ten podciąg. Na przykład, gdy mam obiekt o tytule "pomysł", chcę go znaleźć po wprowadzeniu dowolnego podciągu "idea": i, id, ide, idea, d, de, dea, e, ea ,.
Używam RavenDB do przechowywania danych. Wyszukiwane wygląda tak:
var ideas = session
.Query<IdeaByBodyOrTitle.IdeaSearchResult, IdeaByBodyOrTitle>()
.Where(x => x.Query.Contains(query))
.As<Idea>()
.ToList();
podczas gdy indeks jest następujący:
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()
stanowi metodę rozszerzenia, które zwraca wszystkie odrębne podciągi z danym wyrażenie:
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();
}
}
To jest nie działa. Szczególnie, że RavenDB nie rozpoznaje metody SplitSubstrings()
, ponieważ jest w moim niestandardowym zestawie. Jak to działa, w zasadzie jak zmusić RavenDB do rozpoznania tej metody? Poza tym, czy moje podejście jest odpowiednie dla tego rodzaju poszukiwań (wyszukiwanie przez podłańcuch)?
EDIT
Zasadniczo, chcę zbudować funkcję autouzupełniania w tym poszukiwaniu, więc to musi być szybka.
Btw: Używam RavenDB - Budowanie # 960
Indeksy RavenDB działają na serwerze, więc nie mają dostępu do niestandardowego kodu w ten sposób. Indeks, który piszesz zostaje przekształcony w ciąg znaków, wysłany na serwer i skompilowany tam, kod StringExtension nie pasuje do niego, stąd błąd. –
Wiem, że to jest odpowiedzialność po stronie serwera, ale czy istnieje jakiś sposób, aby wprowadzić tam mój niestandardowy kod? Może używając refleksji? – jwaliszko