6

ドキュメントを検索するとき、最初の 10 個を取得してビューに渡します。ユーザーがリストの最後までスクロールすると、次の 10 個の要素が表示されます。

表示されたドキュメントの最後のドキュメント ID を知っているので、次の 10 を取得する必要があります。基本的には、オフセットを 10 にしてまったく同じ検索を実行しますが、同じクエリで検索できる方がはるかに優れています。最後に取得したドキュメントのドキュメント ID を取得し、その ID を持つドキュメントの後に一致するドキュメントを取得します。

それはelasticsearchで可能ですか?

===更新

現在説明されているだけでは十分に明確ではないように思われるため、私の問題をもう少し指摘したいと思います。そのために残念。

ケース:

一種のフィードがあり、フィードは毎秒成長します。ユーザーがフィードにアクセスすると、最新の 10 エントリが取得され、下にスクロールすると次の 10 エントリが取得されます。

フィードは毎秒成長しているため、通常のオフセット/制限 (elasticsearch の from / size) ではこの問題を解決できません。最初のリクエスト (最初の 10 エントリ) 間の時間に応じて、既に表示されているエントリまたは完全に新しいエントリを表示します。そして次回作のリクエスト。

すでに表示されているエントリの後に次の 10 個の要素を取得する要求は、最後に表示されたエントリの ID をバックエンドに提供します。バックエンドは、この特定のエントリより前のすべてのエントリを無視することを認識しています。

現時点では、これをコードで処理しています。Elasticsearch に一致するすべてのエントリを含むリストを要求し、それを繰り返します。このようにして、必要なことをすべて実行し (驚くことではありません)、全体の必要なチャンクを抽出できます。

私の質問は次のとおりです。elasticsearch にこの問題のソリューションが組み込まれていますか。途中で問題を解決するのは最速ではないからです。

4

4 に答える 4

2

クエリ DSL とページネーション システムを作成するだけです。

{ "サイズ": 10, "から": YOUR_OFFSET }

于 2013-11-08T09:03:15.800 に答える
2

これは古いトピックですが、elasticsearch 5.0 以降で利用できる Search After API がまさに必要なことを行っているように感じます。最後のドキュメントの ID とそのタイムスタンプを入力します。例:

GET twitter/tweet/_search
{
  "size": 10,
  "query": {
    "match": {
      "title": "elasticsearch"
    }
  },
  "search_after": [
    1463538857,
    "tweet#654323"
  ],
  "sort": [
    {
      "date": "asc"
    },
    {
      "_uid": "desc"
    }
  ]
}

ソース: https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-search-after.html

于 2016-12-09T13:24:02.040 に答える
0

これが古いことは知っていますが、同じジレンマに遭遇したので、大声で考えたいと思います。

そのフィードでは、リクエストごとに関連性の低いドキュメントを気にするようになっているようです。意図的にタイムスタンプ/コメント数などを言っているのではありません.ESに関しては、多くの要因によって計算できるスコアについて話し、あなたが望むのは、そのスコアリングの道を検索し続けることです.

私の頭に浮かんだ解決策は次のとおりです。より関連性の高いドキュメントも気にする場合 (Facebook で "X 個の新しい記事が利用可能" と表示されているように)、最初から検索して、最初に遭遇したドキュメント (以前は最も関連性が高かった)、フィードに既に表示されているドキュメントの数に前のドキュメントの数を追加することで、推定オフセットを決定できます (競合状態でいくつかの重複が発生する可能性がありますが、それらを削除するだけです)。

したがって、実際に行う必要があるのは、最初のドキュメントに到達するまで上部を検索し、次に推定下部を検索して、最後のドキュメントよりも関連性の高いものをすべて削除することです。

これはすべて、大量のフィードが変更されないことを前提としています。ドキュメント Y が X と Z の間にある場合、それは永遠にそこにとどまります。

スコアが一定の場合 (これは、フィードが変化し続けるためにスコアが常に上昇することを意味する可能性は低いため)、最後のドキュメントのスコアより下のすべてでフィルタリングすることもできます。

于 2015-11-30T22:06:21.807 に答える