3

辞書フィールドで全文検索を正しく実行する方法について教えてください。

私は次のようにすべての翻訳可能なフィールドにインデックスを付けました:

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();

しかし、私はIRavenQueryableAPIを使用することを好みます。残念ながら、その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を1つのクエリに結合することは可能ですか?
  3. インデックスを作成する別の/より良い方法はありますか?
    • 新しい言語の動的な追加をサポートする必要があります
    • 具体的な言語の検索をサポートする必要があります
    • 検索は複数のフィールドで実行する必要があります
4

1 に答える 1

1

バグを発見しました。これらの単体テストで検証し、RavenDB課題追跡システムに送信しました。

今のところ回避するには、Luceneクエリアプローチを使用するか、(2番目の質問でほのめかしたように)IRavenQueryableの基盤となるDocumentQueryを次のようにカスタマイズできます。

session.Query<TranTest, TranTestIndex>()
       .Customize(x => ((IDocumentQuery<TranTest>) x)
                           .Search(q => q.Trans["en"], searchTerms))
于 2013-01-13T21:31:10.680 に答える