consulta en lenguaje natural usando ravendb/lucene

Tome una lista de documentos de "zoológico" en ravendb, cada uno de los cuales tiene un campo para el año establecido y un campo para la descripción. La descripción es una cadena que, entre otra información, incluirá muchos de los animales que se pueden ver en ese zoológico.

(1) ¿Cómo puedo tomar el valor de búsqueda de un usuario de "chimpancés Y orangutanes O "grandes simios" NO lémures" y buscar descripciones en zoológicos?

(2) ¿Cómo puedo hacer la misma búsqueda pero para todos los zoológicos establecidos dentro de los 10 años a partir de 1920?

(3) ¿Cómo puedo hacer la siguiente búsqueda de proximidad: "chimpancés orangutanes" ~ 3 Y elefantes.

A los efectos de esta pregunta, no se preocupe por las formas singulares o plurales de los nombres de los animales. Suponga que serán plurales.

EDITAR: esperaría que la siguiente prueba devuelva cero resultados, y en su lugar devuelve dos:

    public void LuceneANDQuery()
    {
        var zoosToCreate = new List<Zoo>
                               {
                                   new Zoo()
                                       {
                                           Description = "We have alligators, orangutans and chimpanzees",
                                           AbbreviatedState = "DC"
                                       },
                                   new Zoo()
                                       {Description = "We have orangutans and elephants", AbbreviatedState = "CA"}
                               };
        using (var session = documentStore.OpenSession())
        {
            zoosToCreate.ForEach(session.Store);
            session.SaveChanges();
            new DescriptionIndex().Execute(documentStore);
            string searchPhrase = @"lizards && orangutans";
            var matchingZoos = session.Advanced.LuceneQuery<Zoo>("DescriptionIndex").Search("Description", searchPhrase).
                WaitForNonStaleResultsAsOfNow().ToList();
            int matchingZoosCount = matchingZoos.Count;
            Assert.AreEqual(matchingZoosCount, 0);
        }
    }

    public class DescriptionIndex : AbstractIndexCreationTask<Zoo>
    {
        public DescriptionIndex()
        {
            Map = zoos => from zoo in zoos
                          select new {zoo.Description};
            Analyzers.Add(z => z.Description, "Lucene.Net.Analysis.Standard.StandardAnalyzer");
            Indexes.Add(z => z.Description, FieldIndexing.Analyzed);
        }
    }

preguntado el 22 de mayo de 12 a las 14:05

1 Respuestas

Balazs, literalmente puedes ejecutar esta consulta. RavenDB usa Lucene bajo la cubierta y expone su consulta hacia afuera. Eso significa que puede ejecutar consultas como esa. Esto se expone en la API mediante Session.Advanced.LuceneQuery.

Una cosa a tener en cuenta es que no admitimos un campo predeterminado, por lo que debe especificar a qué campo se refiere, pero eso es todo.

contestado el 22 de mayo de 12 a las 21:05

Excepto que no puedo conseguir que funcione. Por favor vea mi prueba arriba. Esperaría que devuelva cero resultados, mientras que en su lugar devuelve ambos zoológicos. - balazs

Según la respuesta de Oren en otro lugar: esta no es una búsqueda AND. Esto es: string searchPhrase = @"Descripción:lagartos Y Descripción:orangutanes"; var matchingZoos = session.Advanced.LuceneQuery ("ÍndiceDescripción").Dónde(frase de búsqueda). - balazs

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.