RavenDB Volltextsuche
-
29-09-2019 - |
Frage
Können Sie mir bitte sagen, wie einfache Volltextsuche durchzuführen, in RavenDB . Die Datenbank wird Dokument gespeichert: Film {Name = "Fluch der Karibik"} . Ich wünsche, dass dieses Dokument auf dem Suchbegriff „Piraten der Karibik“ oder jede andere Kombination von Wörtern gefunden wurde.
Lösung
Was Sie sich Gedanken über alles andere nicht mit vollem Text zu tun - standardmäßig arbeitet Lucene auf eine OR-Basis und was Sie wollen, ist ein AND
Wenn ich Sie wäre, würde ich tun
String[] terms = searchTerm.Split(" "); // Or whatever the string.split method is
und
.Where("Name:(" + String.Join(" AND ", terms) + ")");
Ihr Index aussehen sollte etwas
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);
}
Sie Lagerung nicht benötigen, Sie anfordern nicht die Daten von lucene jederzeit direkt. Sie werden vielleicht nicht wollen sogar einen Index (Vielleicht möchten Sie tatsächlich FieldIndexing.Analyzed und könnte mit nur mit dynamischen Abfragen hier wegkommen)
Bis zu Ihnen though.
Andere Tipps
Boris, Robs Antwort hat das Recht, Index, aber es ist ein wenig umständlich für anfragende. Sie können tun, dass mit:
session.Query<Movie, Movie_ByName>()
.Search(x=>x.Name, searchTerms)
.ToList()
Das wird
Hier ist, wie ich acheived eine "Verknüpfung" Begriff suchen.
Stellen Sie zunächst sicher, dass Ihr Feld indiziert und analysiert wird:
public class MyIndex: AbstractIndexCreationTask<MyDocument>
{
public MyIndex()
{
Map = docs => from d in docs
select new { d.MyTextField };
Index(x => x.MyTextField, FieldIndexing.Analyzed);
}
}
Dann Abfrage von dem 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));