RavenDB 3.0 LIKE查询

时间:2015-12-05 15:19:37

标签: ravendb

我正在使用RavenDB Embedded 3.0并拥有文档Customer及其数据如下:

  

ID名称

           

客户/ 101 Leo

     

客户/ 102 Leo Chan

     

客户/ 103 Leo Lee

     

客户/ 104特别名称?

我想在字段LIKE '%keyword%'上执行类似Name搜索的SQL(关键字可以包含特殊字符,不区分大小写),以下面的三个测试用例为例:

  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?(关键字中的问号?将不会作为我的情况的通配符,它​​只是一个要搜索的普通文本)。
  4. 如何在RavenDB 3.0中实现上述逻辑?请原谅我,我是RavenDB的新手,不熟悉Lucene,很感谢提供详细代码供参考。先谢谢!

    修改

    为了更清楚地描述问题,在显示我正在使用的代码之后,它只通过了上面列出的测试用例#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

2 个答案:

答案 0 :(得分:0)

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

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

请参阅“默认安全”和“搜索/转义”部分。

答案 1 :(得分:0)

虽然可以使用&#39; 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