您可以使用以下方法跨多个字段执行子字符串搜索:
( 1 )
public class IdeaByBodyOrTitle : AbstractIndexCreationTask<Idea>
{
public IdeaByBodyOrTitle()
{
Map = ideas => from idea in ideas
select new
{
idea.Title,
idea.Body
};
}
}
on 这个网站 http://ravendb.net/docs/client-api/querying/static-indexes/configuring-index-options你可以检查一下:
“默认情况下,RavenDB 使用名为
适用于所有内容的 LowerCaseKeywordAnalyzer。 (...) 默认值
每个字段是 Stores 中的 FieldStorage.No 和 FieldIndexing.Default 中的
索引。”
因此,默认情况下,如果您检查 raven 客户端内的索引术语,它看起来如下:
Title Body
------------------ -----------------
"the idea title 1" "the idea body 1"
"the idea title 2" "the idea body 2"
在此基础上,可以构造通配符查询:
var wildquery = string.Format("*{0}*", QueryParser.Escape(query));
然后与使用.In
and .Where
结构(内部使用 OR 运算符):
var ideas = session.Query<User, UsersByDistinctiveMarks>()
.Where(x => x.Title.In(wildquery) || x.Body.In(wildquery));
( 2 )
或者,您可以使用纯 lucene 查询:
var ideas = session.Advanced.LuceneQuery<Idea, IdeaByBodyOrTitle>()
.Where("(Title:" + wildquery + " OR Body:" + wildquery + ")");
( 3 )
您还可以使用.Search
表达式,但如果您想跨多个字段进行搜索,则必须以不同的方式构建索引:
public class IdeaByBodyOrTitle : AbstractIndexCreationTask<Idea, IdeaByBodyOrTitle.IdeaSearchResult>
{
public class IdeaSearchResult
{
public string Query;
public Idea Idea;
}
public IdeaByBodyOrTitle()
{
Map = ideas => from idea in ideas
select new
{
Query = new object[] { idea.Title, idea.Body },
idea
};
}
}
var result = session.Query<IdeaByBodyOrTitle.IdeaSearchResult, IdeaByBodyOrTitle>()
.Search(x => x.Query, wildquery,
escapeQueryOptions: EscapeQueryOptions.AllowAllWildcards,
options: SearchOptions.And)
.As<Idea>();
summary:
还要记住*term*
相当昂贵,尤其是前导通配符。在这个post http://daniellang.net/searching-on-string-properties-in-ravendb/你可以找到更多相关信息。据说,前导通配符会强制 lucene 对索引进行全面扫描,从而大大降低查询性能。 Lucene 在内部存储按字母顺序排序的索引(实际上是字符串字段的术语)并从左到右“读取”。这就是为什么搜索尾随通配符很快而搜索前导通配符很慢的原因。
所以或者x.Title.StartsWith("something")
可以使用,但这显然不会搜索所有子字符串。如果您需要快速搜索,您可以更改要分析的搜索字段的“索引”选项,但它不会再次搜索所有子字符串。
如果有一个子字符串查询内的空格键,请检查这个question https://stackoverflow.com/questions/12298468/search-by-substring-with-spacebar-in-ravendb以获得可能的解决方案。
如需提出建议,请检查http://architects.dzone.com/articles/how-do-suggestions-ravendb http://architects.dzone.com/articles/how-do-suggestions-ravendb.