您可以在索引存儲場地存儲中存儲每個條的副本,所以是的 - 可以完成。但你應該確保你瞭解這樣做的影響。
正常情況下,當您從烏鴉進行查詢時,索引僅用於確定將哪些文檔發回。文檔本身不是來自索引,而是來自文檔存儲。文檔存儲具有ACID保證 - 這意味着無論索引狀態如何,您都將始終獲得最新的文檔副本。如果您從索引條目或索引字段存儲中進行項目投射,則返回的值與索引本身一樣陳舊。
假設您不斷更新酒吧,並在索引追上最後更新之前進行搜索。你可以找回一個有舊數據的Bar。因此,你需要在數據的潛在陳舊權衡到你的結果,可能使用WaitForNonStaleResultsAsOf...
自定義之一 - 如果你有很多寫事的,這將減緩你的搜索結果返回的速度。
public class Foos_BarsByName
: AbstractIndexCreationTask<Foo, Foos_BarsByName.Result>
{
public class Result
{
public string Name { get; set; }
public Bar Bar { get; set; }
}
public Foos_BarsByName()
{
Map = foos => from foo in foos
from bar in foo.Bars
select new
{
bar.Name,
Bar = bar
};
Index(x => x.Name, FieldIndexing.Analyzed);
Index(x => x.Bar, FieldIndexing.No);
Store(x => x.Bar, FieldStorage.Yes);
}
}
var results = session.Query<Foos_BarsByName.Result, Foos_BarsByName>()
.Customize(x => x.WaitForNonStaleResultsAsOfNow())
.Search(x => x.Name, "roses")
.Select(x => x.Bar);
處理它的另一種方法可能是讓所有的Foos回來,然後在客戶端拉出您感興趣的酒吧。至少這樣,一切都從文檔存儲:
public class Foos_BarsByName
: AbstractIndexCreationTask<Foo, Foos_BarsByName.Result>
{
public class Result
{
public string Name { get; set; }
}
public Foos_BarsByName()
{
Map = foos => from foo in foos
from bar in foo.Bars
select new
{
bar.Name
};
Index(x => x.Name, FieldIndexing.Analyzed);
}
}
var results = session.Query<Foos_BarsByName.Result, Foos_BarsByName>()
.Search(x => x.Name, "roses")
.As<Foo>()
.AsEnumerable()
.SelectMany(x => x.Bars)
.Where(x => x.Name.IndexOf("roses",
StringComparison.CurrentCultureIgnoreCase)
!= -1)
.AsEnumerable()
將迫使LINQ到烏鴉查詢來執行,使得隨後發生的一切LINQ到物體上的客戶端。
當然,如果您正在進行比c#字符串函數更高級的搜索,那麼您將無法採用第二種方法。
我不認爲我需要關心我需要做的陳舊結果。如果用戶等待一小段時間添加/編輯將其添加到搜索結果中,則可以。我會確保顯示通知。 事實證明,我實際上需要構建一個複合結構,其中有一些來自Foo的字段和一些來自Bar的字段,但方法是相同的。你幫了我很多,馬特,我爲此感謝你! –