2015-12-05 132 views
0

我使用RavenDB Embedded 3.0,并有文件Customer及其如下数据:RavenDB 3.0 LIKE查询

ID                                                                名称


客户/ 101                        利奥

客户/ 102    个                   利奥陈

客户/ 103                        李欧梵

客户/ 104                        特殊名称?

我想执行一个SQL像在球场上NameLIKE '%keyword%'检索(关键字可以包含特殊字符,并且不区分大小写),采取以下三种测试情况为例:

  1. 如果关键字Leo(或eoEO),它返回记录customers/101 Leocustomers/102 Leo Chancustomers/103 Leo Lee
  2. 如果关键字是Leo Chan(或Leo Cheo ChEO ch),那么唯一的结果是customers/102 Leo Chan
  3. 如果关键字是?,则只会返回最后一条记录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 
} 

Index: Customers/ByName

回答

0

你不能在标准的IQueryable LINQ中 - Ayende(Raven的创建者)不相信你应该这样做(他称之为“默认安全”)。您需要建立一个自定义的索引和使用,在您的查询:

http://ravendb.net/docs/article-page/3.0/csharp/indexes/querying/searching

查看有关“默认情况下安全”的组成部分,搜索/逃跑。

+0

杰夫您好,感谢您的信息!我同意“默认安全”的概念,但我确实认为我的要求是常见的,从用户的角度来看,它对搜索很有帮助和便利。对于性能问题,我认为慢比没有好,对吧?我已更新我的帖子以包含我用作参考的代码。谢谢! – Leo

+0

我同意你的意见。 – Jeff

0

虽然你可以使用查询,如“FOO”做同样的工作,像,我们会强烈反对这一点。

你想使用全文搜索功能:

http://ravendb.net/docs/article-page/3.0/Csharp/indexes/using-analyzers http://ravendb.net/docs/article-page/3.0/Csharp/client-api/session/querying/how-to-use-search

+0

嗨Ayende,谢谢你的信息,它有助于理解分析仪的行为。但是,我试图使用该文档中列出的KeywordAnalyzer和其他分析器,并试图将该字段更改为NotAnalyzed,但仍无法实现我的目标(上面列出的三个测试用例)。我可否知道是否必须编写自定义分析器才能做到这一点?我很抱歉我对Lucene不熟悉。 – Leo

+0

您需要将该字段标记为已分析,而不是未分析 –