que tiene un conjunto de objetos de tipo Idea
búsqueda de subcadenas en RavenDB
public class Idea
{
public string Title { get; set; }
public string Body { get; set; }
}
Quiero buscar estos objetos por la subcadena. Por ejemplo, cuando tengo el objeto del título "idea", quiero que se encuentre cuando ingrese cualquier subcadena de "idea": i, id, ide, idea, d, de, dea, e, ea , a.
Estoy usando RavenDB para almacenar datos. La consulta de búsqueda se ve así:
var ideas = session
.Query<IdeaByBodyOrTitle.IdeaSearchResult, IdeaByBodyOrTitle>()
.Where(x => x.Query.Contains(query))
.As<Idea>()
.ToList();
mientras que el índice es el siguiente:
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()
es un método de extensión que devuelve todas distintas subseries de determinada cadena:
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();
}
}
Este es no funciona. Particularmente porque RavenDB no reconoce el método SplitSubstrings()
, porque está en mi ensamblaje personalizado. ¿Cómo hacer que esto funcione, básicamente cómo forzar a RavenDB a reconocer este método? Además de eso, ¿es mi enfoque apropiado para este tipo de búsqueda (búsqueda por subcadena)?
EDITAR
Básicamente, quiero construir función de autocompletar en esta búsqueda, por lo que necesita para ser rápido.
Por cierto: estoy usando RavenDB - Build # 960
Los índices de RavenDB se ejecutan en el servidor y, por lo tanto, no tienen acceso a un código personalizado como ese. El índice que escribe se convierte en una cadena, se envía al servidor y se compila allí, el código StringExtension no va con él, de ahí el error. –
Sé que esto es responsabilidad del lado del servidor, pero ¿hay alguna forma de insertar allí mi código personalizado? Tal vez usando el reflejo? – jwaliszko