RavendBフルテキスト検索
-
29-09-2019 - |
質問
単純なフルテキスト検索を実行する方法を教えてください Ravendb. 。データベースにはドキュメントが保存されます。 映画{name = "Pirates of the Carribean"}. 。このドキュメントが、「Pirates Carribean」または他の単語の組み合わせの検索フレーズで見つかったことを願っています。
解決
あなたが心配していることは、全文とは関係ありません - デフォルトではルーセンはまたは根拠に基づいて機能し、あなたが望むのはそして
もし私があなただったら、私はします
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が必要な場合があり、ここで動的クエリを使用するだけで逃げるかもしれません)
でもあなた次第です。
他のヒント
ボリス、ロブの答えには適切なインデックスがありますが、クエリするのは少し厄介です。あなたはそれを使用してそれを行うことができます:
session.Query<Movie, Movie_ByName>()
.Search(x=>x.Name, searchTerms)
.ToList()
それはそうするでしょう
「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));
所属していません StackOverflow