Полнотекстовый поиск RavenDB

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


person Boris Mitchenko    schedule 30.11.2010    source источник


Ответы (3)


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

Если бы я был тобой, я бы сделал

 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, и вы можете просто использовать здесь динамические запросы)

Впрочем, решать вам.

person Rob Ashton    schedule 01.12.2010
comment
Или searchTerm.Replace( , AND ), хотя, возможно, вам следует опасаться пустых записей и всего такого. - person Rob Ashton; 01.12.2010
comment
Рынки/рыночный текст случайно не остался от копипаст? - person Adam Cooper; 01.12.2010
comment
Да, я использовал другой вопрос в качестве примера - person Rob Ashton; 02.12.2010
comment
Откуда взялась переменная фильмов? - person Christophe Debove; 07.11.2012

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

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

Что будет

person Ayende Rahien    schedule 27.11.2011
comment
@RonnieOverby И в этот момент его съел медведь. - person ehdv; 15.03.2012

Вот как я добился поиска по термину «И».

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

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));
person Ronnie Overby    schedule 22.12.2012