2015-12-05 188 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

您需要將該字段標記爲已分析,而不是未分析 –