我使用RavenDB Embedded 3.0
,并有文件Customer
及其如下数据:RavenDB 3.0 LIKE查询
ID 名称
客户/ 101 利奥
客户/ 102 个 利奥陈
客户/ 103 李欧梵
客户/ 104 特殊名称?
我想执行一个SQL像在球场上Name
LIKE '%keyword%'
检索(关键字可以包含特殊字符,并且不区分大小写),采取以下三种测试情况为例:
- 如果关键字
Leo
(或eo
或EO
),它返回记录customers/101 Leo
,customers/102 Leo Chan
和customers/103 Leo Lee
。 - 如果关键字是
Leo Chan
(或Leo Ch
或eo Ch
或EO ch
),那么唯一的结果是customers/102 Leo Chan
。 - 如果关键字是
?
,则只会返回最后一条记录customers/104 Special Name?
(关键字中的问号?
不会充当我的情况的通配符,它只是要搜索的普通文本)。
如何在RavenDB 3.0中实现上述逻辑?请原谅我,我是RavenDB的新手,对Lucene不熟悉,很高兴提供详细代码供参考。先谢谢了!
EDIT
为了说明问题更清楚,以下示出了我使用的代码,它仅通过测试情况#1在上面列出。
实体和索引:
class Customer {
public string Id { get; set; }
public string Name { get; set; }
}
class Customers_ByName : AbstractIndexCreationTask<Customer> {
public Customers_ByName() {
Map = customers => from customer in customers
select new {
customer.Name
};
Indexes.Add(c => c.Name, FieldIndexing.Analyzed);
}
}
而且搜寻摘要:
var keyword = "Leo Chan";
var query = string.Format("*{0}*", QueryParser.Escape(keyword).Replace(" ", @"\ "));
var list = session.Query<Customer, Customers_ByName>()
.Search(c => c.Name, query, escapeQueryOptions: EscapeQueryOptions.AllowAllWildcards)
.ToList();
Console.WriteLine(list.Count); // 0
和索引定义数据库
from doc in docs.Customers
select new {
Name = doc.Name
}
杰夫您好,感谢您的信息!我同意“默认安全”的概念,但我确实认为我的要求是常见的,从用户的角度来看,它对搜索很有帮助和便利。对于性能问题,我认为慢比没有好,对吧?我已更新我的帖子以包含我用作参考的代码。谢谢! – Leo
我同意你的意见。 – Jeff