J'ai un ensemble d'objets de type Idea
recherche Substring dans RavenDB
public class Idea
{
public string Title { get; set; }
public string Body { get; set; }
}
Je veux chercher ce objets par sous-chaîne. Par exemple quand j'ai l'objet du titre "idée", je veux qu'il soit trouvé quand j'entre toute sous-chaîne de "idée": je, id, ide, idée, d, de, dea, e, ea un. J'utilise RavenDB pour stocker des données. La requête de recherche ressemble que:
var ideas = session
.Query<IdeaByBodyOrTitle.IdeaSearchResult, IdeaByBodyOrTitle>()
.Where(x => x.Query.Contains(query))
.As<Idea>()
.ToList();
alors que l'indice suit:
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()
est une méthode d'extension qui retourne sous-chaînes toutes distinctes de chaîne donnée:
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();
}
}
C'est ne fonctionne pas. Particulièrement parce que RavenDB ne reconnaît pas la méthode SplitSubstrings()
, parce qu'elle est dans mon assemblage personnalisé. Comment faire ce travail, essentiellement comment forcer RavenDB à reconnaître cette méthode? De plus, est-ce que mon approche est appropriée pour ce genre de recherche (recherche par sous-chaîne)?
EDIT
Fondamentalement, je veux construire fonctionnalité de remplissage automatique sur cette recherche, il faut être rapide.
BTW: J'utilise RavenDB - Build # 960
Les index RavenDB s'exécutent sur le serveur et n'ont donc pas accès à du code personnalisé comme celui-ci. L'index que vous écrivez est transformé en chaîne, envoyé au serveur et compilé là-bas, le code StringExtension ne va pas avec, d'où l'erreur. –
Je sais que c'est la responsabilité côté serveur, mais est-il possible d'y injecter mon code personnalisé? Peut-être en utilisant la réflexion? – jwaliszko