Substring pesquisa no RavenDB
Tenho um conjunto de objetos do tipoIdea
public class Idea
{
public string Title { get; set; }
public string Body { get; set; }
}
Eu quero pesquisar esses objetos por substring. Por exemplo, quando eu tenho um objeto de título "idéi ", Quero que ele seja encontrado quando eu inserir qualquer substring de"idéi ":i, id, ide, idéia, d, de, dea, e, ea, a.
Estou usando o RavenDB para armazenar dados. A consulta de pesquisa é assim:
var ideas = session
.Query<IdeaByBodyOrTitle.IdeaSearchResult, IdeaByBodyOrTitle>()
.Where(x => x.Query.Contains(query))
.As<Idea>()
.ToList();
enquanto o índice é o seguinte:
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()
é um método de extensão que retorna todas as substrings distintas de uma determinada string:
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();
}
}
Isto não está a funcionar. Principalmente porque o RavenDB não está reconhecendoSplitSubstrings()
, porque está na minha montagem personalizada. Como fazer isso funcionar, basicamente como forçar o RavenDB a reconhecer esse método? Além disso, minha abordagem é apropriada para esse tipo de pesquisa (pesquisa por substring)?
EDITA
Basicamente, quero criar o recurso de preenchimento automático nessa pesquisa, por isso precisa ser rápid
Btw: Estou usando o RavenDB - Build # 960