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
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.
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
Ça va ... ??? –
@RonnieOverby Et ce fut le moment où il a été mangé par un ours. – ehdv
... travail. <- une estimation. –
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));
Ou searchTerm.Replace (" "" ET"), bien que peut-être vous voudrez peut-être vous méfier des entrées vides et tout ça. –
Est-ce que le texte des marchés/du marché provient d'un copier coller par hasard? –
Oui, j'ai utilisé l'autre question comme exemple –