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.

War es hilfreich?

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));
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top