2010-11-30 8 views
10

Pouvez-vous s'il vous plaît dire comment effectuer une recherche simple de texte intégral dans RavenDb. La base de données est stockée dans le document: Movie {Name = "Pirates des Caraïbes"}. Je souhaite que ce document a été trouvé sur l'expression de recherche "Pirates Carribean" ou toute autre combinaison de mots.RavenDB recherche plein texte

Répondre

12

Ce que vous soucier de ne rien à voir avec le texte intégral - par défaut Lucene fonctionne sur une base OU et ce que vous voulez est un ET

Si je vous, je ferais

String[] terms = searchTerm.Split(" "); // Or whatever the string.split method is 

et

.Where("Name:(" + String.Join(" AND ", terms) + ")"); 

Votre index devrait ressembler à quelque chose comme

public class Movie_ByName : AbstractIndexCreationTask 
{ 
    public override IndexDefinition CreateIndexDefinition() 
    { 
     return new IndexDefinitionBuilder<Movie> 
        { 
         Map = movies => from movie in movies 
             select new { movie.Name, market.Id }, 

         Indexes = 
          { 
           {x => x.Name, FieldIndexing.Analyzed} 
          } 
        } 
      .ToIndexDefinition(DocumentStore.Conventions); 
    } 

Vous n'avez pas besoin de stockage, vous ne demandez pas les données de lucene directement à tout moment. Vous ne voulez peut-être même pas d'index (vous pouvez en fait vouloir FieldIndexing.Analyzed, et peut-être s'en tirer en utilisant simplement des requêtes dynamiques ici)

À vous de voir.

+0

Ou searchTerm.Replace (" "" ET"), bien que peut-être vous voudrez peut-être vous méfier des entrées vides et tout ça. –

+1

Est-ce que le texte des marchés/du marché provient d'un copier coller par hasard? –

+0

Oui, j'ai utilisé l'autre question comme exemple –

16

Boris, La réponse de Rob a le bon index, mais c'est un peu gênant pour l'interrogation. Vous pouvez le faire en utilisant:

session.Query<Movie, Movie_ByName>() 
     .Search(x=>x.Name, searchTerms) 
     .ToList() 

qui

+7

Ça va ... ??? –

+26

@RonnieOverby Et ce fut le moment où il a été mangé par un ours. – ehdv

+2

... travail. <- une estimation. –

2

Voilà comment j'acheived une recherche à long terme "ANDing".

Tout d'abord, assurez-vous que votre champ est indexé et analysé:

public class MyIndex: AbstractIndexCreationTask<MyDocument> 
{ 
    public MyIndex() 
    { 
     Map = docs => from d in docs 
         select new { d.MyTextField }; 

     Index(x => x.MyTextField, FieldIndexing.Analyzed); 
    } 
} 

requête puis du client:

var query = session.Query<MyDocument, MyIndex>(); 

    query = theSearchText 
       .Split(new[] {" "}, StringSplitOptions.RemoveEmptyEntries) 
       .Aggregate(query, (q, term) => 
        q.Search(x => x.MyTextField, term, options: SearchOptions.And));