10

Can you please tell how to perform simple full-text search in RavenDb. The database is stored document: Movie {Name = "Pirates of the Carribean"}. I wish that this document was found on the search phrase "Pirates Carribean" or any other combination of words.

4

3 に答える 3

16

ボリス、ロブの答えには正しいインデックスがありますが、クエリには少し厄介です。次を使用してそれを行うことができます。

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

それは

于 2011-11-27T06:55:28.917 に答える
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 が必要な場合があり、ここでは動的クエリを使用するだけで済む場合があります)。

あなた次第ですが。

于 2010-12-01T10:09:00.003 に答える
2

これが、「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));
于 2012-12-22T03:39:48.127 に答える