RavenDB полнотекстовый поиск - PullRequest
10 голосов
/ 30 ноября 2010

Подскажите, пожалуйста, как выполнить простой полнотекстовый поиск в RavenDb .В базе данных хранится документ: Movie {Name = "Пираты Карибского моря"} .Я хотел бы, чтобы этот документ был найден в поисковой фразе "Пираты Карибского моря" или в любой другой комбинации слов.

Ответы [ 3 ]

16 голосов
/ 27 ноября 2011

Борис, у ответа Роба правильный индекс, но это немного неудобно для запроса.Вы можете сделать это, используя:

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

Это будет

12 голосов
/ 01 декабря 2010

То, что вас беспокоит, не имеет ничего общего с полным текстом - по умолчанию Lucene работает на основе ИЛИ, и вам нужно AND

На твоем месте я бы сделал

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

и

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

Ваш индекс должен выглядеть примерно так:

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

Вам не нужно хранилище, вы не запрашиваете данные непосредственно у lucene в любое время. Возможно, вы даже не захотите индексировать (вы можете на самом деле захотеть FieldIndexing.Analyzed, и можете просто использовать здесь динамические запросы)

Впрочем, до вас.

2 голосов
/ 22 декабря 2012

Вот как я нашел термин «ANDing».

Сначала убедитесь, что ваше поле проиндексировано и проанализировано:

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

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

Затем запрос от клиента:

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