Ravendb全文搜索
-
29-09-2019 - |
题
您能告诉您如何执行简单的全文搜索 拉文. 。数据库存储的文档: 电影{name =“加勒比海盗”}. 。我希望该文档是在搜索短语“海盗加勒比海”或任何其他单词组合中找到的。
解决方案
您担心的是与全文无关 - 默认情况下,Lucene在或基础上工作,您想要的是一个和
如果我是你会的
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,并且可能只是在此处使用动态查询而摆脱)
虽然取决于你。
其他提示
鲍里斯(Boris),罗布(Rob)的答案具有正确的索引,但查询有点尴尬。您可以使用:
session.Query<Movie, Movie_ByName>()
.Search(x=>x.Name, searchTerms)
.ToList()
那会
这是我如何实现“安宁”术语搜索的方式。
首先,确保对您的字段进行索引和分析:
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