Question

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

Était-ce utile?

La solution

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 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 doit 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 demande pas les données de Lucene directement à tout moment. Vous pourriez ne pas vouloir même un index (vous pouvez réellement vouloir FieldIndexing.Analyzed, et peut-être sortir avec juste l'aide de requêtes dynamiques ici)

Jusqu'à vous cependant.

Autres conseils

Boris, La réponse de Rob a l'index droit, mais il est un peu gênant pour effectuer des requêtes. Vous pouvez le faire en utilisant:

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

Cette volonté

Voici 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);
    }
}

Ensuite, la requête 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));
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top