Domanda

Può per favore dire come effettuare semplice ricerca full-text in RavenDB . Il database viene memorizzato documento: Film {Name = "Pirati dei Caraibi"} . Mi auguro che questo documento è stato trovato sulla frase di ricerca "Pirati dei Caraibi" o qualsiasi altra combinazione di parole.

È stato utile?

Soluzione

Cosa siete preoccuparsi non è nulla a che fare con il testo integrale - di default Lucene funziona su una o su base e ciò che si vuole è un AND

Se fossi in te farei

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

e

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

L'indice dovrebbe essere simile a

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

Non hai bisogno di stoccaggio, non si sta richiedendo i dati Lucene direttamente in qualsiasi momento. Non si potrebbe desiderare nemmeno un indice (si potrebbe effettivamente desidera FieldIndexing.Analyzed, e potrebbe ottenere solo con utilizzando query dinamiche qui)

Fino a voi però.

Altri suggerimenti

Boris, La risposta di Rob ha l'indice destro, ma è un po 'imbarazzante per l'esecuzione di query. È possibile farlo usando:

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

Questa volontà

Ecco come ho acheived un "AND" termine di ricerca.

Per prima cosa, assicurarsi che il campo è indicizzato ed analizzato:

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

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

Poi query dal 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));
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top