【问题标题】:RavenDB full-text search dictionaries using IRavenQueryable使用 IRavenQueryable 的 RavenDB 全文搜索字典
【发布时间】: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))

我关于这个问题的问题:

  1. 如何使用 IRavenQueryable linq API 在字典字段上创建多词全文搜索查询?
  2. 是否可以将 IRavenQueryable 和 IDocumentQuery 合并为一个查询?
  3. 是否有另一种/更好的方法来创建索引?
    • 它必须支持动态添加新语言
    • 它必须支持对具体语言的搜索
    • 搜索应在多个字段中进行

【问题讨论】:

    标签: linq lucene full-text-search ravendb


    【解决方案1】:

    您发现了一个错误。我已经通过these unit tests 进行了验证,并提交给了RavenDB issue tracker

    要暂时解决问题,请使用 Lucene 查询方法,或者(正如您在第二个问题中提到的那样)您可以自定义 IRavenQueryable 的底层 DocumentQuery,如下所示:

    session.Query<TranTest, TranTestIndex>()
           .Customize(x => ((IDocumentQuery<TranTest>) x)
                               .Search(q => q.Trans["en"], searchTerms))
    

    【讨论】:

      猜你喜欢
      • 2011-05-17
      • 2012-12-19
      • 2015-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多