gpt4 book ai didi

linq - 使用 IRavenQueryable 的 RavenDB 全文搜索字典

转载 作者:行者123 更新时间:2023-12-01 14:59:34 24 4
gpt4 key购买 nike

请告诉我如何正确地在字典字段上进行全文搜索。

我已经像这样索引了所有可翻译的字段:

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. 是否有另一种/更好的方法来创建索引?
    • 它必须支持动态添加新语言
    • 它必须支持对具体语言的搜索
    • 应该在多个领域进行搜索

最佳答案

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

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

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

关于linq - 使用 IRavenQueryable 的 RavenDB 全文搜索字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14305366/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com