请为我提供有关如何在词典字段中正确进行全文搜索的建议。
我已经索引了所有可翻译字段,如下所示:
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))
我对这个问题的疑问:
最佳答案
您发现了一个错误。我已经使用these unit tests进行了验证,并将其提交给RavenDB issue tracker。
要暂时解决,请使用Lucene查询方法,或者(如您在第二个问题中提到的那样)可以自定义IRavenQueryable的基础DocumentQuery,如下所示:
session.Query<TranTest, TranTestIndex>()
.Customize(x => ((IDocumentQuery<TranTest>) x)
.Search(q => q.Trans["en"], searchTerms))