8

次のような複数のフレーズの1つに一致する結果を取得するためのクエリを作成しています

{
  'size': 10,
  'from': 0,

  'query': {
    'bool': {
      'should': [
        {'text': {'title': { 'query': 'some words' }}},
        {'text': {'title': { 'query': 'other words' }}},
        {'text': {'title': { 'query': 'some other words' }}},
      ]
    }
  }
}

期待どおりに機能しますが、問題があります。スコアが付けられた10個の結果がすべて同じフレーズに一致しています。

私が考えた解決策はshould、たとえば、各句の結果の数を5つの要素に制限することでした。

問題は、Elastic Searchクエリを使用してこれを実装する方法がわからないことです。また、それが可能かどうか、または私が望むことを行う別の方法が存在するかどうかもわかりません。

何か案は ?

ありがとう !

4

1 に答える 1

12

ElasticSearchは、3つのクエリの結合を達成しようとしているときに、クエリに一致する「最も関連性の高い」ドキュメントを探しています。

これを行う最も簡単な(そして最速の)方法は、マルチ検索を使用して3つのクエリを実行することです。

curl -XGET 'http://127.0.0.1:9200/my_index/_msearch?pretty=1'  -d '
{}
{"query" : {"text" : {"title" : "some words"}}, "size" : 5}
{}
{"query" : {"text" : {"title" : "some other words"}}, "size" : 5}
{}
{"query" : {"text" : {"title" : "other words"}}, "size" : 5}
'

要件によっては、制限フィルターを使用することもできますが、インデックスごとではなく、シャードごとの結果の数が制限されることに注意してください。デフォルトでは、インデックスには5つのプライマリシャードがあるため、5の制限を指定すると、25の結果が返される可能性があります。

したがって、おそらく次のようなものです。

curl -XGET 'http://127.0.0.1:9200/_all/_search?pretty=1'  -d '
{
   "query" : {
      "bool" : {
         "should" : [
            {
               "filtered" : {
                  "filter" : {
                     "limit" : {
                        "value" : 1
                     }
                  },
                  "query" : {
                     "text" : {
                        "title" : "some words"
                     }
                  }
               }
            },
            {
               "filtered" : {
                  "filter" : {
                     "limit" : {
                        "value" : 1
                     }
                  },
                  "query" : {
                     "text" : {
                        "title" : "other words"
                     }
                  }
               }
            },
            {
               "filtered" : {
                  "filter" : {
                     "limit" : {
                        "value" : 1
                     }
                  },
                  "query" : {
                     "text" : {
                        "title" : "some other words"
                     }
                  }
               }
            }
         ]
      }
   }
}
'

これにより、各シャードの各フレーズの最高スコアのドキュメントが得られます(5つのシャードで最大15のドキュメント、(指定していないためsize=15)トップ10のドキュメントに削減されます)。

マイレージは、ドキュメントがシャード全体にどのように分散されているかによって異なる場合があります。

于 2012-05-26T08:52:15.537 に答える