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.
質問する
7391 次
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 に答える