【发布时间】:2012-12-27 15:22:54
【问题描述】:
请告诉我如何正确地对字典字段进行全文搜索。
我已经像这样索引了所有可翻译的字段:
public class TranTest
{
public string Id { get; set; }
public IDictionary<string, string> Trans1 { get; set; }
public IDictionary<string, string> Trans2 { get; set; }
//for index queries
public IDictionary<string, string> Trans { get; set; }
}
public class TranTestIndex : AbstractIndexCreationTask<TranTest>
{
public TranTestIndex()
{
Map = docs =>
from doc in docs
select new
{
_ = doc.Trans1.Select(x => CreateField("Trans_" + x.Key, x.Value)),
Trans2 = doc.Trans2.Select(x => CreateField("Trans_" + x.Key, x.Value)),
/* etc. */
};
Index("Trans_en", FieldIndexing.Analyzed);
Index("Trans_fi", FieldIndexing.Analyzed);
/* etc. */
}
}
这个(查询转换为:Trans_en:(term))返回正确的结果:
var luceneQ = session.Advanced.LuceneQuery<TranTest, TranTestIndex>().Search(x => x.Trans["en"], searchTerms).ToList();
但我更喜欢使用 IRavenQueryable API。不幸的是,该 API 中的类似查询会产生 InvalidOperationException:无法理解如何将 'x.Trans.get_Item("en")' 转换为 RavenDB 查询:
var ravenQ = session.Query<TranTest, TranTestIndex>().Search(x => x.Trans["en"], searchTerms);
results = ravenQ.ToList(); //Exception!
这很奇怪,考虑到这完美无缺(翻译为:Trans_en:"term*"):
session.Query<TranTest, TranTestIndex>().Where(x => x.Trans["en"].StartsWith(searchTerms))
我关于这个问题的问题:
- 如何使用 IRavenQueryable linq API 在字典字段上创建多词全文搜索查询?
- 是否可以将 IRavenQueryable 和 IDocumentQuery 合并为一个查询?
- 是否有另一种/更好的方法来创建索引?
- 它必须支持动态添加新语言
- 它必须支持对具体语言的搜索
- 搜索应在多个字段中进行
【问题讨论】:
标签: linq lucene full-text-search ravendb