RavenDB全文搜索

时间:2010-11-30 14:00:52

标签: search ravendb full-text-search

您能告诉我们如何在 RavenDb 中执行简单的全文搜索。数据库存储文档:电影{Name =“加勒比海盗”} 。我希望在搜索短语“Pirates Carribean”或任何其他单词组合中找到此文档。

3 个答案:

答案 0 :(得分:16)

鲍里斯 Rob的答案有正确的索引,但查询有点尴尬。您可以使用以下方式执行此操作:

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

那将

答案 1 :(得分:12)

你担心的是与全文无关 - 默认情况下,Lucene以OR为基础,你想要的是一个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 :(得分:2)

以下是我如何实现“终结”术语搜索。

首先,确保您的字段已编入索引并进行分析:

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