Entity Framework Code First et de la Recherche Plein Texte
Je me rends compte que beaucoup de questions ont été posées relatives à la recherche en texte intégral et Entity Framework, mais j'espère que cette question est un peu différente.
Je suis en utilisant Entity Framework Code First et le besoin de faire une recherche plein texte. Quand j'en ai besoin pour effectuer la recherche en texte intégral, je vais généralement avoir d'autres critères/restrictions ainsi - comme ignorer les 500 premières lignes, ou un filtre sur une autre colonne, etc.
Je vois que cela a été gérée à l'aide de fonctions à valeur de table - voir http://sqlblogcasts.com/blogs/simons/archive/2008/12/18/LINQ-to-SQL---Enabling-Fulltext-searching.aspx. Et cela semble être la bonne idée.
Malheureusement, les fonctions à valeur de table ne sont pas pris en charge jusqu'à Entity Framework 5.0 (et même alors, je crois, ils ne sont pas pris en charge pour le Premier Code).
Ma vraie question est de savoir quelles sont les suggestions sur la meilleure façon de gérer cela, à la fois pour Entity Framework 4.3 et Entity Framework 5.0. Mais pour être précis:
-
Autres que SQL dynamique (via
System.Data.Entity.DbSet.SqlQuery
, par exemple), il y a toutes les options disponibles pour l'Entité Cadre 4.3? -
Si j'ai de la mise à niveau de l'Entité Cadre 5.0, est-il une manière que je peux utiliser des fonctions à valeur de table avec le premier code?
Grâce,
Eric
- Comme pour la question (1), je crois que c'est votre seul espoir
- Je suggère d'utiliser Lucene.Net pour la recherche plein texte.
- Jetez un oeil sur Lucene.Net 🙂
- Voir ma question, stackoverflow.com/questions/18746127, et de voter en faveur de ces fonctionnalités dans la prochaine version de EF data.uservoice.com/forums/...
Vous devez vous connecter pour publier un commentaire.
À l'aide de séparateurs introduit dans EF6, vous pouvez marquer la recherche plein texte dans linq et puis le remplacer dans dbcommand comme décrit dans http://www.entityframework.info/Home/FullTextSearch:
Par exemple, si vous avez de la classe de Note avec FTS-champ indexé NoteText:
et EF carte pour il
et contexte:
vous pouvez avoir assez d'une syntaxe simple pour FTS requête:
Qui va générer le SQL comme
Veuillez noter que vous devez utiliser une variable locale et ne peut se déplacer FTS wrapper à l'intérieur de l'expression comme
NoteMap
?john doe
requête de recherche entraînera"Syntax error near 'doe' in the full-text search condition '(john doe)
OnModelCreating
je suppose que c'est réalisable seulement pourCode First
approche. Comment le faire fonctionner avecDatabase First Approach
?contains
" dansRewriteFullTextQuery
fonction de "freetext
" (où c'est l'attributionRegex.Replace
àcmd.CommandText
).J'ai trouvé que la façon la plus simple à mettre en œuvre c'est pour installer et configurer plein de recherche de texte dans SQL Server, puis utiliser une procédure stockée. Passer vos arguments pour SQL, permettre à la DB pour faire son travail et retourne un objet complexe ou de la carte les résultats d'une entité. Vous n'avez pas nécessairement besoin d'avoir le SQL dynamique, mais il peut être optimal. Par exemple, si vous avez besoin de pagination, vous pourriez passer dans PageNumber et PageSize à chaque requête sans la nécessité pour le SQL dynamique. Toutefois, si le nombre d'arguments fluctue par requête, il sera la solution optimale.
Que les autres gars mentionnés, je dirais de commencer à utiliser Lucene.NET
Lucene a une assez haute de la courbe d'apprentissage, mais j'ai trouvé un wrapper pour qu'il appelait "SimpleLucene", qui peut être trouvé sur CodePlex
Permettez-moi de citer un couple de codeblocks, le blog pour vous montrer comment il est facile à utiliser. Je viens de commencer à l'utiliser, mais il a obtenu le coup de lui très vite.
Tout d'abord, obtenir certaines entités à partir de votre référentiel, ou dans votre cas, l'utilisation d'Entity Framework
La prochaine chose que vous voulez faire est de créer un index définition
et de créer un index de recherche pour cela.
Oui, vous avez maintenant une recherche-mesure de l'indice. La seule chose restant à faire est de.., de la recherche! Vous pouvez faire des choses assez étonnantes, mais il peut être aussi facile que cela: (pour plus d'exemples, voir le blog ou de la documentation sur codeplex)
L'exemple ici http://www.entityframework.info/Home/FullTextSearch n'est pas la solution complète. Vous aurez besoin de chercher à comprendre comment le texte intégral des travaux de recherche. Imaginez que vous avez un champ de recherche et que l'utilisateur tape 2 mots pour frapper de recherche. Le code ci-dessus va lever une exception. Vous avez besoin de faire un pré-traitement sur l'expression de recherche est le premier à passer à la requête en utilisant la logique ET ou OU.
par exemple votre phrase de recherche est "bla blah2" ensuite, vous devez le convertir en un:
Solution complète serait:
cette méthode utilise ET la logique de l'opérateur. Vous pourriez passer que comme un argument et l'utilisation de la méthode pour les deux opérateurs ET ou ou.
Vous devez vous échapper aucun des caractères alphanumériques sinon, il serait de jeter l'exception lorsqu'un utilisateur entre des caractères alpha numériques, et vous n'avez pas de serveur de site niveau du modèle de validation en place.
J'ai récemment eu une demande similaire et a fini par écrire un IQueryable extension spécifiquement pour Microsoft index de texte intégral accès, de son sont disponibles ici IQueryableFreeTextExtensions