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.
متروك لك رغم ذلك.
نصائح أخرى
بوريس ، إجابة روب لها الفهرس الصحيح ، لكنه محرج بعض الشيء للاستعلام. يمكنك القيام بذلك باستخدام:
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));