2010-11-30 22 views
10

¿Puede indicar cómo realizar búsquedas simples de texto completo en RavenDb. La base de datos está almacenada documento: Película {Name = "Pirates of the Carribean"}. Desearía que este documento se haya encontrado en la frase de búsqueda "Piratas del Caribe" o en cualquier otra combinación de palabras.RavenDB búsqueda de texto completo

Respuesta

12

Lo que se está preocupando no es nada que ver con el texto completo - por defecto Lucene funciona sobre una base O y lo que quiere es una Y

Si yo fuera tú me gustaría hacer

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

y

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

Su índice debe ser algo como

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

No necesita almacenamiento, no está solicitando los datos de lucene directamente en cualquier momento. Puede que incluso no desee un índice (es posible que desee realmente FieldIndexing.Analyzed, y puede escaparse usando solo consultas dinámicas aquí)

Depende de usted.

+0

O searchTerm.Replace (" "" Y"), aunque tal vez es posible que desee desconfiar de las entradas vacías y todo eso. –

+1

¿El mercado/texto de mercado sobra de una copia pegada por casualidad? –

+0

Sí, utilicé la otra pregunta como un ejemplo –

16

Boris, La respuesta de Rob tiene el índice correcto, pero es un poco incómodo para consultar. Usted puede hacer eso usando:

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

que la voluntad

+7

Eso va a ... ??? –

+26

@RonnieOverby Y ese fue el momento en que fue comido por un oso. – ehdv

+2

... trabajo. <- una suposición. –

2

Así es como me acheived un "AND" término de búsqueda.

En primer lugar, asegúrese de que su campo se indexa y se analizó:

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

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

después realizar una consulta desde el cliente:

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)); 
Cuestiones relacionadas