RavenDB ricerca full-text
-
29-09-2019 - |
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.
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));