6

私は検索エンジンを探し始め、いくつか読んだ後、ElasticSearch を使用することにしました (これは非常に驚くべきことです :))、私のプロジェクトは C# にあるので、クライアントを探して NEST を使い始めました検索部分で少し混乱しました。

特定のタイプのすべてのフィールドを検索したいのですが、思いついたのは次のコードです。

elasticClient.Search<NewType>(s => s.Query(q => q.QueryString(d => d.Query(queryString))));

文字列クエリ検索の多くが非推奨であることがわかり、上記がこれを行う正しい方法であることを確認したかった (上記は非推奨としてマークされていない...) また、単純なタスクには少し長いので、おそらく誰でもこれを行う別の方法を知っています。

ありがとう

4

4 に答える 4

12

文字列クエリ バージョンを使用するだけです。C# 匿名型を使用してクエリ オブジェクトを作成し、JSON にシリアル化します。

そうすれば、この「クエリ DSL」に変換する必要がなく、そこにあるすべての JSON クエリの例から直接的なマッピングを行うことができます。

Elasticsearch 自体は非常に急速に進化しているため、このクエリ DSL にはいくつかの機能が欠けています。

編集:例:

var query = "blabla";
var q = new
        {
            query = new
            {
                text = new
                {
                    _all= query
                }
            }, 
            from = (page-1)*pageSize, 
            size=pageSize
        };
        var qJson = JsonConvert.SerializeObject(q);
        var hits = _elasticClient.Search<SearchItem>(qJson);
于 2012-05-14T11:18:04.087 に答える
5

ただ確認するため

elasticClient.Search<NewType>(s => s.Query(q => q.QueryString(d => d.Query(queryString))));

検索するのに好ましい方法であり、少し長く感じるのは、ここでは使用されていないオプションがたくさんあるためです。短くするための提案はいつでも受け付けています。

文字列のオーバーロードは非推奨ですが、NEST から削除されることはありません。廃止されたメッセージを更新して、これを明示的に言及します。

于 2012-07-04T20:51:30.720 に答える
2

上記の匿名型が気に入らない場合は、json.net の JObjects を使用して、その方法でクエリを作成できます。その後、上記と同じ方法で実行できます。

JObject query = new JObject();
query["query"] = new JObject();
query["query"]["text"] = new JObject();
query["query"]["text"]["_all"] = searchTerm;
query["from"] = start;
query["size"] = maxResults;
string stringQuery = JsonConvert.SerializeObject(query);
var results = connectedClient.SearchRaw<SearchItem>(stringQuery);

ES の DSL は bool などの C# の予約済みキーワードを使用するため、この方法の方が気に入っています。そのため、エスケープを行う必要はありません。

于 2013-08-24T16:57:32.840 に答える