【发布时间】:2012-04-01 04:48:36
【问题描述】:
我有一组 Idea 类型的对象
public class Idea
{
public string Title { get; set; }
public string Body { get; set; }
}
我想通过子字符串搜索这些对象。例如,当我有标题“idea”的对象时,我希望在输入“idea”的任何子字符串时找到它:i, id, ide , 想法, d, de, dea, e, ea, a.
我正在使用 RavenDB 来存储数据。搜索查询如下所示:
var ideas = session
.Query<IdeaByBodyOrTitle.IdeaSearchResult, IdeaByBodyOrTitle>()
.Where(x => x.Query.Contains(query))
.As<Idea>()
.ToList();
当索引跟随时:
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.SplitSubstrings().Concat(idea.Body.SplitSubstrings()).Distinct().ToArray() },
idea
};
Indexes.Add(x => x.Query, FieldIndexing.Analyzed);
}
}
SplitSubstrings() 是一种扩展方法,它返回给定字符串的所有不同子字符串:
static class StringExtensions
{
public static string[] SplitSubstrings(this string s)
{
s = s ?? string.Empty;
List<string> substrings = new List<string>();
for (int i = 0; i < s.Length; i++)
{
for (int j = 1; j <= s.Length - i; j++)
{
substrings.Add(s.Substring(i, j));
}
}
return substrings.Select(x => x.Trim()).Where(x => !string.IsNullOrEmpty(x)).Distinct().ToArray();
}
}
这不起作用。特别是因为 RavenDB 无法识别 SplitSubstrings() 方法,因为它在我的自定义程序集中。如何使这项工作,基本上如何强制 RavenDB 识别这种方法?除此之外,我的方法是否适合这种搜索(按子字符串搜索)?
编辑
基本上,我想在这个搜索上构建自动完成功能,所以它需要很快。
顺便说一句:我正在使用 RavenDB - Build #960
【问题讨论】:
-
RavenDB 索引在服务器上运行,因此无法访问这样的自定义代码。您编写的索引变成了一个字符串,发送到服务器并在那里编译,StringExtension 代码不随之而来,因此出现错误。
-
我知道这是服务器端的责任,但是有没有办法将我的自定义代码注入那里?也许使用反射?
标签: c# .net search substring ravendb