Pregunta

¿Puede usted por favor decirle cómo llevar a cabo la búsqueda de texto simple en RavenDb . La base de datos se almacena documento: Película {Name = "Piratas del Caribe"} . Me gustaría que este documento se encuentra en la frase de búsqueda "Piratas del Caribe" o cualquier otra combinación de palabras.

¿Fue útil?

Solución

Lo que se está preocupando no es nada que ver con el texto completo - por defecto Lucene trabaja en un OR base y lo que quiere es un AND

Si fuera tú lo haría

 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 es necesario el almacenamiento, usted no está solicitando los datos de Lucene directamente en cualquier momento. Usted puede no querer un índice (En realidad, puede que desee FieldIndexing.Analyzed, y puede ser que consiga lejos con sólo el uso de consultas dinámicas aquí)

Hasta que sin embargo.

Otros consejos

Boris, La respuesta de Rob tiene el índice derecho, pero es un poco incómodo para consultas. Puede hacerlo utilizando:

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

Esa voluntad

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

A continuación, la consulta por parte del 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));
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top