我目前在我們的網站內部創建了一個搜索功能。此功能用於返回符合所有給定條件的相冊。 IE瀏覽器。專輯標題,作曲家等。我對Raven中的全文搜索有所瞭解,我可能不得不嘗試使用它。
我希望儘管我可能會使用單個索引,而只是針對索引進行查詢。 (不幸的是,我現在還不知道爲什麼我應該/不應該這樣做,而不是全文索引,所以我願意提供建議:))
值得注意的事情...專輯是唯一的我們目前在Raven中收集的數據,因爲它是通過從備用系統導入的數據提供給烏鴉的。它可以被認爲是與專輯相關的所有事情的非規範化視圖。
下面是我們專輯的一個例子:
public class Album
{
public string Id { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public List<string> Composers { get; set; }
public List<string> MusicCategories { get; set; }
public List<string> PerformingGroups { get; set; }
public List<string> Instruments { get; set; }
}
下面是我試圖創建索引。標題搜索有效,但當搜索集合中的項目時沒有返回結果。我只能想象它與我沒有對它們進行任何類型的映射/縮減和投影有關。但這只是我的一個猜測。
ravenSessionManager.DocumentStore.DatabaseCommands
.PutIndex("AlbumsBySearchCriteria", new IndexDefinitionBuilder<Album>
{
Map = albums => from a in albums
select
new
{
a.Title,
a.Composers,
a.MusicCategories,
a.Instruments
},
Indexes =
{
{x => x.Title, FieldIndexing.Analyzed},
{x => x.Composers, FieldIndexing.Analyzed},FieldIndexing.Analyzed},
{x => x.MusicCategories, FieldIndexing.Analyzed},FieldIndexing.Analyzed},
{x => x.Instruments, FieldIndexing.Analyzed}
}
});
最後下面是我的查詢的例子:
var query = (from a in _documentSession.Query<Album>("AlbumsBySearchCriteria")
select a);
if(!string.IsNullOrEmpty(criteria.Title))
query = query.Where(a => a.Title.StartsWith(criteria.Title));
if (!string.IsNullOrEmpty(criteria.Composer))
query = query.Where(a => a.Composers.Any(c => c.StartsWith(criteria.Composer)));
return query;
預先感謝任何幫助/指導,你可以提供。任何幫助或建議將非常感激。
我完全是RavenDB和Lucene的新手,但我會預料到這個工作。爲了學習一些關於使用Lucene.NET的知識,我深入研究了RavenDB源代碼,並且我認爲RavenDB會爲您的消費者列表中的每個元素提供一個消費者字段給Lucene。 – 2012-03-19 17:33:05
是啊,我也是:)。奇怪的是,我和這裏的另一位開發人員都會發誓,我們在幾天前就開始工作,因爲我們已經對它進行了宗教測試。現在由於某種原因,它不起作用。根據我們的源代碼控制,沒有做出任何改變:)。我目前正在嘗試Daniel的建議。它正在工作,如果我只爲每個搜索輸入一個標準,但不符合多個標準。我會確保更新,如果我得到它的工作。感謝您查看此和評論。我很感激。 – TheWeekendDeveloper 2012-03-19 18:08:00